1.在C#中使用Windows API時必須先使用DllImport來Include相關的library:

example :

using System.Runtime.InteropServices;
using System.Diagnostics;
    [DllImport("user32.dll")]
     private static extern IntPtr SetWindowsHookEx(
                                              HookType code,
                                              MSHookProc func,
                                              IntPtr instance,
                                              int threadID
                                           );

2.在C#中並沒有C/C++的function pointer,因此在C#中必須改用Delegate(委派)的方法。

example:
    private delegate int MSHookProc(
                                   int code,
                                   IntPtr wParam,
                                  ref MSDLLHOOKSTRUCT lParam
                              );

    _MouseHookHandle = SetWindowsHookEx(
                    HookType.WH_MOUSE_LL,
                    _MouseHookFunction,
                    GetModuleHandle(curModule.ModuleName),
                    0
                );

3.上述HOOK產生的Thread並不是UI Thread因此不能直接變更UI Thread中的物件內容,
  必須在UI Thread中建立一個新的Delegate,讓HOOK的Thread透過Invoke或BeginInvoke
  這個新的Delegate切換至UI Thread。

example:
    private delegate void ShowDataDelegate(
                                         HookType Type,
                                         int code,
                                         IntPtr wParam,
                                         object lParam
                                    );
    private static Delegate ShowDataProc;
    
    private void HookSample_Load(object sender, EventArgs e){           
                     ShowDataProc = new ShowDataDelegate(ShowDataFunc);            

    }

    private static int MouseHookCallback(
                                    int code,
                                    IntPtr wParam,
                                    ref MSDLLHOOKSTRUCT lParam){
                object[] args = new object[4];
                args[0] = (HookType) HookType.WH_MOUSE_LL;
                args[1] = (int)code;
                args[2] = (IntPtr)wParam;
                args[3] = (object)lParam;
                ShowDataProc.DynamicInvoke(args);
                return CallNextHookEx(_MouseHookHandle, code, wParam, ref lParam);
    }

Download :  UseHookSample.zip       UseHookSample.exe

Result:    

                 HookSample

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 yunjuihuang 的頭像
    yunjuihuang

    瑞の資訊備忘錄

    yunjuihuang 發表在 痞客邦 留言(0) 人氣()