如何从HWND或PID确定唯一的应用程序?

时间:2014-09-21 13:08:40

标签: hook pid msdn user32 kernel32

我想监视操作系统级程序前台更改,但我无法统一返回的应用程序。

我使用SetWinEventHookEVENT_SYSTEM_FOREGROUNDWinEventProc回调的组合来获取前景更改事件。我可以检查顶级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中的描述和公司名称列下所示?那将是完美的。

enter image description here

0 个答案:

没有答案
相关问题