[win32][c++]如何覆盖winAPI控件自带的加速键

本文探讨了在Win32环境下使用Edit控件实现文本编辑器时遇到的自定义加速键问题。详细解释了TranslateAccelerator函数在控件聚焦时无法正确工作的原理,并给出了修正代码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在win32设计学习中,用edit控件实现简易文本编辑器,在设置加速键时遇到了问题,在edit编辑框获得焦点时,自定义加速键表不起作用(按下加速键后无错误消息提示音,
说明程序识别了加速键,但没有进入WM_COMMAND执行同时edit本身自带的ctrl+c等加速键也失效。经过查阅资料与寻找,发现是下面这个接收消息的函数的问题。

while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

首先我们知道,如果在加速键表中定义好加速键,TranslateAccelerator的作用是对照加速键表,将相关的按键消息翻译成WM_COMMAND和WM_SYSCOMMAND消息。

并直接发往窗口,而不在消息队列中等待。而此函数是给主窗口使用的,不能识别控件,所以当在控件中按下自定义的加速键时,该函数无法发送对应消息给控件句柄,所以什么事也不做。

下面要将代码修改为:

 while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(hWnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }



也就是把消息句柄直接设置成主窗口句柄,当在窗体中按下加速键,该函数会分发消息给窗体处理,可以在全局使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值