如何检测是否按下CTRL键时,子窗口ie.Richedit是焦点

how to detect if ctrl key is pressed when child window ie. richedit is in focus?

本文关键字:键时 窗口 ie 焦点 Richedit CTRL 何检测 检测 是否      更新时间:2023-10-16

我注意到当控件处于焦点时按下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看起来…
  • 如果你也使用菜单,没有那么多的代码添加…