模态窗体被隐藏及状态栏图标闪动函数

一、GetLastActivePopup 函数详解

函数基本信息

GetLastActivePopup 是一个 Windows API 函数,声明在 Windows.pas 单元中。

函数原型

pascal

function GetLastActivePopup(hWnd: HWND): HWND; stdcall;

主要作用

该函数用于获取指定窗口所属应用程序中最后一个活动的弹出窗口句柄

参数说明

  • hWnd: 主窗口句柄,函数将搜索该窗口的所有弹出窗口

返回值

  • 返回最后一个活动的弹出窗口句柄
  • 如果没有弹出窗口或发生错误,返回 0

工作原理

  1. 搜索指定窗口的所有弹出窗口(包括模态对话框、菜单等)
  2. 识别其中最后一个被激活的窗口
  3. 返回该窗口的句柄

典型使用场景

1. 检查应用程序是否有打开的对话框

pascal

var
  hPopup: HWND;
begin
  hPopup := GetLastActivePopup(Application.MainForm.Handle);
  
  if hPopup <> 0 then
  begin
    ShowMessage('应用程序有打开的对话框');
    // 可以在这里激活或关闭该对话框
    SetForegroundWindow(hPopup);
  end;
end;

2. 应用程序激活时的处理

pascal

procedure TMainForm.FormActivate(Sender: TObject);
var
  hPopup: HWND;
begin
  hPopup := GetLastActivePopup(Handle);
  
  // 如果有弹出窗口,激活它
  if hPopup <> 0 then
  begin
    SetForegroundWindow(hPopup);
  end;
end;

3. 关闭应用程序前的清理

pascal

function TMainForm.CloseQuery: Boolean;
var
  hPopup: HWND;
begin
  Result := True;
  
  hPopup := GetLastActivePopup(Handle);
  
  if hPopup <> 0 then
  begin
    // 关闭所有弹出窗口
    SendMessage(hPopup, WM_CLOSE, 0, 0);
    // 等待窗口关闭
    Sleep(100);
  end;
end;

注意事项

  1. 弹出窗口定义:包括对话框、消息框、菜单、下拉列表等
  2. 窗口层级:只搜索指定窗口的直接弹出窗口,不包括子窗口
  3. 线程安全:该函数是线程安全的
  4. 跨平台:仅适用于 Windows 平台

与其他函数的区别

函数作用
GetLastActivePopup获取最后活动的弹出窗口
GetForegroundWindow获取当前前台窗口
GetActiveWindow获取调用线程的活动窗口
EnumWindows枚举所有顶层窗口

闪烁任务栏替代方案

pascal

procedure FlashTaskbar(hWnd: HWND);
begin
  FlashWindow(hWnd, True);
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值