2010-07-08 5 views
1

Je développe une application qui doit gérer tous les messages envoyés par le système d'exploitation à n'importe quelle application.Problème avec la fonction SetWindowsHookEx C#

Le code fonctionne bien pour WH_KEYBOARD_LL seulement, mais échoue avec WH_GETMESSAGE ou WH_CALLWNDPROC

class Program 
{ 
    private const int WH_KEYBOARD_LL = 13; 
    private const int WH_GETMESSAGE = 3; 
    private const int WH_CALLWNDPROC = 4; 
    private const int WM_KEYDOWN = 0x0100; 
    private static HookProc _proc = new HookProc(HookCallback); 
    private static IntPtr _hookID = IntPtr.Zero; 

    static void Main(string[] args) 
    { 
     TextWriter tw = new StreamWriter("date.txt"); 
     tw.Write(DateTime.Now); 
     tw.Close(); 

     _hookID = SetHook(_proc); 
     Application.Run(); 
     UnhookWindowsHookEx(_hookID); 
    } 
    private static IntPtr SetHook(HookProc proc) 
    { 
     using (Process curProcess = Process.GetCurrentProcess()) 
     using (ProcessModule curModule = curProcess.MainModule) 
     { 
      return SetWindowsHookEx(WH_CALLWNDPROC , proc, 
       GetModuleHandle(curModule.ModuleName), 0); 
     } 
    } 

    private delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam); 

    private static IntPtr HookCallback(int code, IntPtr wParam, IntPtr lParam) 
    { 
     // This method is never called 

     return CallNextHookEx(_hookID, code, wParam, lParam); 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr SetWindowsHookEx(int idHook, 
     HookProc lpfn, IntPtr hMod, uint dwThreadId); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, 
     IntPtr wParam, IntPtr lParam); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string lpModuleName); 
} 

}

Edit:

Je pense que le problème est avec le cadre .NET travail

Les hooks globaux ne sont pas pris en charge dans le .NET Framework À l'exception du hook de bas niveau WH_KEYBOARD_LL et du WH_MOUSE_L L crochet de bas niveau, vous ne pouvez pas implémenter des crochets globaux dans Microsoft .NET Framework.

http://support.microsoft.com/kb/318804

Répondre

0

pourquoi Vous êtes de passage dans la curModule.ModuleName winapi?

Questions connexes