【问题标题】: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。哦不,我的文档没有保存!令人沮丧且看起来像马车......
      • 如果您还使用菜单,则无需添加太多代码...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-26
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-08
        相关资源
        最近更新 更多