gpt4 book ai didi

delphi - 如何检查打开的表单实例是否来自设计器?

转载 作者:行者123 更新时间:2023-12-03 15:45:32 24 4
gpt4 key购买 nike

Delphi 应用程序通过这种方式检查表单实例是否已打开:

  form := FindWindow(PAnsiChar(FormClassName), nil);
if form > 0 then
begin
SendMessage(form, WM_ACTIVATEAPP, 0, 0);
Result := True;
end else
Result := False

问题是,当窗体作为 Delphi Designer 窗口打开时,它会说窗体已打开。我刚刚损失了一些工作时间,因为当我打开一个表单并单击一个方法断点时,应用程序停止工作:-(

如果表单类实例是在设计器中创建的,如何使该函数返回 false?

<小时/>

答案:
opc0de 下面的建议让我找到了一个很好的解决方案,所以我接受他的评论作为答案。我需要更改代码以迭代所有打开的表单。这是为全世界复制者带来幸福的代码的最终版本:

function VerifyFormIsOpen(formClass: String): Boolean;
var
windowHndl, windowOld: HWND;
processId: Cardinal;
begin
windowOld := 0;
windowHndl := 0;
Result := False;
repeat
windowHndl := Windows.FindWindowEx(0, windowOld,
PAnsiChar(formClass), nil);
if (windowHndl > 0) then
begin
Windows.GetWindowThreadProcessId(windowHndl, processId);
if processId = Windows.GetCurrentProcessId() then
begin
Windows.SendMessage(windowHndl, Messages.WM_ACTIVATEAPP, 0, 0);
Result := True;
break;
end;
end;
windowOld := windowHndl;
until windowHndl = 0;
end;

最佳答案

如果您执行此操作时只有一个应用程序实例运行,请正确执行:使用互斥锁。请参阅my answerthis question了解创建和使用互斥体的方法,或查看 Jedi 实现该问题的已接受答案。

如果您能够设法创建互斥锁,则不必寻找窗口:即使您确实找到了它,它也可能来自 IDE,或者来自恰好具有相同名称的不同应用程序。

关于delphi - 如何检查打开的表单实例是否来自设计器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6754858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com