相关疑难解决方法(0)

在32位计算机上编译.NET 4.0框架时,SetWindowsHookEx返回0

即使应用程序没有对焦,我也试图设置一个低级别的Windows键盘钩子来抓住三个按键.为此,我将SetWindowsHookEx称为

// Create an instance of HookProc.
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
//install hook
hKeyboardHook = SetWindowsHookEx(
    WH_KEYBOARD_LL,
    KeyboardHookProcedure,
    Marshal.GetHINSTANCE(
        Assembly.GetExecutingAssembly().GetModules()[0]),
    0);
//If SetWindowsHookEx fails.
if (hKeyboardHook == 0)
{
    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. 
    int errorCode = Marshal.GetLastWin32Error();
    //do cleanup
    Stop(false, true, false);
    //Initializes and throws a new instance of the Win32Exception class with the specified error. 
    throw new Win32Exception(errorCode);
}
Run Code Online (Sandbox Code Playgroud)

这曾经使用.NET Framework 3.5在32位和64位计算机上运行,​​但在升级到.NET Framework …

keyboard-hook com-interop setwindowshookex c#-4.0

8
推荐指数
1
解决办法
9022
查看次数

找不到模块

我一直在研究这个问题并且没有更接近解决方案.

我再次挖出了我的旧版WindowsHookLib - 它可以在http://www.codeproject.com/KB/DLL/WindowsHookLib.aspx上获得.该库允许全局Windows鼠标/键盘/剪贴板挂钩,这非常有用.

我正在尝试使用Mouse Hook来捕获Mouse-Motion(我可以使用一个总是轮询Cursor.Position的Timer,但我打算稍后使用WindowsHookLib的更多功能).

代码如下:

MouseHook mh = new MouseHook();
mh.InstallHook();
mh.MouseMove += new EventHandler<WindowsHookLib.MouseEventArgs>(mh_MouseMove);
Run Code Online (Sandbox Code Playgroud)

但是在调用InstallHook()时,我得到一个例外:"无法找到指定的模块".奇怪.在搜索中,我发现有人认为这是因为DLL不在Windows PATH变量中包含的地方,并且因为将它放在system32中并没有帮助我将整个程序转换为C#以直接包含在我的项目(我很好奇它是如何工作的).

但是这个错误是顽固的持久性,所以我对此进行了一些挖掘,发现了负责的库中的代码:在InstallHook()中,我们有

IntPtr hinstDLL = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
this._hMouseHook = UnsafeNativeMethods.SetWindowsHookEx(14, this._mouseProc, hinstDLL, 0);
if (this._hMouseHook == IntPtr.Zero)
{
      throw new MouseHookException(new Win32Exception(Marshal.GetLastWin32Error()).Message);
}
Run Code Online (Sandbox Code Playgroud)

而这(在修改和重新编译之后)告诉我,我真正得到的是Windows错误"ERROR_MOD_NOT_FOUND"!现在,我在这里难过.我不是直接将Hook Library编译成我的项目吗?

(UnsafeMethods.SetWindowsHookEx只是来自user32的DllImported方法)

任何答案,或正确方向的Prods,或任何提示,指针或类似的非常感谢!

c# hook setwindowshookex

5
推荐指数
2
解决办法
3803
查看次数

标签 统计

setwindowshookex ×2

c# ×1

c#-4.0 ×1

com-interop ×1

hook ×1

keyboard-hook ×1