11.5.6 捕获键盘钩子消息功能的实现
键盘钩子的实现已经在11.2.2节中进行了详细的讲解,在此不再详述。这个键盘钩子会捕获键盘Ctrl与P的组合键,并且在捕获这个组合键后,会向注册它的窗体发送自定义消息WM_MY_SHORTS,该消息定义为:
- #define WM_MY_SHORTS (WM_USER + 105)
因此要捕获这个消息,首先需要在功能控制窗体的初始化函数中注册这个键盘钩子。- 01 BOOL CScreenShotsDlg::OnInitDialog()
- 02 {
- 03 DWORD dwVK[] = {'P'};
- 04 int nLength = sizeof(dwVK) / sizeof(DWORD);
- 05 StartCatch(dwVK, nLength, this->m_hWnd); //开始捕获键盘消息
- 06 }
在11.2.2节中讲解的键盘钩子DLL中,StartCatch()函数开始钩子事件。当有键盘消息时,回调函数LowLevelKeyboardProc()将被调用。在这个回调函数中判断键盘事件,如果是Ctrl与P的组合键,它将向StartCatch()第3个参数指向的窗体发送WM_MY_SHORTS消息。因此为了截获这个消息,功能控制窗体需要定义一个函数OnCatchShots(),作为这个消息的响应函数。- 01 LRESULT CScreenShotsDlg::OnCatchShots(WPARAM wParam, LPARAM lParam)
- 02 {
- 03 StopCatch(); //停止键盘消息捕获事件
- 04 OnStart(); //开始截屏
- 05 return 0;
- 06 }
【代码解析】
第3行注销键盘钩子,第4行调用截屏模块的跳转函数。如此便完成了截取键盘钩子消息的功能。