Windows API (DAY12) Trans lateAccelerator 函数

一笑奈何 提交于 2020-01-18 03:14:33

当应用程序运行时,用户按下快捷键,这样就产生了一个按键消息,那么 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 来处理快捷键,并转换为命令消息发送出去。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!