C语言基础
编程集成环境(本篇采用Visual Studio 2013)
创建一个对话框程序。如图是一个对话框程序,它能响应F1、F2、Ctrl+S等快捷键。
现在,我们一起来实现这一功能吧!首先定义一个全局变量HHOOK hKeybroadHook = NULL;
在对话框初始化(相应WM_INITDIALOG)时调用SetWindowsHookEx,安装WH_GETMESSAGE钩子。关于更多SetWindowsHookEx的用法,请查看http://baike.baidu.com/link?url=4QjrqHUS1GnMNTuR978J2QUeyCofHlV0nUPhZ3prLjdfPZRyfQnj1Vf2Z9WWWsl3Bynyn1JMPq53Il2Djd5QNpBu1CvJ_eHbm1QtOAzbayi
我们已经能够为对话框设计快捷键了!!总结如下:1.定义全局HHOOK hHook=NULL;//反正就是一个HHOOK类型的变量2.定义回调函数,原型如下:LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam);3.调用SetWindowsHookEx
设计的HookProc回调函数如下:
程序太简单,不想做备份,这里贴完整代码(几百行而已)// Win32Project1.cpp : 定义应用程序的入口点。//#include 'stdafx.h'#include 'Win32Project1.h'// 全局变量: HHOOK hHook = NULL;HWND hListBox = NULL;HINSTANCE hInst; // 当前实例INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam){ LPMSG lpMsg = (LPMSG)lParam; static TCHAR sz[10]; if (lpMsg->message == WM_KEYDOWN) { wsprintf(sz, _T('按下%c 编码%d'),lpMsg->wParam,lpMsg->wParam); ListBox_AddString(hListBox, sz); } return CallNextHookEx(hHook, code, wParam, lParam);}int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow){ UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 hInst = hInstance; DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, About); return GetLastError();}INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: hListBox = GetDlgItem(hDlg, IDC_LIST1); hHook = SetWindowsHookEx(WH_GETMESSAGE, HookProc, hInst, GetCurrentThreadId()); return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE;}
程序运行效果: