Приложение Delphi теряет фокус

#delphi #menu #setfocus

#delphi #меню #setfocus

Вопрос:

Я внедрил эту панель инструментов chevron в свое приложение, и она отлично работает; однако, когда я нажимал на какие-либо пункты меню, мое приложение теряло фокус. Даже если я наведу курсор мыши на угол формы, курсор не изменится на маркер изменения размера. Мне нужно щелкнуть по форме или приложению, чтобы восстановить фокус, чего я бы не хотел делать. Вызов MainForm.Setfocus после вызова пункта меню не помогает. Я хотел бы, чтобы фокус автоматически переключался на мое приложение, чтобы моим пользователям не нужно было нажимать на форму, прежде чем делать то, что им нужно сделать.

Есть идеи о том, как восстановить фокус на форме и / или приложении?

Спасибо

Ответ №1:

Перехватите сообщение WM_KillFocus.

псевдокод
на этом терминале нет Delphi, он заполнит пробелы при запуске.

 type
  TForm1 = class(TForm)
  ...
  protected
    procedure WMKillFocus(message: TWM_Killfocus); message WM_KillFocus;
  ...

procedure TForm1.WMKillFocus(message: TWM_Killfocus);
begin
  //do stuff to prevent the focus from shifting.
  //do *NOT* call SetFocus, it confuses Windows/Delphi and leads to suffering
  //Call PostMessage or handle the KillFocus message
  //From MSDN
  //While processing this message, do not make any function calls that display
  //or activate a window. This causes the thread to yield control and can
  //cause the application to stop responding to messages. For more information 
  //see Message Deadlocks. 
  //Also don't use SendMessage, PostMessage is OK though.        

  //Suggestion:
  PostMessage(Self.handle, WM_SETFOCUS, 0, 0); 
end;