繁体   English   中英

如何监控我生成的流程中的活动?

[英]How can I monitor activity in a process that I spawned?

我的任务是尝试监视从初始程序中生成的所有GUI程序中的活动,并在它们在一段时间内变为非活动状态时将其杀死。 这不是系统活动,因为我们必须关闭程序,即使用户暂时只使用其他程序(不是由初始程序产生)。 应用程序生成过程是一个.Net程序,不会改变。 我能够使用SetWindowsHookEx来设置较低水平挂钩( WH_KEYBOARD_LLWH_MOUSE_LL从.net),但不能确定如何与我已经开始的过程中的消息关联(使用System.Diagnostics.Process )。我可以从挂钩的事件应用程序执行挂钩,但当我尝试挂钩到生成的程序的特定线程时,它总是会失败。

我最接近的是创建一个代表.Net程序调用SetWindowsHookEx的C ++ DLL。 使用此方法,我可以挂钩到生成的notepad.exe的第一个线程,但永远不会调用回调函数。 如果我指定线程id为0,则在原始应用程序中存在活动时调用回调,因此我知道SetWindowsHookEx在这种情况下有效。

我还没有完全理解挂钩,但是根据我的读法,这将无法工作,因为dll回调函数地址对于挂钩的进程毫无意义。 这是我遇到的问题吗? 如果是这样,有没有办法解决这个问题,或者有人可以提出另一种方法来确定是否正在积极使用衍生过程?

.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的映射。 每次这个计时器触发时,我们设置一个布尔值来检查调用CallNextHookEx的函数,因为它必须是高效/快速的,否则windows会解除我们的注意。 然后,我们使用上面的布尔值和来自SetWindowsHookEx的系统挂钩来确定用户是否在我们的应用程序中处于活动状态。 此解决方案不需要C ++ DLL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM