如何做到检测到一个窗口已经打开,从而防止该窗口重复打开???(50分)

  • 主题发起人 主题发起人 txyx
  • 开始时间 开始时间
你可以设一个变量,记录当前打开的窗口。
 
我记得有这样一个系统函数吧,可以控制打开的窗口数目吧!
 
if CheckForm.Visible then

else
 
HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
就用这个API可以判断
 
用一个全局的窗口变量。
 
if not Assigned(窗体名称) then
begin
创建;
显示;
end;

 
IsWindowVisible(xx.handle) and iswindow
 

用Assigned函数,函数的参数是一个 Tform类或其派生类的变量(指针),
或者说是窗体类实例名。
 
举例:有一个程序通过api打开计算器,怎么防止它打开多个??
if not assigned(?????) then
winexec('c:/windows/calc.exe',sw_normal);
 

如果是这样的话,你这里的窗体属于进程外了。不在一个地址空间了。
你可以这样去做。
在打开该calc.exe之前
首先,调用findwindow,找到该窗体,然后发送一个消息给它,
消息为wm_close。
然后,winexec('c:/windows/calc.exe',sw_normal);
这样就能保证只打开了一个calc.exe程序。
 
看你的需求,想到几点:
1、判断窗体Caption或者文件名等也许可能。但是很多的时候是事后诸葛亮。因为必须打开窗体才有Caption
2、找到当前可执行文件是否在系统中已经运行。这个也许是正路,近两天有一个帖子在讨论如何获得系统的当前运行的可执行文件的名称,也许对你有用。
但是这样又存在问题,如果我手工运行了一个计算器,是否计算在内?如果是,可以,不是的话,你设置一个全局变量就可以了。
 
begin

if not Assigned(SomeForm) then
begin
Application.CreateForm(TSomeForm:SomeForm);
try
SomeForm.ShowModal;
finally
SomeForm.Free;
SomeForm :=nil
end;

end;
else
SomeForm.ShowModal;
end;

OnDestroy(0;
begin
SomeForm :=nil;
end;
 
findwindow 或者 用那个 互斥单元原理
 
可以试一下ActiveMDIChild
 
Function OpenMDIForm(FormName:String):Boolean;
var
i:integer;
ShowF:boolean;
begin
ShowF:=False;
if MainForm.MDIChildCount>0 then
begin
for i:=0 to MainForm.MDIChildCount-1do
if MainForm.MDIChildren.Name=FormName then
begin
MainForm.MDIChildren.Show;
ShowF:=True;
break;
end
else
ShowF:=False;
end else
ShowF:=False;
Result:=ShowF;
end;
 
if form=nil then
 
后退
顶部