¿Cómo puedo comprobar si mi solicitud tiene el foco?
-
02-10-2019 - |
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.
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.