快捷键
快捷键是按键或合并按键, 产生WM_COMMAND或WM_SYSCOMMAND消息
快捷键关联到菜单项(工具栏项)
一、概述
1.1 快捷键表
一个快捷键表由ACCEL结构体数组构成。一个线程处理快捷键,需要在消息循环中调用TranslateAccelerator监视键盘输入,一旦发现有与快捷键表匹配的按键,TranslateAccelerator转换键盘输入(WM_KEYUP和WM_KEYDOWN)为WM_COMMAND或WM_SYSCOMMAND消息并发送至窗口处理。
需要注意的是,应用程序定义的快捷键不可以与系统快捷键冲突,系统快捷键是不可修改的。
同一时间只能有一个快捷键表起作用,可以通过TranslateAccelerator切换不同的快捷键表。
1.2 创建快捷键表
(1)通过资源创建快捷键表,运行的时候用LoadAccelerators加载至内存并将句柄传递给TranslateAccelerator。这种类型的快捷键,程序停止后会被系统自动销毁。
(2)程序动态创建快捷键表,将ACCEL数组传递给CreateAcceleratorTable函数,得到一个快捷键表句柄,可以传递给TranslateAccelerator。程序退出时需要DestroyAcceleratorTable销毁快捷键表,否则程序退出后快捷键表依然存在内存中,系统不会自动销毁。
内存中的快捷键表示可以复制修改的,使用CopyAcceleratorTable函数。
1.3 快捷键分配
一个ASCII字符或一个虚拟键都可以定义快捷键。ASCII字符使得快捷键大小写敏感,容易混淆,因此建议使用虚拟键制作快捷键表。如果程序定义的快捷键与系统快捷键冲突,冲突的快捷键在程序内部起作用,不影响其他程序。但是,开发过程中应该避免这种快捷键冲突。一下时候系统快捷键:
ALT+ESC 切换到下一个应用程序
ALT+F4 关闭应用程序或窗口
ALT+HYPHEN 打开窗口菜单(文档窗口)
ALT+PRINT SCREEN 在活动窗口复制一个图像到剪贴板
ALT+SPACEBAR 打开主窗口菜单
ALT+TAB 切换下一个应用程序
CTRL+ESC 切换开始菜单
CTRL+F4 关闭活动组或文档窗口
F1 打开程序帮助文档
PRINT SCREEN 截屏
SHIFT+ALT+TAB 切换上一个应用程序
1.4 快捷键和菜单项
两者都可以产生WM_COMMAND或WM_SYSCOMMAND消息。WM_COMMAND消息包含一个标识符,该标识符可以获得详细信息,表示WM_COMMAND是由菜单还是快捷键产生。如果菜单与快捷键关联,菜单项是灰色(失能)的状态下,快捷键也同时失能。当窗口最小化后,快捷键也不再起作用。
1.5 UI(user interface) State
窗口可以发送消息去确定UI的状态
WM_CHANGEUISTATE 改变UI状态
WM_QUERYUISTATE 查询UI状态
WM_UPDATEUISTATE 更新UI状态
二、快捷键的使用
2.1 创建快捷键表资源
创建快捷键表资源,编译之后随EXE执行文件保存,运行时可以加载使用。
(1) 创建快捷键表资源,使用VC可以创建快捷键表资源
(2) 加载快捷键资源 LoadAccelerators
(3) 在消息循环中调用TranslateAccelerator
MSG msg;
BOOL bRet;
while ( (bRet = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
// Check for accelerator keystrokes.
if (!TranslateAccelerator(
hwndMain, // handle to receiving window
haccel, // handle to active accelerator table
&msg)) // message data
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
(4) 处理WM_COMMAND消息
(5) 销毁快捷键资源(LoadAccelerators加载资源不需要销毁,系统会自动销毁)
2.2 动态创建快捷键表
包含步骤:
(1) 创建ACCEL数组并填充, 传递至CreateAcceleratorTable函数创建快捷键表并获得句柄
(2) 将快捷键句柄传递给TranslateAccelerator激活,并处理WM_COMMAND消息
(3) 程序退出时DestroyAcceleratorTable销毁快捷键资源
三、快捷键相关参考
3.1 相关函数
CopyAcceleratorTable 复制指定快捷键表
CreateAcceleratorTable 创建快捷键表
DestroyAcceleratorTable 销毁快捷键表
LoadAccelerators 加载快捷键表资源
TranslateAccelerator 转换快捷键处理
3.2 相关消息
WM_COMMAND
WM_CHANGEUISTATE
WM_INITMENU
WM_INITMENUPOPUP
WM_MENUCHAR
WM_MENUSELECT
WM_QUERYUISTATE
WM_SYSCHAR
WM_SYSCOMMAND
WM_UPDATEUISTATE