Keyboard Accelerators快捷键

快捷键
快捷键是按键或合并按键, 产生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    
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值