键盘信息类:
[StructLayout(LayoutKind.Sequential)]
public class KeyMSG
{
  public int vkCode;
  public int scanCode;
  public int flags;
  public int time;
  public int dwExtraInfo;
}
在键盘钩子函数
int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)中进行
KeyMSG keyMsg = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG))时出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”错误。
奇怪的是,在try块中出现错误时,它不是转到catch块中抛出异常,而是直接跳到Main()函数的Application.Run()那里。
另,安装钩子是成功的。
为什么会出现这种情况,怎么解决?请高手解答!

解决方案 »

  1.   

    http://blog.csdn.net/hatita/posts/316126.aspx
      

  2.   

    to hatita(悠远的风景):
    在copymemory()时还是出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”异常。但catch块能捕获此copymemory()的异常。
    另,在.Net中是无法实现全局钩子的,只能实现线程钩子。
      

  3.   

    我是2003,使用没问题!
    PS:使用低级键盘钩子是可以做到全局键盘hook的!
      

  4.   

    楼主的struct定义的有问题,C++中的数据类型和C#中的数据类型的转换是有规则的,楼主可以去google以下p/invoke。应该这样定义:
        public struct KeyboardLLHookStruct
        {
            public Int32 vkCode;
            public Int32 scanCode;
            public Int32 flags;
            public Int32 time;
            public IntPtr iExtraInfo;
        }