叹了口气,我有一些来自codeproject(http://www.codeproject.com/KB/cs/globalhook.aspx)的代码用于挂钩全局键盘和鼠标事件。突然之间,当我安装了visual studio 2010和.net framework 4.0的beta 2时,我打破了这段代码:
hKeyboardHook = SetWindowsHookEx(
WH_KEYBOARD_LL,
KeyboardHookProcedure,
Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]),
0);
哦,我正在使用X64机器。有人知道解决这个问题吗?我知道这不是一个简单的解决方案..
答案 0 :(得分:0)
最近为我的项目做了这个。它就像一个魅力) 我几乎可以肯定它是关于第二和第三个论点。
1像这样包装KeyboardHookProcedure():
//declate delegate type:
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
//use a class member of this type and inject your callback into
m_hookproc = new HookProc(HookCallbackProcedure);
第三个参数2:
IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
3小心Marshal.GetLastWin32Error()你必须在检查错误的方法后严格使用它。 (see this fxcop rule)
整个画面看起来像这样:
IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
IntPtr handle = SetWindowsHookEx( WH_KEYBOARD_LL, m_hookproc, hInstance, 0);
if (handle == IntPtr.Zero)
{
int error = Marshal.GetLastWin32Error();
//log the error or whatever
}
所以这就是全部)
答案 1 :(得分:0)
将Instance参数保留为0.似乎XP需要它,但win7不是。
hKeyboardHook = SetWindowsHookEx(
WH_KEYBOARD_LL,
KeyboardHookProcedure,
0,
0);