Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何监视我生成的流程中的活动?_C++_.net_Hook_Setwindowshookex - Fatal编程技术网

C++ 如何监视我生成的流程中的活动?

C++ 如何监视我生成的流程中的活动?,c++,.net,hook,setwindowshookex,C++,.net,Hook,Setwindowshookex,我的任务是监视从初始程序生成的所有GUI程序中的活动,并在它们在一段时间内处于非活动状态时杀死它们。这不能是系统活动,因为我们必须关闭程序,即使用户只是在使用另一个程序一段时间(不是由初始程序生成的)。应用程序生成进程是一个.Net程序,不会更改。我可以使用.Net中的SetWindowsHookEx设置低级挂钩(WH\u KEYBOARD\u LL和WH\u MOUSE\u LL),但不确定如何将消息与我启动的进程关联(使用System.Diagnostics.Process),我可以从执行挂

我的任务是监视从初始程序生成的所有GUI程序中的活动,并在它们在一段时间内处于非活动状态时杀死它们。这不能是系统活动,因为我们必须关闭程序,即使用户只是在使用另一个程序一段时间(不是由初始程序生成的)。应用程序生成进程是一个.Net程序,不会更改。我可以使用.Net中的
SetWindowsHookEx
设置低级挂钩(
WH\u KEYBOARD\u LL
WH\u MOUSE\u LL
),但不确定如何将消息与我启动的进程关联(使用
System.Diagnostics.Process
),我可以从执行挂钩的应用程序中挂钩事件,但是,当我尝试为派生程序钩住特定线程时,它总是失败

我能做到的最接近的是创建一个C++的DLL,代表.NET程序调用<代码> StWistWOSKOOKEX < /代码>。使用此方法,我可以挂接到生成的notepad.exe的第一个线程,但从未调用回调函数。如果我将线程id指定为0,则在原始应用程序中存在活动时会调用回调,因此我知道

SetWindowsHookEx
在这种情况下有效

我还没有完全理解挂钩,但是从我所读到的内容来看,这是行不通的,因为dll回调函数地址对于挂钩进程来说是毫无意义的。这就是我遇到的问题吗?如果是这样的话,有没有办法解决这个问题,或者有人可以提出一个替代方案来确定是否正在积极使用衍生流程

.Net(C#)代码:

C++dll:


所有这些目前都是在32位Windows XP计算机上完成的。我确实理解,需要一个单独的64位dll来处理生成的64位应用程序。

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

>您的实际<代码>初始值钩子< /CU>返回正确的<代码> StWistWOSKOOKEX 结果吗?我忘记把它放在那里了,但是C++ DLL确实跟踪了从代码> StWistWOSKOKEX 返回值,只有当代码> StWistWOSKOOKEX返回非空值时,返回的代码>初始化AlgHooL> /COD>才是真的。

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!");
    //...
}
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
}