SetWindowsHookEx():安装一个应用程序定义的hook过程到hook链中,后安装的hook过程在hook链的前面.
eg: //MFC,屏蔽当前进程主线程的键盘鼠标消息
HHOOK g_hKeyboard=NULL;
HHOOK g_hMouse;
HWND g_hWnd=NULL;
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_SPACE==wParam || VK_RETURN==wParam)
/*if(VK_F4==wParam && (1==(lParam>>29 & 1)))
return 1;
else
return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/
if(VK_F2==wParam)
{
::SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hKeyboard);
UnhookWindowsHookEx(g_hMouse);
}
return 1;
}
在OnInitDialog中:
g_hWnd=m_hWnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
//第三个参数:和当前进程的主线程相关,所以为NULL,因此第四个参数要传递当前线程的ID
/*/
eg: //屏蔽所有正在运行程序的键盘鼠标消息
//第四个参数为0,第三个参数为动态链接库的句柄
动态链接库文件:
#include
HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
#pragma data_seg(“MySec”) //节
HWND g_hWnd=NULL; //必须初始化
#pragma data_seg() //节
//#pragma comment(linker,”/section:MySec,RWS”) //共享,这样其他程序下F2也能关闭应用程序
/*HINSTANCE g_hInst;
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
g_hInst=hinstDLL; //法一:调用SetWindowsHookEx时可以用g_hInst
}*/
/
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 0;
}
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(VK_F2==wParam)
{
SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hMouse);
UnhookWindowsHookEx(g_hKeyboard);
}
return 1;
}
void SetHook(HWND hwnd)
{
g_hWnd=hwnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle(“Hook”),0);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle(“Hook”),0);
}//GetModuleHandle:法二,自动加扩展名.dll
/
Hook.def:
LIBRARY Hook
EXPORTS
SetHook @2 //函数的序号
SEGMENTS //节 共享(法二)
MySec READ WRITE SHARED
/
应用程序:
_declspec(dllimport) void SetHook(HWND hwnd);
int cxScreen,cyScreen;
cxScreen=GetSystemMetrics(SM_CXSCREEN);
cyScreen=GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);
SetHook(m_hWnd);
/
利用钩子可以获取其他程序的数据,例如可以获取密码…(通过安装一个WH_GETMESSAGE钩子)
//钩子种类很多,好好研究研究
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229998.html原文链接:https://javaforall.net
