C# LowLevelKeyboardProc-无重载macthes委托

C# LowLevelKeyboardProc-无重载macthes委托,c#,keystroke,C#,Keystroke,在我解释我的错误之前,我知道我自己并不完全理解它,它主要来自一个教程,但我想我会把它贴在这里,以防万一有人知道。所以这是用来获取每次击键的。以下是我的变量: #区域键笔划 私有常量输入WM_键盘=13; 私有常量int WM_KEYDOWN=0x0100; 私有委托IntPtr低级键盘PROC(int nCode、IntPtr wParam、UIntPtr lParam); 私有静态字节CapsLock=0; 私有静态字节移位=0; 私有静态IntPtr HookID=IntPtr.Zero;

在我解释我的错误之前,我知道我自己并不完全理解它,它主要来自一个教程,但我想我会把它贴在这里,以防万一有人知道。所以这是用来获取每次击键的。以下是我的变量:

#区域键笔划
私有常量输入WM_键盘=13;
私有常量int WM_KEYDOWN=0x0100;
私有委托IntPtr低级键盘PROC(int nCode、IntPtr wParam、UIntPtr lParam);
私有静态字节CapsLock=0;
私有静态字节移位=0;
私有静态IntPtr HookID=IntPtr.Zero;
私有静态LowLevelKeyboardProc=GetKeyStrokes;
[DllImport(“kernel32.dll”,CharSet=CharSet.Auto)]
静态外部IntPtr CallNextHookEx(IntPtr hhk、intncode、IntPtr wParam、IntPtr lparam);
[DllImport(“user32.dll”,SetLastError=true)]
静态外部IntPtr SETWINDOWSHOOKX(int idHook、低层键盘PROC lpfn、IntPtr hMod、uint dwThreadID);
[DllImport(“kernel32.dll”,CharSet=CharSet.Auto)]
公共静态外部IntPtr GetModuleHandle(字符串lpModuleName);
#端区
在我的主要功能中,我设置了
HookID

HookID=SetHook(Proc);
然后我有了我的
SetHook
功能:

private static IntPtr SetHook(低级键盘程序)
{
使用(进程p=Process.GetCurrentProcess())
使用(ProcessModule m=p.MainModule)
返回SetWindowsHookEx(WM_键盘LL,Proc,GetModuleHandle(m.ModuleName),0);
}
最后,我还有我的
GetKeyStrokes
函数:


私有静态IntPtr GetKeyStrokes(intncode、IntPtr wParam、IntPtr lParam)
{
如果(nCode>=0&&wParam==(IntPtr)WM\u KEYDOWN)
{
int Code=Marshal.ReadInt32(LPRAM);
if(Keys.Shift==Control.ModifierKeys)
{
Program.Shift=1;
}
//专用钥匙的开关状态(太长)
}
程序移位=0;
}
返回CallNextHookEx(HookID、nCode、wParam、lParam);
}
我得到的唯一错误是变量
Proc=GetKeyStrokes哪个说

“GetKeyStrokes”的重载与委托“Program.LowLevelKeyboardProc”匹配


我知道这是相当复杂的,我不希望有很多人会得到它,我甚至没有得到很多,但欢迎任何想法,谢谢。

private static IntPtr GetKeyStrokes(int nCode,IntPtr wParam,IntPtr lParam)
-将最后一个参数类型更改为
uintpr
。委托和函数必须具有相同的签名。这引发了另一个错误,因此我只是将lparam声明为IntPtr,而不是UIntPtr,并且它工作了,如果您不首先指出它,我不会看到,非常感谢:)这不是唯一的问题,委托对象将被垃圾收集,然后您的程序将死亡。不要自己写这个,使用一个库。@HansPassant是的,它应该在GC之后被钉住并发布。但他说这是教程,我怀疑这段代码是否会投入生产。