我的任务是尝试监视从初始程序中生成的所有GUI程序中的活动,并在它们在一段时间内变为非活动状态时将其杀死。这不是系统活动,因为我们必须关闭程序,即使用户暂时只使用其他程序(不是由初始程序产生)。应用程序生成过程是一个.Net程序,不会改变。我能够使用SetWindowsHookEx
从.Net设置低级别挂钩(WH_KEYBOARD_LL
和WH_MOUSE_LL
),但不确定如何将消息与我开始的进程相关联(使用{ {1}}。)我可以挂钩应用程序执行挂钩的事件,但是当我尝试挂钩到生成程序的特定线程时,它总是会失败。
我最接近的是创建一个代表.Net程序调用{{1}}的C ++ dll。使用此方法,我可以挂钩到生成的notepad.exe的第一个线程,但永远不会调用回调函数。如果我指定线程id为0,则在原始应用程序中存在活动时调用回调,因此我知道System.Diagnostics.Process
在这种情况下有效。
我还没有完全理解挂钩,但是根据我的读法,这将无法工作,因为dll回调函数地址对于挂钩的进程毫无意义。这是我遇到的问题吗?如果是这样,有没有办法解决这个问题,或者有人可以建议另一种方法来确定是否正在积极使用衍生过程?
.Net(C#)代码:
SetWindowsHookEx
C ++ dll:
SetWindowsHookEx
目前所有这些都是在32位Windows XP计算机上完成的。我知道需要一个单独的64位dll来处理64位应用程序。
答案 0 :(得分:1)
对于遇到类似问题的任何人,我们的最终解决方案是使用GetWindowThreadProcessId(GetForegroundWindow(), ref foregroundWindowProcessId)
检查间隔的前景窗口并保留我们生成的进程ID的映射。每次这个计时器触发时,我们设置一个布尔值来检查调用CallNextHookEx
的函数,因为它必须是高效/快速的,否则windows会解除我们的注意。然后,我们使用上面的布尔值和来自SetWindowsHookEx
的系统挂钩来确定用户是否在我们的应用程序中处于活动状态。此解决方案不需要C ++ DLL。