我在这个页面上发现了类似的问题,但我似乎无法弄清楚如何解释答案或弄清楚它们是否真的重复.
以下是我发现的可能重复项,并附有评论:
在32位计算机上编译.NET 4.0框架时,SetWindowsHookEx返回0
它似乎没有返回0我的,但我注意到崩溃时报告的句柄(32位上的.NET 4.0)与运行时报告的句柄不同(32位上的.NET 3.5),像崩溃句柄= 523727,工作句柄= 172738378.
在VS2008调试器中调用SetWindowsHookEx始终返回NULL
我可以在Visual Studio外部运行时重现我的问题
这似乎是最有希望的,除了对删除的答案的评论提到我应该使用LoadLibrary和GetProcAddress来加载.NET 4.0中的user32.dll,因为有关加载程序集的更改.但是,我很确定它是我自己无法找到的模块,但我不知道这是否适用.
Hans Passant对最后一个删除答案的评论如下:
你在使用.NET 4.0吗?它的CLR改变了程序集的加载方式,不再有LoadLibrary调用,也没有模块句柄.使用GetEntryAssembly()代替另一种修复. - 汉斯帕斯特5月5日19:43
那么,这里的字是什么?你在使用.NET 4.0吗?您是否尝试使用LoadLibrary("user32.dll")来获取可用的DLL句柄? - Hans Passant 5月6日15:43
我很确定我不需要这样做,但显然我不是百分百肯定.如果我需要更改它,我留下的问题是,为什么它适用于64位操作系统,在编译时Any CPU,但在任何配置中都不适用于32位.
如果加载.NET程序集确实发生了一些变化,那么我没有得到类库的正确句柄,我有以下问题:
背景
我在.NET 4.0中构建了一个程序,它使用带有WH_KEYBOARD_LL钩子类型的SetWindowsHookEx来捕获按键.这在我的64位Windows 7上运行良好,但在32位Windows 7上安装键盘挂钩时崩溃时出现"找不到模块".
这是我尝试过的:
我宁愿不将我的代码切换到.NET 3.5,因为我使用了一些类库来简化工作,而最新的代码只在.NET 4.0中.
如果需要,可以下载包含Visual Studio 2010项目的.ZIP文件,也可以粘贴以下两个文件.
要重新创建是否要沿着该路线前进:
然后构建并运行,测试各种配置.
using System;
using HookLib;
namespace HookTest
{
class Program
{
static void Main() …Run Code Online (Sandbox Code Playgroud) 我开发了一个使用全局键盘/鼠标钩子的应用程序.它在Windows 7中运行良好,但在Windows XP中运行不佳.
当我在Windows XP中调用SetWindowsHookEx时,我收到错误代码1428
int MouseLowLevel = 14
int code = SetWindowsHookEx(MouseLowLevel,
MouseHookProc,
IntPtr.Zero,
0);
private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) {}
Run Code Online (Sandbox Code Playgroud)