10

我正在尝试设置一个低级别的 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);
}

这曾经在使用 .NET Framework 3.5 的 32 位和 64 位机器上工作,但在升级到 .NET Framework 4.0 后停止在 32 位机器上工作。

有谁知道如何解决这个问题,以便我可以使用 4.0 框架并使其在 32 位和 64 位机器上工作?

4

4 回答 4

26

像这样导入dll:

[DllImport("kernel32.dll")]
    public static extern IntPtr GetModuleHandle(string name); 

然后使用

GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName)

取代

Marshal.GetHINSTANCE(
    Assembly.GetExecutingAssembly().GetModules()[0]
于 2012-06-29T03:43:05.487 回答
2

来自SetWindowsHookEx的文档

hMod [in]
HINSTANCE
DLL 的句柄,包含 lpfn 参数指向的钩子过程。如果 dwThreadId 参数指定由当前进程创建的线程并且挂钩过程在与当前进程关联的代码内,则 hMod 参数必须设置为 NULL。

所以你应该传入 IntPtr.Zero 为 NULL

//install hook
  hKeyboardHook = SetWindowsHookEx(
    WH_KEYBOARD_LL,
    KeyboardHookProcedure,
    IntPtr.Zero,
    0);
于 2010-09-22T19:30:05.130 回答
1

通过分别针对每个平台来解决它。将 VS 配置为编译 Win32 和 Win64 版本,并在 x86 和 x64 机器上部署它们相应的二进制文件。

Win32 或 x86 可在 32 位和 64 位机器上运行。

于 2010-08-30T16:19:25.343 回答
0

汉斯·帕桑特

任何模块句柄都可以,因为它实际上并不用于低级挂钩,不需要注入 DLL 来使它们工作。.NET 4 需要谨慎选择一个,因为它的 CLR 不再为纯托管程序集伪造模块句柄。一个很好的使用方法是你从 pinvoking LoadLibrary("user32.dll") 中得到的那个,因为它总是已经加载了。您不必调用 FreeLibrary()。

你需要这个声明来调用 LoadLibrary:

[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)]
private static extern IntPtr LoadLibrary(string fileName);
于 2014-02-20T10:10:39.303 回答