我有一个java程序,可以在启动时启动程序。这可以是任何可执行文件。问题是java应用程序在聚焦时应用了几个输入到任何正在运行的应用程序(应用程序执行键盘输入/输出) 有人告诉我,不可能直接从Java调用这个调用来查看哪个程序是关注的。所以我无法检查所需的应用程序是否重点关注。 像
if(processName == launchedExeName) // Do code
我可以在我的java项目中实现任何工具或库吗?
感谢,
Sidar
答案 0 :(得分:2)
如果没有一些本机调用,您将无法直接从java中执行此操作。有些图书馆可能已经为你做了,但我不知道。所以你必须自己编写 - 这显然完全取决于操作系统。
对于Windows来说它相对简单(并且afaik有一些用于win32 api的JNI包装器,所以你不必自己做,也许可以看一下),我实际上不得不写一些类似的东西,所以这里是基本版本(为简单起见,没有错误检查):
HWND hForeground = GetForegroundWindow();
DWORD pid;
GetWindowThreadProcessId(hForeground, &pid);
HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pid);
我们现在拥有流程的句柄,您可以随心所欲地做任何事情。如果你想要进程的路径,这将是:
DWORD size = MAX_PATH;
TCHAR pathName[MAX_PATH];
QueryFullProcessImageName(hProc, /*win32 path format*/ 0, pathName, &size);
实际上是微不足道的(虽然如果你想在前台改变的时候接收事件,它会变得更复杂),只是错误处理会像往常一样打乱代码。
正如我所说,我记得在Java中阅读过一些Win32包装器,所以你可能不必自己编写JNI / JNA的东西。在这里不知道* nix。