Как я могу проверить, фокусируется ли мое приложение? - PullRequest
8 голосов
/ 15 сентября 2010

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

Ответы [ 4 ]

16 голосов
/ 15 сентября 2010

Позвоните Windows.GetForegroundWindow(), а затем передайте HWND в функцию Controls.FindControl().Он вернет не ноль TWinControl указатель, если HWND принадлежит вашему процессу.Например:

if FindControl(GetForegroundWindow()) <> nil then
  // has focus ...
else
  // does not have focus ...
4 голосов
/ 13 июня 2016

D2007 обладает этим полезным свойством

if Application.Active then
//
4 голосов
/ 15 сентября 2010

Если ваша заявка состоит из одной формы, то

GetForegroundWindow = Handle

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

Если ваше приложение состоит из нескольких форм, просто прокрутите их и проверьте, соответствует ли какая-либо из них GetForegroundWindow.

0 голосов
/ 25 сентября 2012

Небольшое отклонение ответа Remys:

Var
  Win: TWinControl;
Begin
  Win := FindControl(GetForegroundWindow);
  if Win <> nil then
//      StringGrid1.Row :=5;
//      StringGrid1.SetFocus;

скомпилировано нормально для меня, но я обнаружил, что это ненадежно во время отладки, вызывается stringgrid.setfocus, даже когда окно не сфокусировано, вызывая ошибку,

...