1

コントロールにフォーカスがあるときに CTRL キーを押すと、RichEdit が親ウィンドウにメッセージを送信しないことに気付きました。親ウィンドウがアクティブな場合、すべて問題ありません。しかし、カーソルがリッチエディットにある場合、マウス 0x20WM_SETCURSORメッセージのみが正常に動作します。コントロールキーなしで入力するようにキーを押すと0x111WM_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 のような定義済みのアクションを作成するために特定のキー ショートカットをキャッチしたいだけの場合、これは最善の方法ではないと思います。

正しい方法は、アクセラレータ テーブルを使用することです。これには 2 つの利点があります。

  • アクセラレータ テーブルがリソース内にある場合、C/C++ コードを実際に掘り下げることなく、ショートカットを簡単に変更または削除できます。多言語ソフトウェアの機能もあり、ユーザーにショートカットなどをカスタマイズしてもらいたい場合は、リソースを使用する代わりに、アクセラレータ テーブルをファイルに簡単に開いたり保存したりすることもできます。
  • ショートカットは、その特定のリッチエディットにいるときにトリガーされるだけではありません。ユーザーにとってはありがたいことだと思います。同じウィンドウに別のコントロールがあるとします。あなたのコードでは、すべてのコントロール ウィンドウにコールバックを登録しない限り、Ctrl+S は機能しません。私はユーザーで、現在他のコントロールを使用しており、Ctrl+S を押しています。ドキュメントが保存されていません。いらいらし、バグのように見える...
  • メニューも使用している場合、追加するコードはそれほど多くありません...
于 2013-01-18T12:03:15.683 に答える