小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C#鉤子本線程內(nèi)消息攔截

 ShangShujie 2006-12-06

鉤子其實(shí)就是調(diào)用一下API而已:

1、安裝鉤子:
  SetWindowsHookEx
    函數(shù)原形:HHOOK SetWindowsHookEx(
                       int       idHook,    // 鉤子類型,
                       HOOKPROC  lpfn,      // 鉤子函數(shù)地址
                       INSTANCE  hMod,      // 鉤子所在的實(shí)例的句柄,
                       DWORD     dwThreadId // 鉤子所監(jiān)視的線程的線程號(hào)
                      )
    hMod: 對(duì)于線程序鉤子,參數(shù)傳NULL;
    對(duì)于系統(tǒng)鉤子:參數(shù)為鉤子DLL的句柄
  dwThreadId:對(duì)于全局鉤子,該參數(shù)為NULL。
    鉤子類型用WH_CALLWNDPROC=4(發(fā)送到窗口的消息。由SendMessage觸發(fā))
    返回:成功:返回SetWindowsHookEx返回所安裝的鉤子句柄;
          失?。篘ULL;

2、回調(diào),你要截獲消息就在這里進(jìn)行:
LRESULT WINAPI MyHookProc(
          int     nCode ,     // 指定是否需要處理該消息
          WPARAM  wParam,     // 包含該消息的附加消息
          LPARAM  lParam      // 包含該消息的附加消息
                        )

3、調(diào)用下一個(gè)鉤子
LRESULT CallNextHookEx(
          HHOOK   hhk,      // 是您自己的鉤子函數(shù)的句柄。用該句柄可以遍歷鉤子鏈
          int     nCode,    // 把傳入的參數(shù)簡(jiǎn)單傳給CallNextHookEx即可
          WPARAM  wParam,   // 把傳入的參數(shù)簡(jiǎn)單傳給CallNextHookEx即可
          LPARAM  lParam    // 把傳入的參數(shù)簡(jiǎn)單傳給CallNextHookEx即可
                      );

4、用完后記得卸載鉤子哦,要不然你的系統(tǒng)會(huì)變得奇慢無(wú)比!
BOOL UnhookWindowsHookEx(
         HHOOK      hhk       // 要卸載的鉤子句柄。
                      )

把上面這些API用C#封裝一下,就可以直接用了!
給個(gè)線程鉤子的例子吧(兩個(gè)Form都在同一個(gè)線程中運(yùn)行):

using System.Runtime.InteropServices;

public class Form1 : System.Windows.Forms.Form
{
    ...
    //定義委托(鉤子函數(shù),用于回調(diào))
    public delegate int HookProc(int code, IntPtr wparam, ref CWPSTRUCT cwp);

    //安裝鉤子的函數(shù)
    [DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowsHookEx(int type, HookProc hook, IntPtr instance, int threadID);
    //調(diào)用下一個(gè)鉤子的函數(shù)
    [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);
    }

    //開(kāi)始攔截
private bool StartHook()
    {
        Form2 f=new Form2();
        f.Show();//加上這個(gè)
        //安裝鉤子,攔截系統(tǒng)向Form2發(fā)出的消息
        this.hookHandle = SetWindowsHookEx(4, hookProc, IntPtr.Zero ,GetWindowThreadProcessId(f.Handle,0));
        return (this.hookHandle != 0);
    }

    //停止攔截
    private bool StopHook()
    {
        return UnhookWindowsHookEx(this.hookHandle);
    }

    //鉤子處理函數(shù),在這里攔截消息并做處理
    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
{
    ....
}



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=714599

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多