2010-07-08 11 views
1

OS에서 보낸 모든 메시지를 모든 응용 프로그램에 처리해야하는 응용 프로그램을 개발 중입니다.SetWindowsHookEx 함수의 문제점 C#

코드는 WH_KEYBOARD_LL을 위해 잘 작동하지만 WH_GETMESSAGE 실패 또는 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); 
} 

}

편집 :

나는 문제는 .NET 프레임 워크로 생각

.NET Framework에서 전역 후크가 지원되지 않습니다. WH_KEYBOARD_LL 하위 수준의 후크와 WH_MOUSE_L L 저수준 훅이면 Microsoft .NET Framework에서 전역 후크를 구현할 수 없습니다.

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

답변

0

왜 당신은 WINAPI로 curModule.ModuleName을 전달하는?

0

http://support.microsoft.com/kb/318804에 따르면 WH_KEYBOARD_LL을 제외한 .NET에서 전역 후크를 수행 할 수 없습니다. 이 기사의 끝 부분에있는 정보를 참조하십시오.