如何检测是否按下CTRL键时,子窗口ie.Richedit是焦点
how to detect if ctrl key is pressed when child window ie. richedit is in focus?
我注意到当控件处于焦点时按下CTRL键时RichEdit不会向父窗口发送消息。当父窗口处于活动状态时,一切正常。但是当光标在richit时,只有鼠标0x20 WM_SETCURSOR
消息才能正常运行。当按下一个键,如在键入没有控制键0x111 WM_COMMAND
发送,当我尝试按CTRL和在此期间任何其他键,如'S'实现另存为功能,没有发送。是否有一种方法来创建回调到RichEdit或以其他方式捕获CTRL+S
?
Escape也不会向父窗口发送消息
了解如何为richhead设置回调。
DefEditProc = (WNDPROC)SetWindowLong(richeditWindow, GWL_WNDPROC, (long)&richEdit.EditKeyProc);
及之前的代码:
LRESULT EditKeyProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if(uMsg == WM_KEYDOWN) {
if(wParam == 'S' && GetAsyncKeyState(VK_CONTROL));
return 0;
}
return CallWindowProc(DefEditProc, hwnd, uMsg, wParam, lParam);
}
我认为这不是最好的方法,如果你只是想抓住一些特定的快捷键,使定义的动作,如Ctrl+S保存。
我认为正确的方法是使用加速表。它有两个优点:
- 如果加速表在资源中,您可以轻松地更改或删除快捷方式,而无需深入研究C/c++代码。也有多语言软件的设施,你也可以很容易地打开/保存加速表在一个文件中,而不是使用资源,如果你想让用户自定义快捷方式,等等。
- 快捷方式不仅仅是当你在那个特定的富人区时触发的。我认为这对用户来说是件好事。假设在同一个窗口中有另一个控件。在您的代码中,Ctrl+S将不起作用,除非您在所有控制窗口上注册您的回调。我是一个用户,我目前在另一个控件上,我按下Ctrl+S。哦,不,我的文档还没有保存!令人沮丧和bug看起来…
- 如果你也使用菜单,没有那么多的代码添加…
相关文章:
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 将类指针类型转换为键时出错
- 查找不存在的键时,unordered_map返回什么
- 按下特定键时快速按此键.如何防止按下扳机键?(C++)
- 为什么 Boost multi_index只修改第一个索引的键时对第二个索引进行比较?
- 为什么 getch 在按下函数或箭头键时返回三个值?
- 我想制作设置鼠标回调函数,以便在仍然按下鼠标左键时连续传递坐标
- 插入新键时,它会更改现有键值的地址吗?
- 当覆盖映射中的复杂对象键时,旧对象将被删除(C++)
- Qt 键按事件处理程序仅在按下 ctrl、alt 或 shift 键时做出反应
- 在 OpenGL 中按某个键时无法绘制形状
- C++视图的一侧与视图值的另一侧具有不同的键时,bimap 是否可能?怎么做?
- C++ std::map 在找不到键时添加值
- 当用户在键盘上按住 CTRL 键时,如何在树视图中的 Qt 中实现多选?
- 无法在按下数字和数字键时处理Qt C++中的QKey事件
- 添加精灵时窗口关闭
- 如何在C 中按ENTER/返回键时退出程序循环
- 使用套接字 SFML 时窗口无响应
- 当按下键时,窗口停止刷新
- 如何检测是否按下CTRL键时,子窗口ie.Richedit是焦点