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...