【发布时间】:2012-03-01 18:45:49
【问题描述】:
在 Win7 64 位上使用 Delphi XE2 更新 3 或更新 4。
调用 enumwindows 不像以前在 Delphi 6 中那样工作。
在 Delphi 6 enumwindows 处理窗口直到回调函数返回 False。这就是文档所说的应该做的:
"要继续枚举,回调函数必须返回TRUE;要停止枚举,它必须返回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 始终为零后继续枚举。
WTF?任何人都知道为什么枚举没有像文档中所说的那样停止,以及它在 Delphi 6 中是如何停止的?
干杯!
【问题讨论】:
-
您是否验证了
GLBWindowHandle被设置然后重置,或者它也有可能根本没有被设置? -
是的,先设置然后再重置。
-
如果您针对 32 位和 64 位进行编译,您是否观察到相同的行为?
-
我们目前只编译 32 位。我没有测试64位编译。
标签: delphi winapi delphi-xe2