Nie powinno to być trudne pod Windows.
Potrzebujesz kawałka w C [najprościej w C pisać], który użyje funkcji WinAPI getFocus(), która zwróci Ci uchwyt do okna które ma focusa, teraz prosząc o klasę tego okna przy pomocy GetClassName, teraz jeżeli nazwa klasy to jeśli dobrze pamiętam EditBox to masz właśnie pole tekstowe.
Ten kod w C robisz JNA'owym albo JNI'owym i powinno działać.
Jak lubisz możesz te funkcje wołać przez JNA, wtedy nie potrzebujesz żadnego kawałka w C.
Inna sprawa po co Ci to ;-) Bo możliwe, że da się to zrobić o wiele prościej.
Wszystko w pętli, która co powiedzmy 100 ms woła to getFocus()
[Późniejszy Edit ;-)]
Nie jest to aż tak proste, bo getFocus() zwraca null, dlatego trzeba użyć GetGUIThreadInfo() a tutaj mam problemy bo coś w parametrach mieszam.
Na razie mój kod wygląda tak, może Ci to coś pomoże (klasa zowie się JNAToster), teoria mówi, że jeżeli dobrze się wszystko woła to w lpgui.hwndFocus powinien być uchwyt do okna, która ma focus:
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;
public class JNAToster {
public interface Kernel32 extends StdCallLibrary {
int GetLastError();
}
public static class RECT extends Structure {
long left;
long top;
long right;
long bottom;
}
public static class GUITHREADINFO extends Structure {
public int cbSize = size();
public int flags;
Pointer hwndActive;
Pointer hwndFocus;
Pointer hwndCapture;
Pointer hwndMenuOwner;
Pointer hwndMoveSize;
Pointer hwndCaret;
RECT rcCaret;
}
public interface User32 extends StdCallLibrary {
Pointer GetFocus();
boolean GetGUIThreadInfo(Pointer idThread, GUITHREADINFO lpgui);
Pointer GetForegroundWindow();
int GetWindowThreadProcessId(
Pointer hWnd,
Pointer lpdwProcessId
);
}
public static void main(String[] args) {
User32 user32 = (User32)Native.loadLibrary("user32", User32.class);
Kernel32 kernel32 = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class);
while (1==1) {
GUITHREADINFO lpgui = new GUITHREADINFO();
int id = user32.GetWindowThreadProcessId(user32.GetForegroundWindow(), null);
System.out.println(id);
lpgui.cbSize=lpgui.size();
user32.GetGUIThreadInfo(null, lpgui);
System.out.println("err="+kernel32.GetLastError());
System.out.println(lpgui.hwndFocus);
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
}
}