Как определить, нажата ли клавиша Ctrl, когда дочернее окно, т.е. Ричедит в фокусе?

Я заметил, что RichEdit не отправляет сообщения в родительское окно при нажатии клавиши CTRL, когда элемент управления находится в фокусе. Когда родительское окно активно, то все идет хорошо. Но когда курсор находится в RichEdit, только мышь 0x20 WM_SETCURSOR сообщения идут хорошо. При нажатии клавиши как при наборе без клавиш управления 0x111 WM_COMMAND это отправить, и когда я пытаюсь нажать CTRL и во время этой любой другой клавиши, например ‘S’, для реализации функции сохранения как, ничего не отправляется. Есть ли способ создать обратный вызов в RichEdit или другим способом захвата CTRL+S ?

Escape также не отправляет сообщение в родительское окно.

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 ++. Существуют также средства для многоязычного программного обеспечения, и вы также можете довольно легко открывать / сохранять таблицу акселераторов в файле, не использующем ресурсы, если вы хотите, чтобы пользователь настраивал ярлыки и т. Д.
  • Ярлык срабатывает не только когда вы находитесь в этом конкретном ричедите. Я думаю, что это хорошо для пользователей. Представьте, что у вас есть другой элемент управления в том же окне. С вашим кодом Ctrl + S не будет работать, если вы не зарегистрируете обратный вызов во всех окнах управления. Я пользователь, я в настоящее время на другом элементе управления, и я нажимаю Ctrl + S. О нет, мой документ не был сохранен! расстраивает и глючит на вид …
  • Если вы также используете меню, не так много кода, чтобы добавить …
1

По вопросам рекламы [email protected]