Pregunta

Lo que quiero hacer es comprobar si mi solicitud tiene el foco, porque si no lo es entonces emergerá una ventana de alerta justo sobre el área de notificación para mostrar algún mensaje para el usuario final.

¿Fue útil?

Solución

Llamada Windows.GetForegroundWindow() y luego pasar el HWND a la función Controls.FindControl(). Se devolverá un puntero TWinControl no nula si el HWND pertenece a su proceso. Por ejemplo:

if FindControl(GetForegroundWindow()) <> nil then
  // has focus ...
else
  // does not have focus ...

Otros consejos

Si su aplicación consiste en un único formulario, entonces

GetForegroundWindow = Handle

será suficiente. La expresión anterior es verdadero si y sólo si el formulario es la ventana en primer plano, es decir, si el foco del teclado pertenece a un control en el formulario (o para el propio formulario).

Si su aplicación consiste en un número de formas, simplemente bucle a través de ellos y comprobar si alguno de ellos coincide con GetForegroundWindow.

D2007 tiene esta propiedad útil

if Application.Active then
//

Una ligera variación en la respuesta Remys es:

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

compilado bien para mí, pero me pareció poco fiable durante la depuración, la stringgrid.setfocus se llama incluso cuando la ventana no se centra causando un error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top