Избегайте фокусировки окна - PullRequest
8 голосов
/ 14 ноября 2011

Я работаю на виртуальной клавиатуре, проблема в том, что когда я нажимаю клавишу на виртуальной клавиатуре, окно, в котором необходимо отправить данные, теряет фокус. Как я могу избежать этого?

Ответы [ 4 ]

6 голосов
/ 14 ноября 2011

Когда ваша клавиатурная форма получает фокус, часть получаемого сообщения является дескриптором окна, потерявшего фокус (wParam). Сделайте то, что вам нужно, и верните фокус в окно, которое потеряло фокус.

РЕДАКТИРОВАТЬ: см. Документацию по WM_SETFOCUS

РЕДАКТИРОВАТЬ 2:

Кроме того, вы можете использовать следующее при создании вашей пользовательской формы:

procedure TMainForm.CreateParams(var Params: TCreateParams) ;
 //const WS_EX_NOACTIVATE = $8000000;
 begin
   inherited;
   Params.ExStyle := Params.ExStyle + WS_EX_NOACTIVATE;
 end;

Чтобы предотвратить активацию вашей формы (если сфокусироваться на другой форме). Как я уже упоминал в своем комментарии, вам, вероятно, следует использовать неоконные элементы управления для ключей.

4 голосов
/ 14 ноября 2011

Единственный метод, который я видел, чтобы сделать то, что вы хотите, это отключить окно с виртуальной клавиатурой EnableWindow(hWnd, FALSE).

Теперь, если окно отключено, вы не будете получать сообщения мыши, верно?У вас есть варианты:

  • Самый простой: используйте WM_SETCURSOR.Он отправляется даже в отключенные окна, и в старшем слове lParam у вас есть идентификатор исходного сообщения (WM_LBUTTONDOWN и т. Д.).Координаты курсора можно прочитать с помощью GetMessagePos().
  • Круто: используйте хук окон: SetWindowsHookEx(WH_MOUSE, ...).Вы будете иметь полный контроль над сообщениями мыши.
1 голос
/ 14 ноября 2011

Используйте класс, который не способен фокусироваться на клавиатуре, но реагирует только на ввод с помощью мыши.

Решение. Получите виртуальную клавиатуру из TControl или TGraphicControl, а не из TWinControl или TCustomControl.

1 голос
/ 14 ноября 2011

Это помогает?

procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;

procedure TMyForm.WMMouseActivate(var Message: TWMMouseActivate);
begin
  Message.Result := MA_NOACTIVATE;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...