注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

银河军团大本营

光荣的军团,永远的丰碑 <坚持原创>

 
 
 

日志

 
 

关闭所有弹出窗口的Delphi代码  

2012-08-25 15:54:33|  分类: 编程小技巧 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  有时需要关闭主窗口除外的所有可视弹出窗口(包括模态/非模态对话框),除了用EnumWindows外,比较简单的方法是用GetWindow,以Delphi为例,以下代码可以关闭指定窗口以外所有可视窗口:

procedure CloseAllPopupWindows(const AHandle: THandle);
var
  h, h2: THandle;
  pid, pid2: DWord;
  r: TRect;
begin
  GetWindowThreadProcessId(AHandle, @pid);
  h := GetWindow(AHandle, GW_HWNDFIRST);
  while h <> 0 do begin
   h2 := h;
  h := GetWindow(h, GW_HWNDNEXT);
  if (h2 <> AHandle) and IsWindowVisible(h2) and GetWindowRect(h2, r) and (r.Right > r.Left) then begin
  GetWindowThreadProcessId(h2, @pid2);
  if pid = pid2 then begin
  SendMessage(h2, WM_CLOSE, 0, 0);
  end;
    end;
  end;
  SetForegroundWindow(AHandle);
end;

  在Delphi程序中可以用 CloseAllPopupWindows(Application.MainForm.Handle) 来关闭除主窗口之外的所有可视弹出窗口。以上代码可以简化如下:

procedure CloseAllPopupWindows2;
var
  h, h2: THandle;
  pid, pid2: DWord;
begin
  GetWindowThreadProcessId(Application.Handle, @pid);
  h := GetWindow(Application.Handle, GW_HWNDFIRST);
  while h <> 0 do begin
  h2 := h;
  h := GetWindow(h, GW_HWNDNEXT);
  if (h2 <> Application.Handle) and (h2 <> Application.MainForm.Handle) and IsWindowVisible(h2) then begin
  GetWindowThreadProcessId(h2, @pid2);
  if pid = pid2 then begin
  SendMessage(h2, WM_CLOSE, 0, 0);
  end;
  end;
  end;
  SetForegroundWindow(Application.MainForm.Handle);
end;

  评论这张
 
阅读(1507)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018