Использование Delphi XE2 update 3 или update 4 на Win7 64 бит.
Вызов enumwindows работает не так, как раньше в Delphi 6.
В Delphi 6 enumwindows обрабатывали окна до тех пор, пока функция обратного вызова не вернула False. Вот что говорится в документации:
«Чтобы продолжить перечисление, функция обратного вызова должна вернуть ИСТИНА; чтобы остановить перечисление, она должна вернуть ЛОЖЬ».
Выполнение вызова enumwindows следующим образом:
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@FindMyWindow,0);
if GLBWindowHandle <> 0 then begin
ShowMessage('found');
end;
end;
Здесь является функцией обратного вызова:
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;
Для ясности, функция обратного вызова определена в коде ПЕРЕД событием buttonclick, поэтому компилятор обнаруживает ее без необходимости определять в разделе интерфейса.
Если это выполняется с использованием Delphi 6, перечисление окон останавливается, как только возвращается результат False и GLBWindowHandle не равен нулю
Если это выполняется с использованием Delphi XE2, перечисление продолжается после возврата результата False и GLBWindowHandle всегда равен нулю .
Какого черта? У кого-нибудь есть идеи, почему перечисление не останавливается, как указано в документации, и как это было раньше в Delphi 6?
Ура!