1

我注意到当控件处于焦点时按下 CTRL 键时,RichEdit 不会向父窗口发送消息。当父窗口处于活动状态时,一切正常。但是当光标在 RichEdit 中时,只有鼠标 0x20WM_SETCURSOR消息正常。当在没有控制键的情况下按 0x111 键WM_COMMAND时发送,当我尝试按 CTRL 并在此期间任何其他键(如“S”)用于实现另存为功能时,不会发送任何内容。有没有办法创建对 RichEdit 的回调或以其他方式捕获CTRL+S

Escape 也不会向父窗口发送消息。

4

2 回答 2

2

找到了如何为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);
}
于 2013-01-17T19:54:06.993 回答
1

我认为,如果您只想捕获一些特定的快捷键来进行定义的操作(例如 Ctrl+S 进行保存),这不是最好的方法。

我想说正确的方法是使用加速器表。它有两个优点:

  • 如果加速器表在资源中,您可以轻松更改或删除快捷方式,而无需实际深入研究 C/C++ 代码。还有多语言软件的功能,如果您希望用户自定义快捷方式等,您也可以很容易地打开/保存加速器表在文件中而不是使用资源等。
  • 快捷方式不仅会在您处于该特定 Richedit 时触发。我认为这对用户来说是一件好事。假设您在同一个窗口中有另一个控件。使用您的代码,Ctrl+S 将不起作用,除非您在所有控制窗口上注册回调。我是用户,我目前在另一个控件上,我按 Ctrl+S。哦不,我的文档没有保存!令人沮丧和马车看起来...
  • 如果您还使用菜单,则无需添加太多代码...
于 2013-01-18T12:03:15.683 回答