Delphi XE2 EnumWindows не работает должным образом

Использование 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?

Ура!

6
задан TJ Asher 1 March 2012 в 18:45
поделиться