求c鍵盤鉤子的程式,求一個C 鍵盤鉤子的程式

2021-12-25 21:26:44 字數 5698 閱讀 3520

1樓:天宇欖弛

public keybordhook()

//解構函式.

~keybordhook()

public void dispose()

public void start()

}// install mouse hook

if (hmousehook == 0)}}

public void stop()

if (hkeyboardhook != 0)

//如果卸下鉤子失敗

if (!(retkeyboard))

}private const int wm_mousemove = 0x200;

private const int wm_lbuttondown = 0x201;

private const int wm_rbuttondown = 0x204;

private const int wm_mbuttondown = 0x207;

private const int wm_lbuttonup = 0x202;

private const int wm_rbuttonup = 0x205;

private const int wm_mbuttonup = 0x208;

private const int wm_lbuttondblclk = 0x203;

private const int wm_rbuttondblclk = 0x206;

private const int wm_mbuttondblclk = 0x209;

private int mousehookproc(int ncode, int32 wparam, intptr lparam)

int clickcount = 0;

if (button != mousebuttons.none)

else

}//}

//console.writeline(clickcount.tostring());

//marshall the data from callback.

mousehookstruct mymousehookstruct = (mousehookstruct)marshal.ptrtostructure(lparam, typeof(mousehookstruct));

mouseeventargs e = new mouseeventargs(

button,

clickcount,

mymousehookstruct.pt.x,

mymousehookstruct.pt.y,

0);onmouseactivity(this, e);

}return callnexthookex(hmousehook, ncode, wparam, lparam);

}private int keyboardhookproc(int ncode, int32 wparam, intptr lparam)

}//引發onkeydownevent

if (onkeydownevent != null && (wparam == wm_keydown || wparam == wm_syskeydown))

//引發onkeypressevent

if (onkeypressevent != null && wparam == wm_keydown)

}//當有onkeydownevent 或 onkeypressevent不為null時,ctrl alt shift keyup時 prekeys

//中的對應的鍵刪除

if ((onkeydownevent != null || onkeypressevent != null) && (wparam == wm_keyup || wparam == wm_syskeyup))}}

}//引發onkeyupevent

if (onkeyupevent != null && (wparam == wm_keyup || wparam == wm_syskeyup))

}console.writeline("out keyboardhookproc.");

return callnexthookex(hkeyboardhook, ncode, wparam, lparam);

}private keys getdownkeys(keys key)

}rtnkey = rtnkey | key;

return rtnkey;

}private boolean isctrlaltshiftkeys(keys key)}}

}以上回答你滿意麼?

2樓:王朝背景

使用鉤子之前,需要使用setwindowshookex()函式建立鉤子,使用完畢之後要unhookwindowshookex()函式解除安裝鉤子,「鉤」到訊息後作業系統會自動呼叫在建立鉤子時註冊的**函式來處理訊息,處理完後呼叫callnexthookex()函式等待或處理下一條訊息。

對於鍵盤鉤子,鉤子型別為wh_keyboard_ll=13,只需要設定setwindowshookex的idhook引數為13即可「鉤」到鍵盤訊息。關於鉤子型別的資料見參考資料--鉤子型別。

新增win32api引用,**如下:

public class win32api

#endregion

#region api

public delegate int hookproc(int ncode, int32 wparam, intptr lparam);

//安裝鉤子的函式

[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.

stdcall)]

public static extern int setwindowshookex(int idhook, hookproc lpfn, intptr hinstance, int threadid);

//卸下鉤子的函式

[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.

stdcall)]

public static extern bool unhookwindowshookex(int idhook);

//下一個鉤掛的函式

[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.

stdcall)]

public static extern int callnexthookex(int idhook, int ncode, int32 wparam, intptr lparam);

[dllimport("user32")]

public static extern int toascii(int uvirtkey, int uscancode, byte lpbkeystate, byte lpwtranskey, int fustate);

[dllimport("user32")]

public static extern int getkeyboardstate(byte pbkeystate);

[dllimport("kernel32.dll", charset = charset.auto,callingconvention = callingconvention.

stdcall)]

public static extern intptr getmodulehandle(string lpmodulename);

#endregion

新增新建類keyboardhook,封裝鍵盤鉤子,**如下:

public class keyboardhook

public void sethook()

public void unhook()

private listprekeyslist = new list();//存放被按下的控制鍵,用來生成具體的鍵

private int keyboardhookproc(int ncode, int32 wparam, intptr lparam)

}//wm_keydown和wm_syskeydown訊息,將會引發onkeydownevent事件

if (onkeydownevent != null && (wparam == win32api.wm_keydown || wparam == win32api.

wm_syskeydown))

//wm_keydown訊息將引發onkeypressevent

if (onkeypressevent != null && wparam == win32api.wm_keydown)

}//鬆開控制鍵

if ((onkeydownevent != null || onkeypressevent != null) && (wparam == win32api.

wm_keyup || wparam == win32api.wm_syskeyup))}}

}//wm_keyup和wm_syskeyup訊息,將引發onkeyupevent事件

if (onkeyupevent != null && (wparam == win32api.wm_keyup || wparam == win32api.

wm_syskeyup))

}return win32api.callnexthookex(hhook, ncode, wparam, lparam);

}//根據已經按下的控制鍵生成key

private keys getdownkeys(keys key)

if (i == keys.lmenu || i == keys.rmenu)

if (i == keys.lshiftkey || i == keys.rshiftkey)

}return rtnkey | key;

}private boolean isctrlaltshiftkeys(keys key)

return false;}}

在主窗體中新增**,如下:

public mainform()

keyboardhook kh;

private void form1_load(object sender, eventargs e)

void kh_onkeydownevent(object sender, keyeventargs e)

//ctrl+s顯示視窗

if (e.keydata == (keys.h | keys.control)) //ctrl+h隱藏視窗

if (e.keydata == (keys.c | keys.control)) //ctrl+c 關閉視窗

if (e.keydata == (keys.a | keys.control | keys.alt)) //ctrl+alt+a

}private void form1_formclosing(object sender, formclosingeventargs e)}6

**新增完畢後,執行除錯。當按下ctrl+h是視窗隱藏,當按下ctrl+s視窗顯示,當按下ctrl+c時視窗關閉,開著qq按下ctrl+alt+a時...(會出現什麼呢?

這個要你自己去發現哦)。

求c語言完整程式,求一個c語言完整程式

include define size 200 最長可以輸入200個數int main printf n printf 一共 d個數 j 1 printf n return 0 測試123123輸出結果是 1 2 3 1 2 3 一工6個數 int i,x,m,n 0,a 5 scanf d x f...

c語言新手。求程式設計序,c語言新手。求編一個程式。

include include include define n 52 牌張總數 define m 13 每花色張數 char hs 4 花色陣列 梅花 紅心 方塊 黑桃字元對應的ascii碼 char hx 對應11,12,13,14共四張大於10的牌符號 生成順序撲克牌陣列 1 52,梅花1 1...

C語言編寫程式求1! 2! 3n ,n由鍵盤輸入

後面的!是幹嘛的?如果有!就用for迴圈然後拼接成一個字串!簡單而高效!n的值不能超過13,否則會因為資料溢位而回導致結果錯誤。答 include int main printf d n sum return 0 include stdio.h main printf n f sum getch i...