C#鉤子本線程內訊息攔截

來源:互聯網
上載者:User

鉤子其實就是調用一下API而已:
1、安裝鉤子:
  SetWindowsHookEx
    函數原形:HHOOK SetWindowsHookEx(
                       int       idHook,    // 鉤子類型,
                       HOOKPROC  lpfn,      // 鉤子函數地址
                       INSTANCE  hMod,      // 鉤子所在的執行個體的控制代碼,
                       DWORD     dwThreadId // 鉤子所監視的線程的線程號
                      )
    hMod: 對於線程式鉤子,參數傳NULL;
    對於系統鉤子:參數為鉤子DLL的控制代碼
  dwThreadId:對於全域鉤子,該參數為NULL。
    鉤子類型用WH_CALLWNDPROC=4(發送到視窗的訊息。由SendMessage觸發)
    返回:成功:返回SetWindowsHookEx返回所安裝的鉤子控制代碼;
          失敗:NULL;
2、回調,你要截獲訊息就在這裡進行:
LRESULT WINAPI MyHookProc(
          int     nCode ,     // 指定是否需要處理該訊息
          WPARAM  wParam,     // 包含該訊息的附加訊息
          LPARAM  lParam      // 包含該訊息的附加訊息
                        )
3、調用下一個鉤子
LRESULT CallNextHookEx(
          HHOOK   hhk,      // 是您自己的鉤子函數的控制代碼。用該控制代碼可以遍曆鉤子鏈
          int     nCode,    // 把傳入的參數簡單傳給CallNextHookEx即可
          WPARAM  wParam,   // 把傳入的參數簡單傳給CallNextHookEx即可
          LPARAM  lParam    // 把傳入的參數簡單傳給CallNextHookEx即可
                      );
4、用完後記得卸載鉤子哦,要不然你的系統會變得奇慢無比!
BOOL UnhookWindowsHookEx(
         HHOOK      hhk       // 要卸載的鉤子控制代碼。
                      )
把上面這些API用C#封裝一下,就可以直接用了!
給個線程鉤子的例子吧(兩個Form都在同一個線程中運行):
using System.Runtime.InteropServices;
public class Form1 : System.Windows.Forms.Form
{
    ...
    //定義委託(鉤子函數,用於回調)
    public delegate int HookProc(int code, IntPtr wparam, ref CWPSTRUCT cwp);
    //安裝鉤子的函數
    [DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowsHookEx(int type, HookProc hook, IntPtr instance, int threadID);
    //調用下一個鉤子的函數
    [DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern int CallNextHookEx(IntPtr hookHandle, int code, IntPtr wparam, ref CWPSTRUCT cwp);
    //卸載鉤子
    [DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern bool UnhookWindowsHookEx(IntPtr hookHandle);
    //擷取表單線程ID
    DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern int GetWindowThreadProcessId(IntPtr hwnd, int ID);
    private HookProc hookProc;
    private IntPtr hookHandle = IntPtr.Zero;
    public Form1()
    {
        ....
        //掛接鉤子處理方法
        this.hookProc = new HookProc(myhookproc);
    }
    //開始攔截
private bool StartHook()
    {
        Form2 f=new Form2();
        f.Show();//加上這個
        //安裝鉤子,攔截系統向Form2發出的訊息
        this.hookHandle = SetWindowsHookEx(4, hookProc, IntPtr.Zero ,GetWindowThreadProcessId(f.Handle,0));
        return (this.hookHandle != 0);
    }
    //停止攔截
    private bool StopHook()
    {
        return UnhookWindowsHookEx(this.hookHandle);
    }
    //鉤子處理函數,在這裡攔截訊息並做處理
    private int myhookproc(int code, IntPtr wparam, ref CWPSTRUCT cwp)
    {
        switch(code)
        {
    case 0:
    switch(cwp.message)
    {
        case 0x0000F://WM_PAINT,攔截WM_PAINT訊息
                //do something
        break;
    }
            break;
        }
        return CallNextHookEx(hookHandle,code,wparam, ref cwp);
    }
   
    [StructLayout(LayoutKind.Sequential)]
    public struct CWPSTRUCT
    {
 public IntPtr lparam;
 public IntPtr wparam;
 public int message;
 public IntPtr hwnd;
    }
}
public class Form2 : System.Windows.Forms.Form
{
    ....
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.