Usando Delphi XE2 actualización 3 o actualización 4 en Win7 64 bit.Delphi XE2 EnumWindows no funciona correctamente
EnumWindows de llamada no funciona como lo que solía trabajar en Delphi 6.
En Delphi 6 EnumWindows ventanas procesados hasta que la función de devolución de llamada devuelve Falso. Eso es lo que la documentación dice que debería hacer:
"Para continuar la enumeración, la función de devolución de llamada debe devolver TRUE; para detener la enumeración, debe devolver FALSE".
Realización de una llamada a EnumWindows de la siguiente manera:
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@FindMyWindow,0);
if GLBWindowHandle <> 0 then begin
ShowMessage('found');
end;
end;
Aquí es la función de devolución de llamada:
function FindMyWindow(hWnd: HWND; lParam: LPARAM): boolean; stdcall;
var TheText : array[0..150] of char;
str : string;
begin
Result := True;
GLBWindowHandle := 0;
if (GetWindowText(hWnd, TheText, 150) <> 0) then
begin
str := TheText;
if str = 'Form1' then
begin
GLBWindowHandle := hWnd;
Result := False;
end
else
result := True;
end;
end;
Para que quede claro la función de devolución de llamada se define en el código antes del evento ButtonClick por lo que es encontrado por el compilador sin necesidad de ser definido en la sección de interfaz.
Si esto se ejecuta utilizando Delphi 6 la enumeración de las ventanas se detiene una vez que el resultado se devuelve false y GLBWindowHandle no es cero
Si esto se ejecuta utilizando Delphi XE2 la enumeración continúa después de que el resultado se devuelve false y GLBWindowHandle es siempre cero.
WTF? ¿Alguien tiene alguna idea de por qué la enumeración no se detiene como la documentación dice que debería y cómo solía hacerlo en Delphi 6?
¡Salud!
¿Ha verificado que 'GLBWindowHandle' se establece y luego se restablece, o también es posible que no se configure? – hvd
Sí, está configurado y luego restablecido. –
¿Observas el mismo comportamiento si compilas para 32 bits y 64 bits? –