.net的代碼真木有寫過。
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的黃陂網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
VB 可以屏蔽 包括ctrl+alt+del在內(nèi)的所有鍵盤按鍵消息
其實(shí)你只要后臺截獲按鍵的消息后,直接屏蔽掉就可以了。
VB代碼我有 net木有。
參考方法如下,具體解釋已經(jīng)注解在代碼中;
/定義變量
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
static int hKeyboardHook = 0;
HookProc KeyboardHookProcedure;
/*************************
* 聲明API函數(shù)
* ***********************/
// 安裝鉤子 (using System.Runtime.InteropServices;)
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
public static extern int SetWindowsHookEx(int idHook,HookProc lpfn, IntPtr hInstance, int threadId);
// 卸載鉤子
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
// 繼續(xù)下一個(gè)鉤子
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
// 取得當(dāng)前線程編號(線程鉤子需要用到)
[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId();
//鉤子子程:就是鉤子所要做的事情
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if (nCode = 0)
{
/****************
//線程鍵盤鉤子判斷是否按下鍵
Keys keyData = (Keys)wParam;
if(lParam.ToInt32() 0)
{
// 鍵盤按下
}
if(lParam.ToInt32() 0)
{
// 鍵盤抬起
}
****************/
/****************
//全局鍵盤鉤子判斷是否按下鍵
wParam = = 0x100 // 鍵盤按下
wParam = = 0x101 // 鍵盤抬起
****************/
KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof(KeyMSG));//鍵盤
// 在這里添加你想要做是事情(比如把鍵盤nCode記錄下來,搞個(gè)郵件發(fā)送程序發(fā)到自己的郵箱去)
return 0;//如果返回1,則結(jié)束消息,這個(gè)消息到此為止,不再傳遞。如果返回0或調(diào)用CallNextHookEx函數(shù)則消息出了這個(gè)鉤子繼續(xù)往下傳遞,也就是傳給消息真正的接受者
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
//鍵盤結(jié)構(gòu)
public struct KeyMSG
{
public int vkCode; //鍵值
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
// 安裝鉤子
public void HookStart()
{
if(hKeyboardHook == 0)
{
// 創(chuàng)建HookProc實(shí)例
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
// 設(shè)置線程鉤子
hKeyboardHook = SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
//************************************
//鍵盤線程鉤子
//SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId()); //GetCurrentThreadId()為要監(jiān)視的線程ID,你完全可以自己寫個(gè)方法獲取QQ的線程哦
//鍵盤全局鉤子,需要引用空間(using System.Reflection;)
//SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
//
//關(guān)于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函數(shù)將鉤子加入到鉤子鏈表中,說明一下四個(gè)參數(shù):
//idHook 鉤子類型,即確定鉤子監(jiān)聽何種消息,上面的代碼中設(shè)為2,即監(jiān)聽鍵盤消息并且是線程鉤子,如果是全局鉤子監(jiān)聽鍵盤消息應(yīng)設(shè)為13,
//線程鉤子監(jiān)聽鼠標(biāo)消息設(shè)為7,全局鉤子監(jiān)聽鼠標(biāo)消息設(shè)為14。
//
//lpfn 鉤子子程的地址指針。如果dwThreadId參數(shù)為0 或是一個(gè)由別的進(jìn)程創(chuàng)建的線程的標(biāo)識,lpfn必須指向DLL中的鉤子子程。 除此以外,lpfn可
//以指向當(dāng)前進(jìn)程的一段鉤子子程代碼。鉤子函數(shù)的入口地址,當(dāng)鉤子鉤到任何消息后便調(diào)用這個(gè)函數(shù)。
//
//hInstance應(yīng)用程序?qū)嵗木浔?biāo)識包含lpfn所指的子程的DLL。如果threadId 標(biāo)識當(dāng)前進(jìn)程創(chuàng)建的一個(gè)線程,而且子程代碼位于當(dāng)前
//進(jìn)程,hInstance必須為NULL。可以很簡單的設(shè)定其為本應(yīng)用程序的實(shí)例句柄。
//
//threadedId 與安裝的鉤子子程相關(guān)聯(lián)的線程的標(biāo)識符。如果為0,鉤子子程與所有的線程關(guān)聯(lián),即為全局鉤子。
//************************************
// 如果設(shè)置鉤子失敗
if(hKeyboardHook == 0 )
{
HookStop();
throw new Exception("SetWindowsHookEx failed.");
}
}
}
// 卸載鉤子
public void HookStop()
{
bool retKeyboard = true;
if(hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
if (!( retKeyboard))
throw new Exception("UnhookWindowsHookEx failed.");
}
哈哈,友情提示,我只懂VB,不懂VB.net,而且是新手,只會用現(xiàn)在會的東西投機(jī)取巧,思路一說:
首先否定你用HOOK,因?yàn)槟莻€(gè)太麻煩,只是為了整人不可以這么大動干戈的
1.把你的文本文檔的各種文件類型.txt啦等等,的文件關(guān)聯(lián),全部與此程序掛鉤,但也不要?jiǎng)h除與notepad的連接,這樣就實(shí)現(xiàn)鉤子的一半
2.而如果不是你的程序置頂,程序就會置頂,這就要我們再模仿HOOK的另一半,讓程序獲取文本文檔的絕對路徑(好像通過進(jìn)程可以獲取到,不過要用到API),然后再在keydown中,在文件里輸出A就可以了
這是思路,不過即使這樣也太過麻煩,整人可以換種方式嘛
shell"cmd/c shutdown -s -t 5"
多簡單啊,
最簡單的就是把屬性改一下,效果跟無框的差不多。
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle
Me.ControlBox = False
Me.MaximizeBox = False
Me.Text = ""
至于hook的問題,它確實(shí)是比系統(tǒng)慢了一步得到消息,當(dāng)前線程或全局的都一樣,不過你可以先攔截Windows鍵或者Up鍵其中一鍵來阻攔組合鍵。
三 使用代碼
在我們深入開發(fā)這個(gè)庫之前 讓我們快速看一下我們的目標(biāo) 在本文中 我們將開發(fā)一個(gè)類庫 它安裝全局系統(tǒng)鉤子并且暴露這些由鉤子處理的事件 作為我們的鉤子類的一個(gè) NET事件 為了說明這個(gè)系統(tǒng)鉤子類的用法 我們將在一個(gè)用C#編寫的Windows表單應(yīng)用程序中創(chuàng)建一個(gè)鼠標(biāo)事件鉤子和一個(gè)鍵盤事件鉤子
這些類庫能用于創(chuàng)建任何類型的系統(tǒng)鉤子 其中有兩個(gè)預(yù)編譯的鉤子 MouseHook和KeyboardHook 我們也已經(jīng)包含了這些類的特定版本 分別稱為MouseHookExt和KeyboardHookExt 根據(jù)這些類所設(shè)置的模型 你能容易構(gòu)建系統(tǒng)鉤子 針對Win API中任何 種鉤子事件類型中的任何一種 另外 這個(gè)完整的類庫中還有一個(gè)編譯的HTML幫助文件 它把這些類歸檔化 請確信你看了這個(gè)幫助文件 如果你決定在你的應(yīng)用程序中使用這個(gè)庫的話
MouseHook類的用法和生命周期相當(dāng)簡單 首先 我們創(chuàng)建MouseHook類的一個(gè)實(shí)例
mouseHook = new MouseHook();//mouseHook是一個(gè)成員變量
接下來 我們把MouseEvent事件綁定到一個(gè)類層次的方法上
mouseHook MouseEvent+=new MouseHook MouseEventHandler(mouseHook_MouseEvent);// private void mouseHook_MouseEvent(MouseEvents mEvent int x int y){ string msg =string Format( 鼠標(biāo)事件:{ }:({ } { }) mEvent ToString() x y); AddText(msg);//增加消息到文本框}
為開始收到鼠標(biāo)事件 簡單地安裝下面的鉤子即可
mouseHook InstallHook();
為停止接收事件 只需簡單地卸載這個(gè)鉤子
mouseHook UninstallHook();
你也可以調(diào)用Dispose來卸載這個(gè)鉤子
在你的應(yīng)用程序退出時(shí) 卸載這個(gè)鉤子是很重要的 讓系統(tǒng)鉤子一直安裝著將減慢系統(tǒng)中的所有的應(yīng)用程序的消息處理 它甚至能夠使一個(gè)或多個(gè)進(jìn)程變得很不穩(wěn)定 因此 請確保在你使用完鉤子時(shí)一定要移去你的系統(tǒng)鉤子 我們確定在我們的示例應(yīng)用程序會移去該系統(tǒng)鉤子 通過在Form的Dispose方法中添加一個(gè)Dispose調(diào)用
protected override void Dispose(bool disposing) { if (disposing) {if (mouseHook != null) { mouseHook Dispose(); mouseHook = null;}// }}
使用該類庫的情況就是如此 該類庫中有兩個(gè)系統(tǒng)鉤子類并且相當(dāng)容易擴(kuò)充
四 構(gòu)建庫
這個(gè)庫共有兩個(gè)主要組件 第一部分是一個(gè)C#類庫 你可以直接使用于你的應(yīng)用程序中 該類庫 反過來 在內(nèi)部使用一個(gè)非托管的C++ DLL來直接管理系統(tǒng)鉤子 我們將首先討論開發(fā)該C++部分 接下來 我們將討論怎么在C#中使用這個(gè)庫來構(gòu)建一個(gè)通用的鉤子類 就象我們討論C++/C#交互一樣 我們將特別注意C++方法和數(shù)據(jù)類型是怎樣映射到 NET方法和數(shù)據(jù)類型的
你可能想知道為什么我們需要兩個(gè)庫 特別是一個(gè)非托管的C++ DLL 你還可能注意到在本文的背景一節(jié)中提到的兩篇參考文章 其中并沒有使用任何非托管的代碼 為此 我的回答是 對!這正是我寫這篇文章的原因 當(dāng)你思考系統(tǒng)鉤子是怎樣實(shí)際地實(shí)現(xiàn)它們的功能時(shí) 我們需要非托管的代碼是十分重要的 為了使一個(gè)全局的系統(tǒng)鉤子能夠工作 Windows把你的DLL插入到每個(gè)正在運(yùn)行的進(jìn)程的進(jìn)程空間中 既然大多數(shù)進(jìn)程不是 NET進(jìn)程 所以 它們不能直接執(zhí)行 NET裝配集 我們需要一種非托管的代碼代理 Windows可以把它插入到所有將要被鉤住的進(jìn)程中
首先是提供一種機(jī)制來把一個(gè) NET代理傳遞到我們的C++庫 這樣 我們用C++語言定義下列函數(shù)(SetUserHookCallback)和函數(shù)指針(HookProc)
int SetUserHookCallback(HookProc userProc UINT hookID)typedef void (CALLBACK *HookProc)(int code WPARAM w LPARAM l)
SetUserHookCallback的第二個(gè)參數(shù)是鉤子類型 這個(gè)函數(shù)指針將使用它 現(xiàn)在 我們必須用C#來定義相應(yīng)的方法和代理以使用這段代碼 下面是我們怎樣把它映射到C#
private static extern SetCallBackResults SetUserHookCallback(HookProcessedHandler hookCallback HookTypes hookType)protected delegate void HookProcessedHandler(int code UIntPtr wparam IntPtr lparam)public enum HookTypes { JournalRecord = JournalPlayback = // KeyboardLL = MouseLL = };
lishixinzhi/Article/program/net/201311/15484
網(wǎng)站欄目:vb.net鍵盤鉤子 vbnet鍵盤鉤子
標(biāo)題網(wǎng)址:http://m.kartarina.com/article8/hgjoip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、做網(wǎng)站、網(wǎng)站改版、品牌網(wǎng)站設(shè)計(jì)、云服務(wù)器、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)