【发布时间】:2011-12-03 13:46:21
【问题描述】:
如何钩住前台窗口?
目前我正在尝试
using (Process processTmp = Process.GetCurrentProcess())
{
using (ProcessModule module = processTmp.MainModule)
{
IntPtr hModule = Win32.GetModuleHandle(module.ModuleName);
uint threadid = Win32.GetWindowThreadProcessId(Win32.GetForegroundWindow(), IntPtr.Zero);
//WH_CALLWNDPROC = 4
m_HookId = Win32.SetWindowsHookEx(4, m_HookProcedure, hModule, threadid);
if (m_HookId == IntPtr.Zero)
{
int tmp =
Marshal.GetLastWin32Error();
}
}
}
但 m_HookID 始终为 IntPtr.Zero 并出现错误 1428 - 无法在没有模块句柄的情况下设置非本地挂钩 (ERROR_HOOK_NEEDS_HMOD)。 所以看来hModule有问题。
有什么建议吗? Tnx。
【问题讨论】:
-
你的第一个问题是你试图用托管代码注入一个钩子。这会将 CLR 注入到每个进程中,这可能会产生问题,因为一个进程不能承载两个冲突的 CLR 版本。如果您要挂钩的任何进程也使用托管代码,则可能存在冲突。