gpt4 book ai didi

c++ - 如何监控我生成的进程中的事件?

转载 作者:太空狗 更新时间:2023-10-29 23:07:35 27 4
gpt4 key购买 nike

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

我最接近的方法是创建一个代表 .Net 程序调用 SetWindowsHookEx 的 C++ dll。使用这种方法,我可以连接到生成的 notepad.exe 的第一个线程,但永远不会调用回调函数。如果我将线程 ID 指定为 0,则当原始应用程序中存在事件时将调用回调,因此我知道 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++ 动态链接库:

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 值来检查调用 CallNextHookEx 的函数,因为它必须高效/快速,否则 windows 将解除我们的 Hook 。然后我们使用上面的 bool 值和 SetWindowsHookEx 中的系统 Hook 来确定用户是否在我们的应用程序中处于事件状态。此解决方案不需要 C++ dll。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com