在键盘钩子中对lParam进行Marshal.PtrToStructure类型转换时发生“内存保护”错误。请高手帮忙。
键盘信息类: 
 [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()那里。 
 另,安装钩子是成功的。 
 为什么会出现这种情况,怎么解决?请高手解答!
------解决方案--------------------http://blog.csdn.net/hatita/posts/316126.aspx
------解决方案--------------------楼主的struct定义的有问题,C++中的数据类型和C#中的数据类型的转换是有规则的,楼主可以去google以下p/invoke。应该这样定义: 
     public struct KeyboardLLHookStruct 
     { 
         public Int32 vkCode; 
         public Int32 scanCode; 
         public Int32 flags; 
         public Int32 time; 
         public IntPtr iExtraInfo; 
     }