我的任务是尝试监视从初始程序产生的所有GUI程序中的 Activity ,并在一段时间内不使用它们时将其杀死。这不是系统 Activity ,因为即使用户仅使用一段时间(不是由初始程序产生),也必须关闭程序。应用程序的生成过程是一个.Net程序,并且不会更改。我能够使用SetWindowsHookEx从.Net设置低级钩子(Hook)(WH_KEYBOARD_LLWH_MOUSE_LL),但是不确定如何将消息与我已经启动的进程关联(使用System.Diagnostics.Process)。我可以从执行钩子(Hook)的应用程序中钩出事件,但是当我尝试挂钩到生成的程序的特定线程时,它总是会失败。

我能够找到的最接近的是创建一个代表.Net程序调用SetWindowsHookEx的C++ dll。使用此方法,我可以进入生成的notepad.exe的第一个线程,但是从未调用过回调函数。如果我将线程ID指定为0,则在原始应用程序中存在 Activity 时将调用回调,因此我知道SetWindowsHookEx在这种情况下有效。

我还没有完全了解钩子(Hook),但是从我读到的内容来看,这是行不通的,因为dll回调函数地址对钩子(Hook)过程毫无意义。那是我遇到的问题吗?如果是这样,是否有办法解决?还是有人可以建议一种替代方法,以确定是否正在积极使用衍生程序?

.NET(C#)代码:

private const int WH_MOUSE = 14;

[DllImport("TestHook.dll", EntryPoint="InitializeHook",  SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
private static extern bool InitializeHook(uint hookType, int threadID);

private void HookEm() {
    //...
    System.Diagnostics.Process testProcess = System.Diagnostics.Process.Start("notepad");
    if(!InitializeHook(WH_MOUSE, testProcess.Threads[0].Id)) // The notepad.exe thread I know hooks
        MessageBox.Show("Boom!");
    //...
}

C++ dll:
HHOOK hookValue;

bool InitializeHook(UINT hookID, int threadID) {
    //... Determining which callback to use
    hookValue = SetWindowsHookEx(hookID, (HOOKPROC)MouseHookCallback, _dllInstance, threadID);
    //...
    return hookValue != NULL
}

static LRESULT CALLBACK MouseHookCallback(int code, WPARAM wparam, LPARAM lparam) {
    //From what I can see, this is never touched when hooking a thread on an outside process
}

目前,所有这些操作都是在32位Windows XP计算机上完成的。我确实知道,需要单独的64位dll才能与产生的64位应用程序一起工作。

最佳答案

对于遇到类似问题的任何人,我们的最终解决方案是使用GetWindowThreadProcessId(GetForegroundWindow(), ref foregroundWindowProcessId)间隔检查前台窗口,并保留我们产生的进程ID的映射。每次触发此计时器时,我们都将设置一个 bool(boolean) 值以检入调用CallNextHookEx的函数,因为它必须高效/快速,否则Windows将使我们脱钩。然后,我们使用上面的 bool(boolean) 值和系统从SetWindowsHookEx的钩子(Hook)来确定用户是否在我们的应用程序中处于 Activity 状态。此解决方案不需要C++ dll。

关于c++ - 如何监视生成的过程中的事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12391272/

10-11 19:36