2010-07-08 74 views
2

在我的应用程序中,使用'LowLevelKeyboardProc'禁用开始菜单。但是当我连续按Tab键时出现以下错误。 的错误。在 Timer_soosai.exe在0x00352d58访问冲突读取位置0x0000000c

未处理的异常:0000005:访问 冲突读取位置0x0000000c。

00352D58 mov   eax,dword ptr [ecx+0Ch] /*This is the line which 

导致错误的disassemply */

守则:

[DllImport("user32", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
     public static extern int SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, int hMod, int dwThreadId); 
     [DllImport("user32", EntryPoint = "UnhookWindowsHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
     public static extern int UnhookWindowsHookEx(int hHook); 
     public delegate int LowLevelKeyboardProcDelegate(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam); 
     [DllImport("user32", EntryPoint = "CallNextHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
     public static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam); 
     public const int WH_KEYBOARD_LL = 13; 

     /*code needed to disable start menu*/ 
     [DllImport("user32.dll")] 
     private static extern int FindWindow(string className, string windowText); 
     [DllImport("user32.dll")] 
     private static extern int ShowWindow(int hwnd, int command); 

     private const int SW_HIDE = 0; 
     private const int SW_SHOW = 1; 
     public struct KBDLLHOOKSTRUCT 
     { 
      public int vkCode; 
      public int scanCode; 
      public int flags; 
      public int time; 
      public int dwExtraInfo; 
     } 
     public static int intLLKey; 

     public int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam) 
     { 
      bool blnEat = false; 

      switch (wParam) 
      { 
       case 256: 
       case 257: 
       case 260: 
       case 261: 
        //Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key, 
        blnEat = ((lParam.vkCode == 9) && (lParam.flags == 32)) | ((lParam.vkCode == 27) && (lParam.flags == 32)) | ((lParam.vkCode == 27) && (lParam.flags == 0)) | ((lParam.vkCode == 91) && (lParam.flags == 1)) | ((lParam.vkCode == 92) && (lParam.flags == 1)) | ((lParam.vkCode == 73) && (lParam.flags == 0)); 
        break; 
      } 

      if (blnEat == true) 
      { 
       return 1; 
      } 
      else 
      { 
       return CallNextHookEx(0, nCode, wParam, ref lParam); 
      } 
     } 
     public void KillStartMenu() 
     { 
      int hwnd = FindWindow("Shell_TrayWnd", ""); 
      ShowWindow(hwnd, SW_HIDE); 
     } 

    private void Login_Load(object sender, EventArgs e) 
     { 
      intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0); 

     } 

任何人都可以请帮我在这种情况下。非常感谢提前..

回答

3

您的P/Invoke声明都是错误的,在需要IntPtr的地方使用“int”。这段代码确实要在64位版本的Windows上进行轰炸。通过从pinvoke.net得到正确的声明来修复它们

+1

你100%的权利,但在他的情况下,它是一个32位的DLL崩溃。但是如果没有正确的签名,他仍然会在x64上遇到问题。 – 2010-07-08 23:34:01

1

看起来像你在某处取消引用NULL(即零指针)。虽然NULL不是正式的零,但它在实践中。 (它不是一个零指针的实际解引用,因为代码假设有一个结构从那里开始,并且正在访问该结构的第4个字。)

检查您调用空或零代码的任何位置参数。还要考虑将所有调用转换为低级别API私有,并将它们用安全版本包装,以保护所有参数。我不能诊断更多,你还没有提供足够的信息(至少,至少可以这样做;更有经验的人可能会有帮助)。