Windows API一日一练(12)TranslateAccelerator函数

Post date: 2012/3/27 上午 07:16:57

分类: Direct3D2007-07-21 08:30 2145人阅读 评论(0) 收藏 举报

当应用程序运行时,用户按下快捷键,这样就产生了一个按键消息,那么Windows是怎么样把它转化为快捷键响应的消息呢?这就需要使用TranslateAccelerator函数。TranslateAccelerator函数主要的作用就是把消息跟快捷键表里定义的按键进行比较,如果发现有快捷键,就会把这个按键消息转换为WM_COMMAND或者WM_SYSCOMMAND消息给窗口的消息处理函数发送过去。

函数TranslateAccelerator声明如下:

WINUSERAPI

int

WINAPI

TranslateAcceleratorA(

__in HWND hWnd,

__in HACCEL hAccTable,

__in LPMSG lpMsg);

WINUSERAPI

int

WINAPI

TranslateAcceleratorW(

__in HWND hWnd,

__in HACCEL hAccTable,

__in LPMSG lpMsg);

#ifdef UNICODE

#define TranslateAccelerator TranslateAcceleratorW

#else

#define TranslateAccelerator TranslateAcceleratorA

#endif // !UNICODE

hWnd是窗口句柄。

hAccTable是快捷键定义表。

lpMsg是当前消息。

如果函数调用成功就返回非0值。如果失败就返回0值。

调用这个函数的例子如下:

#001 //主程序入口

#002 //

#003 // 蔡军生 2007/07/19

#004 // QQ: 9073204

#005 //

#006 int APIENTRY _tWinMain(HINSTANCE hInstance,

#007 HINSTANCE hPrevInstance,

#008 LPTSTR lpCmdLine,

#009 int nCmdShow)

#010 {

#011 UNREFERENCED_PARAMETER(hPrevInstance);

#012 UNREFERENCED_PARAMETER(lpCmdLine);

#013

#014 //

#015 MSG msg;

#016 HACCEL hAccelTable;

#017

#018 // 加载全局字符串。

#019 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

#020 LoadString(hInstance, IDC_TESTWIN, szWindowClass, MAX_LOADSTRING);

#021 MyRegisterClass(hInstance);

#022

#023 // 应用程序初始化:

#024 if (!InitInstance (hInstance, nCmdShow))

#025 {

#026 return FALSE;

#027 }

#028

#029 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWIN));

#030

#031 // 消息循环:

#032 BOOL bRet;

#033 while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0)

#034 {

#035 if (bRet == -1)

#036 {

#037 //处理出错。

#038

#039 }

#040 else if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

#041 {

#042 TranslateMessage(&msg);

#043 DispatchMessage(&msg);

#044 }

#045 }

#046

#047 return (int) msg.wParam;

#048 }

#049

第40行就是调用函数TranslateAccelerator来处理快捷键,并转换为命令消息发送出去。