【问题标题】:how to detect if ctrl key is pressed when child window ie. richedit is in focus?如何检测子窗口时是否按下 ctrl 键。富编辑是焦点?
【发布时间】:2013-01-17 17:52:08
【问题描述】:
我注意到当控件处于焦点时按下 CTRL 键时,RichEdit 不会向父窗口发送消息。当父窗口处于活动状态时,一切正常。但是当光标在 RichEdit 中时,只有鼠标 0x20 WM_SETCURSOR 消息正常。当在没有控制键的情况下按 0x111 WM_COMMAND 键入时按下一个键,当我尝试按下 CTRL 并且在此期间任何其他键(如“S”)用于实现另存为功能时,没有发送任何内容。有没有办法创建对 RichEdit 的回调或以其他方式捕获 CTRL+S ?
Escape 也不向父窗口发送消息。
【问题讨论】:
标签:
c++
winapi
windows-messages
richedit
【解决方案1】:
找到了如何为richedit设置回调。
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);
}
【解决方案2】:
我认为,如果您只是想捕捉一些特定的快捷键来执行定义的操作(如 Ctrl+S 进行保存),这不是最好的方法。
我想说正确的方法是使用加速器表。它有两个优点:
- 如果加速器表在资源中,您可以轻松更改或删除快捷方式,而无需真正深入研究 C/C++ 代码。还有多语言软件的功能,如果您希望用户自定义快捷方式等,您还可以非常轻松地打开/保存加速器表在文件中,而不是使用资源等。
- 该快捷方式不仅会在您处于特定的 Richedit 时触发。我认为这对用户来说是一件好事。假设您在同一个窗口中有另一个控件。使用您的代码,Ctrl+S 将不起作用,除非您在所有控制窗口上注册回调。我是用户,我目前在另一个控件上,我按 Ctrl+S。哦不,我的文档没有保存!令人沮丧且看起来像马车......
- 如果您还使用菜单,则无需添加太多代码...