#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;