以下代码关闭所有的IE窗口,但是我只想让程序自动关闭>4的IE窗口(100分)

  • 主题发起人 主题发起人 yhh
  • 开始时间 开始时间
Y

yhh

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(!]
以下代码关闭所有的IE窗口,但是我只想让程序自动关闭>4的IE窗口
(也就是说任何时候第5个窗口不会出现),请大侠们帮着改一改!多谢!!!
//********************************************************************
procedure TForm1.Timer1Timer(Sender: TObject);
var
h: HWnd;
Text: array [0..255] of char;
begin
h:=GetWindow(Handle, GW_HWNDFIRST);
while h <> 0 do
begin
if GetWindowText(h, @Text, 255)>0 then
if GetClassName(h, @Text, 255)>0 then
if (StrPas(Text)='CabinetWClass') or (StrPas(Text)='IEFrame') then
PostMessage(h,WM_CLOSE,0,0); //关闭IE窗口
h:=GetWindow(h, GW_HWNDNEXT);
end;
end;
//********************************************************************
 
你这样是把所有IE窗口及Explorer的窗口都关掉了。
IE窗口只用"IEFrame"判断就行了
这个你可以用我的一个小工具 Findhandle(http://xianjun.vicp.net) 看一下 [8D]

其实很简单,你只要加个计数器就行了:
procedure TForm1.Timer1Timer(Sender: TObject);
var
h: HWnd;
Text: array [0..255] of char;
IECount: Integer;
begin
IECount := 0;
h:=GetWindow(Handle, GW_HWNDFIRST);
while h <> 0 do
begin
if GetWindowText(h, @Text, 255)>0 then
if GetClassName(h, @Text, 255)>0 then
if (StrPas(Text)='CabinetWClass') or (StrPas(Text)='IEFrame') then
begin
Inc(IECount);
if IECount > 4 then
PostMessage(h,WM_CLOSE,0,0); //关闭IE窗口
end;
h:=GetWindow(h, GW_HWNDNEXT);
end;
end;
 
xianjun,你好!多谢了!你的回答我试了一下,发现个问题:如果我打开了4个窗口,
再打开1个窗口(第5个)是可以打开的(只不过它把我原来的第四个窗口关闭了)
但是我不想关闭原来的1-4个窗口,只想控制第5个窗口不会出现。
请你再帮我改一改!多谢了!!!
 
那你就搞个列表把那些记录下来啊。
var
WinList: array of THandle;

function WinIsValid(AHwnd: THandle): Boolean;
var
I: Integer;
TempArray: array of THandle;
begin
//检查现有列表中的窗口是否已被关闭,同时检查传入的窗口是否在列表中
for I := 0 to High(WinList) do
if IsWindow(WinList) then
begin
if WinList = AHwnd then
begin
Result := True;
Exit;
end;
SetLength(TempArray, Length(TempArray) + 1);
TempArray := WinList;
end;

if Length(TempArray) = 4 then //如果有四个IE,则返回False,否则,加入列表,返回True
Result := False
else
begin
SetLength(TempArray, Length(TempArray) + 1);
TempArray[High(TempArray)] := AHwnd;
Result := True;
end;

SetLength(WinList, Length(TempArray));
for I := 0 to High(TempArray) do
WinList := TempArray;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
h: HWnd;
Text: array [0..255] of char;
begin
h:=GetWindow(Handle, GW_HWNDFIRST);
while h <> 0 do
begin
if GetWindowText(h, @Text, 255)>0 then
if GetClassName(h, @Text, 255)>0 then
if (StrPas(Text)='CabinetWClass') or (StrPas(Text)='IEFrame') then
begin
if not WinIsValid(h) then
PostMessage(h,WM_CLOSE,0,0); //关闭IE窗口
end;
h:=GetWindow(h, GW_HWNDNEXT);
end;
end;
 
xianjun,你好!多谢了!
我在你第一次回答的基础上修改了一下解决了我的个问题,但是我不知道为什么会这样。
//****************************************************************************
procedure TForm1.Timer1Timer(Sender: TObject);
begin
CloseIE(4); //关闭IE窗口(保留4个)
end;
//****************************************************************************
procedure CloseIE(n:integer); //关闭IE窗口(保留N个)
var
h,hnew: HWnd;
Text: array [0..255] of char;
IECount: Integer;
begin
IECount := 0;
h:=GetWindow(Form1.Handle, GW_HWNDFIRST);
while h <> 0 do
begin
if GetWindowText(h, @Text, 255)>0 then
if GetClassName(h, @Text, 255)>0 then
if (StrPas(Text)='CabinetWClass') or (StrPas(Text)='IEFrame') then
begin
Inc(IECount);
IF (IECount=1) then hnew:=h; //新窗口的句柄号
if (IECount > n) then
PostMessage(hnew,WM_CLOSE,0,0); //关闭新IE窗口(第N+1个)
end;
h:=GetWindow(h, GW_HWNDNEXT);
end;
end;
//***************************************************************************
请你给看看这是为什么?多谢你了!!!
 
会怎么样?

试一下我第二次的回答,应该是可以的。
 
多人接受答案了。
 
后退
顶部