Utilizzo di Delphi XE2 update 3 o update 4 su Win7 64 bit.Delphi XE2 EnumWindows non funziona correttamente
EnumWindows di chiamata non funziona come è abituato a lavorare in Delphi 6.
In Delphi 6 EnumWindows finestre processati fino a quando la funzione di callback restituito False. Questo è ciò che la documentazione dice che dovrebbe fare:
"Per continuare l'enumerazione, la funzione di callback deve restituire TRUE; per interrompere l'enumerazione, deve restituire FALSE."
Effettuare una chiamata al EnumWindows come segue:
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@FindMyWindow,0);
if GLBWindowHandle <> 0 then begin
ShowMessage('found');
end;
end;
Ecco la funzione di callback:
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;
tanto per essere chiari la funzione di callback è definita nel codice prima che l'evento ButtonClick quindi è trovato dal compilatore senza che sia necessario definirlo nella sezione dell'interfaccia.
Se questo viene eseguito utilizzando Delphi 6 l'enumerazione delle finestre si ferma una volta che il falso risultato viene restituito e GLBWindowHandle non è zero
Se questo viene eseguito utilizzando Delphi XE2 l'enumerazione continua dopo il Falso risultato viene restituito e GLBWindowHandle è sempre zero.
WTF? Qualcuno ha qualche idea sul perché l'enumerazione non si fermi come la documentazione afferma che dovrebbe e come era usata in Delphi 6?
Cheers!
Hai verificato che 'GLBWindowHandle' viene impostato e quindi resettato, o è anche possibile che non venga impostato affatto? – hvd
Sì, è impostato e quindi ripristinato. –
Osservate lo stesso comportamento se compilate per 32 bit e 64 bit? –