Próbuję uaktualnić moją aplikację w Javie, aby działała tylko wtedy, gdy aktywne jest okno procesu o określonej nazwie. Dowiedziałem się, że jest to możliwe przy użyciu JNI, ale nie mam pojęcia, jak dokładnie to zrobić. Po prostu nie mogłem znaleźć żadnego opisu ani przykładu, który by to tłumaczył. Moje pytanie brzmi: jak uzyskać nazwę procesu aktualnie aktywnego okna w systemie Windows (przez JNI lub cokolwiek innego - akceptuję każde inne rozwiązanie)?Uzyskiwanie aktywnych informacji o oknie w Javie
28
A
Odpowiedz
51
Zaoszczędź sobie trochę bólu i użyj JNA. Będziesz musiał downloadjna.jar i jna-platform.jar dla Win32 API. Wiki pinvoke i MSDN są przydatne do znajdowania właściwych wywołań systemowych.
W każdym razie tutaj jest kod do wydrukowania tytułu i procesu aktualnie aktywnego okna.
import static enumeration.EnumerateWindows.Kernel32.*;
import static enumeration.EnumerateWindows.Psapi.*;
import static enumeration.EnumerateWindows.User32DLL.*;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.ptr.PointerByReference;
public class EnumerateWindows {
private static final int MAX_TITLE_LENGTH = 1024;
public static void main(String[] args) throws Exception {
char[] buffer = new char[MAX_TITLE_LENGTH * 2];
GetWindowTextW(GetForegroundWindow(), buffer, MAX_TITLE_LENGTH);
System.out.println("Active window title: " + Native.toString(buffer));
PointerByReference pointer = new PointerByReference();
GetWindowThreadProcessId(GetForegroundWindow(), pointer);
Pointer process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pointer.getValue());
GetModuleBaseNameW(process, null, buffer, MAX_TITLE_LENGTH);
System.out.println("Active window process: " + Native.toString(buffer));
}
static class Psapi {
static { Native.register("psapi"); }
public static native int GetModuleBaseNameW(Pointer hProcess, Pointer hmodule, char[] lpBaseName, int size);
}
static class Kernel32 {
static { Native.register("kernel32"); }
public static int PROCESS_QUERY_INFORMATION = 0x0400;
public static int PROCESS_VM_READ = 0x0010;
public static native int GetLastError();
public static native Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, Pointer pointer);
}
static class User32DLL {
static { Native.register("user32"); }
public static native int GetWindowThreadProcessId(HWND hWnd, PointerByReference pref);
public static native HWND GetForegroundWindow();
public static native int GetWindowTextW(HWND hWnd, char[] lpString, int nMaxCount);
}
}
5
Ten kod działa z JNA 4,0
import com.sun.jna.Native;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.RECT;
// see http://java-native-access.github.io/jna/4.0/javadoc/
public class EnumerateWindows {
private static final int MAX_TITLE_LENGTH = 1024;
public static void main(String[] args) throws Exception {
char[] buffer = new char[MAX_TITLE_LENGTH * 2];
HWND hwnd = User32.INSTANCE.GetForegroundWindow();
User32.INSTANCE.GetWindowText(hwnd, buffer, MAX_TITLE_LENGTH);
System.out.println("Active window title: " + Native.toString(buffer));
RECT rect = new RECT();
User32.INSTANCE.GetWindowRect(hwnd, rect);
System.out.println("rect = " + rect);
}
}
+0
Tylko dla okien – Martin
Powiązane problemy
- 1. Uzyskiwanie informacji o obiekcie Startup.cs
- 2. uzyskiwanie informacji o zależnościach maven
- 3. Uzyskiwanie aktywnych flag w systemie Android Okno
- 4. Uzyskiwanie informacji o FFProbe z Pythonem
- 5. Uzyskiwanie informacji o uwierzytelnianiu SSL z Heroku
- 6. Uzyskiwanie informacji o wierszu po dwukliknięciu
- 7. Uzyskiwanie informacji o sieci w Javie na platformach Windows i Linux
- 8. Uzyskiwanie informacji o kolumnie w cx_oracle, gdy tabela jest pusta?
- 9. Uzyskiwanie informacji o wieży telefonicznej w aplikacji na iOS?
- 10. Uzyskiwanie informacji procesor w Pythonie
- 11. Uzyskiwanie informacji o uname ze skompresowanego obrazu jądra
- 12. Interfejs API facebook graph - uzyskiwanie informacji o ścianach
- 13. Uzyskiwanie informacji o użytkownikach z Facebook za pomocą wykresu API
- 14. Uzyskiwanie dostępu do informacji o iPhone WiFi za pośrednictwem SDK
- 15. Uzyskiwanie informacji o nagłówku za pomocą RXJava i Retrofit
- 16. Uzyskiwanie użytkownika Tomcat w Javie
- 17. Uzyskiwanie dostępu do informacji o schemacie bazy danych z Groovy
- 18. Uzyskiwanie informacji od użytkownika w Lua
- 19. Uzyskiwanie więcej informacji z Rprof()
- 20. Jak wydrukować tabelę informacji w Javie
- 21. Uzyskiwanie hierarchii klas w Javie?
- 22. Uzyskiwanie obrazu Mathematica w Javie
- 23. Uzyskiwanie informacji EPG z DVB-T
- 24. Uzyskiwanie informacji z Facebook wewnątrz PhoneGap Budowanie
- 25. Czytanie informacji o certyfikacie pkcs12
- 26. Parse.com - odświeżanie informacji o użytkowniku
- 27. Mercurial - wyświetlanie informacji o użytkownikach
- 28. Uzyskiwanie informacji na żywo z/dev/input
- 29. Uzyskiwanie informacji debugowania Django podczas korzystania z połączenia Ajax?
- 30. Uzyskiwanie informacji traceback z IronPython wyjątkami
JNA ([Java Native Dostęp] (http://jna.java.net/)) jest łatwiejszy w użyciu niż JNI, ale dla jednego z je, JNI lub JNA, musisz nauczyć się, jak z nich korzystać, korzystając z ich samouczków i odnośników, a następnie musisz przejrzeć interfejs API okna, aby uzyskać prawidłowe wywołanie funkcji. Tu nie ma skrótów. –