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

来源:互联网 发布:什么是淘宝达人 编辑:程序博客网 时间:2024/06/04 19:41

在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);        }    }



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


0 0
原创粉丝点击