HOOK的利用
可以通過安裝HOOK過程來屏蔽相應消息,比如說鼠標消息,相應鍵盤消息
用SetWindowsHookEx來安裝相應HOOK過程,如果想屏蔽所有線程的消息,則HOOK過程必須在動態鏈接庫中定義。
下面爲屏蔽本進程中線程的鼠標和某些鍵盤消息的代碼:
HHOOK hmouse;
HHOOK hkey;
HWND hwnd=NULL;
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return 1;//屏蔽所有鼠標消息
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
/*if(VK_F2==wParam&&1==(lParam<<29&&1))//屏蔽alt+F2組合鍵
return 1;
return CallNextHookEx(hkey,code,wParam,lParam);*/
if(VK_F2==wParam)//設置後門,當按F2則退出程序
{
::SendMessage(hwnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(hkey);
UnhookWindowsHookEx(hmouse);
}
return 1;
}
hmouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
hkey=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
下面爲屏蔽所有線程的鼠標及相應鍵盤消息
首先編寫動態鏈接庫hook代碼:
hook.cpp:
#include <windows.h>
HHOOK hmouse;
HHOOK hkey;
HWND hwnd;
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;
}
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(VK_F2==wParam)//按F2退出
{
::SendMessage(hwnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(hkey);
UnhookWindowsHookEx(hmouse);
}
return 1;
}
void sethook(HWND handle)
{
hwnd=handle;
hmouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("hook.dll"),0);
hkey=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("hook.dll"),0);
}
hook.def:
LIBRARY hook
EXPORTS
sethook @2
hooktest客戶端代碼:
_declspec(dllimport)void sethook(HWND handle);
sethook(m_hWnd);
如果想在切換各窗口時,總讓運行的程序處於最前面,而看不見其他的窗口,可通過設置當前窗口爲頂級窗口,屏幕大小爲全屏。
int cxscreen,cyscreen;
cxscreen=GetSystemMetrics(SM_CXSCREEN);
cyscreen=GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTopMost,0,0,cxscreen,cyscreen,SWP_SHOWWINDOW);