我想监视操作系统级程序前台更改,但我无法统一返回的应用程序。
我使用SetWinEventHook
,EVENT_SYSTEM_FOREGROUND
和WinEventProc
回调的组合来获取前景更改事件。我可以检查顶级hwnd
,窗口标题,路径和关联的PID
。这很有效。
hwnd = GetAncestor(hwnd, GA_ROOTOWNER);
GetWindowText(hwnd, text, 1024);
GetWindowModuleFileName(hwnd, moduleFileName, 1024);
pid = GetWindowThreadProcessId(hwnd, pointer);
示例输出:
pid=2676, text=Calculator, moduleFileName=Calculator
pid=3460, text=Calculator, moduleFileName=Calculator
pid=2676, text=Calculator, moduleFileName=Calculator
pid=1128, text=EditPad Pro 7 - [*Untitled 1], moduleFileName=D:\Program Files\java\jre7\bin\javaw.exe
pid=3460, text=Calculator, moduleFileName=Calculator
pid=1128, text=EditPad Pro 7 - [*Untitled 2], moduleFileName=D:\Program Files\java\jre7\bin\javaw.exe
现在出现了问题。
如果我打开两个Calculator实例,它们会有不同的PID
值,所以这个值(值本身,而不是指针!)对我来说是没用的。
窗口的标题取决于应用程序的状态(上面是在EditPad中打开的文档),因此这也是无用的。 (某些应用程序将文档放在标题前面,因此在一般情况下,模式匹配不会解决此问题)
路径也没用,因为同一个应用程序的多个副本可以从磁盘上的不同位置运行,并且可执行文件也可以重命名。我需要所有这些案例来提出相同的应用程序。而且,所有Java应用程序(如EditPad)都指向JVM。
我可以用PID做些什么,比如获取应用程序和公司名称,如Procecss Explorer中的描述和公司名称列下所示?那将是完美的。