初识了Windows Hook ,觉得很有趣 我们可以用来钩子来获得和屏蔽一些消息
下面是一些创建和使用钩子的一下函数
//创建HOOK
HHOOK SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
参数一: 指定要捕获的消息类型 如捕获键盘 鼠标
参数二: 指定消息处理函数 若最后1个参数为0[为0说明要捕获所有程序的ID] 或者为其他程序的消息 这这个参数必须为动态链接
库中的导出函数
参数三:程序实例(最后一个参数为0[为0说明要捕获所有程序的ID] 或者为其他程序的消息 )这个参数为DLL的实例句柄
参数四:指定要捕获消息的线程ID 为0则捕获所有程序的消息
程序成功返回钩子的句柄 失败返回NULL
下面是一个简单的获取当前程序消息的钩子示例:
获得鼠标消息
HHOOK m_hMouse;
m_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());//设置本程序鼠标钩子 最后1个参数为
当前程序的线程ID
//鼠标消息处理程序
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;//返回1则表示我们已经处理了鼠标消息 相当于屏蔽所有鼠标消息
}
获得键盘消息
HHOOK m_hKeyBoard;
HWND g_hWnd;//获得窗口句柄
g_hWnd=m_hWnd;//在MFC程序内部调用
m_hKeyBoard=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,NULL,GetCurrentThreadId());//设置本程序鼠标钩子 最后
1个参数为当前程序的线程ID
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))//屏蔽ALT+F4
return 1;
else
return CallNextHookEx(g_hHook,code,wParam,lParam);*///将消息传递给HOOK链中的其他函数
if (VK_F2==wParam)//按下F2窗口退出
{
::SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hkeyboard);//移除键盘钩子
UnhookWindowsHookEx(g_hMouse);//移除鼠标钩子
}
return 1;
}
至于屏蔽所有程序的消息 详见资源 Windows钩子简单实用