当应用程序运行时,用户按下快捷键,这样就产生了一个按键消息,那么 Windows 是怎么 样把它转化为快捷键响应的消息呢?这就需要使用 TranslateAccelerator 函数。 TranslateAccelerator 函数主要的作用就是把消息跟快捷键表里定义的按键进行比较,如 果发现有快捷键,就会把这个按键消息转换为WM_COMMAND 或者 WM_SYSCOMMAND 消息给窗口的消息处理函数发送过去。函数 TranslateAccelerator 声明如下:
WINUSERAPI
int WINAPI TranslateAcceleratorA(
in HWND hWnd,
in HACCEL hAccTable,
in LPMSG lp Msg);
WINUSERAPI
int WINAPI TranslateAcceleratorW(
in HWND hWnd,
in HACCEL hAccTable,
in LPMSG lp Msg);
#ifdef UNICODE
#define TranslateAccelerator TranslateAcceleratorW
#else
#define TranslateAccelerator TranslateAcceleratorA
#endif // !UNICODE
- hWnd 是窗口句柄。
- hAccTable 是快捷键定义表。
- lpMsg 是当前消息。
如果函数调用成功就返回非 0 值。如果失败就返回 0 值。
调用这个函数的例子如下:
//主程序入口
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//
MSG msg;
HACCEL hAccelTable;
// 加载全局字符串。
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TESTWIN, szWindowClass, MAX_LOADSTRING);
MyReg isterClass(hInstance);
// 应用程序初始化:
if (!Init Instance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTab le = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWIN));
// 消息循环:
BOOL bRet;
while ( (bRet = GetMessage(& msg, NULL, 0, 0)) != 0)
{
if (bRet == -1)
{
//处理出错。
}
else if (!TranslateAccelerator(msg.hwnd, hAccelTab le, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
第 35行就是调用函数 TranslateAccelerator 来处理快捷键,并转换为命令消息发送出去。
来源:CSDN
作者:狼走西河
链接:https://blog.csdn.net/langzouxihe/article/details/103767111