`
cfeers
  • 浏览: 134899 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一种自动关闭对话框的简单方法

 
阅读更多

{******************************************************
{                                                                                                
{       一种自动关闭对话框的简单方法                                                      
{                                                                                                 
{   使用方法:打开对话框前调用 SetDlgAutoClose                                     
{             参数1: 设定多长时间后关闭                                                  
{             参数2: 是否在对话框标题栏进行倒计时提示                                
{             取消自动关闭调用 ResetDlgAutoClose                                      
{                                                                                                  
{       任何转载请保留此文件的完整,如果进行修改请                                    
{   通知作者,谢谢合作。                                                                     
{                                                                                                  
{   作者: lichaohui  2004-03-03                                                           
{   Email:
mastercn@163.com                                                                                          
{                                                                                                          
{*******************************************************

unit TimerDlg;

interface

uses
  Windows, Messages, SysUtils, Classes, Forms, ExtCtrls;


// 如果指定的时间没有操作对话框,则自动关闭
procedure ResetDlgAutoClose;
procedure SetDlgAutoClose(nTime: Integer; ADoHint: Boolean = False);
 
implementation


{** 如果对话框被打开,则在指定时间后关闭,并在标题栏进行提示 }
var
  nWndCount: Integer = 0;
  SavWnds, SavWnds2: array of THandle;
  hDlgWnd: THandle = 0;
  hTimerk: Integer = 0;
  nTimerTick: Integer = 0;
  nLastTrk: Integer = 0;
  nDoHint: Integer = 0;
  nCapCt: Integer = 0;
  nSavCapt: String = '';
  fTimer1: TTimer = nil;

function MyEnumProc(hWnd: THandle; lParam: Integer): Boolean; stdcall;
var
  n: Integer;
begin
  Result := True;
  if lParam = 0 then
  begin
    if not IsWindowEnabled(hWnd) then Exit;
    if not IsWindowVisible(hWnd) then Exit;
  end;
  n := (nWndCount + 10) div 10 * 10;
  SetLength(SavWnds, n);
  SavWnds[nWndCount] := hWnd;
  Inc(nWndCount);
end;

procedure MyTimerProc(hWnd: THandle; uMsg: Integer;
  idEvent: Integer; dwTime: Integer);
var
  i, t: Integer;
  function FindInArray(ar: array of THandle; hd: THandle): Boolean;
  var
    t: Integer;
  begin
    Result := False;
    for t := Low(ar) to High(ar) do
    begin
      Result := ar[t] = hd;
      if Result then Break;
    end;
  end;
begin
  if (hDlgWnd = 0) and (SavWnds = nil) and (SavWnds2 <> nil) then
  begin
    nWndCount := 0;
    EnumThreadWindows(GetCurrentThreadId, @MyEnumProc, 0);
    SetLength(SavWnds, nWndCount);
    for i := Low(SavWnds) to High(SavWnds) do
    begin
      if not FindInArray(SavWnds2, SavWnds[i]) then
      begin
        if SavWnds[i] = GetActiveWindow then
        begin
          hDlgWnd := SavWnds[i];
        end;
      end;
    end;
    if hDlgWnd = 0 then ResetDlgAutoClose;
    nLastTrk := GetTickCount;
    SetLength(nSavCapt, 500);
    t := GetWindowText(hDlgWnd, PChar(nSavCapt), 500);
    SetLength(nSavCapt, t);
    nCapCt := 0;
  end
  else
  if (hDlgWnd <> 0) then
  begin
    if not IsWindow(hDlgWnd) or
      not IsWindowVisible(hDlgWnd) or
      not IsWindowEnabled(hDlgWnd) then
    begin
      ResetDlgAutoClose;
      Exit;
    end;
    t := GetTickCount;
    t := (nTimerTick - (t - nLastTrk) - 1);
    if t <= 0 then
    begin
      // try to use SendMessge instead using PostMessage
      PostMessage(hDlgWnd, WM_SYSCOMMAND,SC_CLOSE, 0);
//      SendMessage(hDlgWnd, WM_SYSCOMMAND,SC_CLOSE, 0);
    (* 2 lines added by jiatao
      SetForegroundWindow(hDlgWnd);
      PostMessage(hDlgWnd, WM_KEYDOWN,VK_RETURN,0);
    *)
      SetForegroundWindow(hDlgWnd);
      PostMessage(hDlgWnd, WM_KEYDOWN,VK_RETURN,0);

      ResetDlgAutoClose;
    end
    else
    if (nDoHint > 0) then
    begin
      t := (t + 1000) div 1000;
      if nCapCt <> t then
      begin
        SetWindowText(hDlgWnd,
          PChar(Format('(%d)%2s%s', [t, ' ', nSavCapt])));
        nCapCt := t;
      end;
    end;
  end;
end;

procedure TimerFunc(Sender: TObject);
begin
  MyTimerProc(0, 0, 0, 0);
end;

procedure SetDlgAutoClose(nTime: Integer; ADoHint: Boolean = False);
var
  FakeEvt: TNotifyEvent;
  Ptrs: array[1..2] of Pointer absolute FakeEvt;
begin
  ResetDlgAutoClose;
  nWndCount := 0;
  EnumThreadWindows(GetCurrentThreadId, @MyEnumProc, 1);
  SetLength(SavWnds, nWndCount);
  SavWnds2 := SavWnds;
  SavWnds := nil;
  if not Assigned(fTimer1) then
  begin
    fTimer1 := TTimer.Create(Application);
     Ptrs[2] := nil;
     Ptrs[1] := @TimerFunc;
     fTimer1.OnTimer := FakeEvt;
     fTimer1.Interval := 100;
     fTimer1.Enabled := True;
  end;
  nLastTrk := GetTickCount;
  nDoHint := Ord(ADoHint);
  nTimerTick := nTime;
end;

procedure ResetDlgAutoClose;
begin
  if hDlgWnd <> 0 then
  begin
     SetWindowText(hDlgWnd, PChar(nSavCapt));
  end;
  if Assigned(fTimer1) then
    FreeAndNil(fTimer1);
  nWndCount := 0;
  hDlgWnd := 0;
  SavWnds := nil;
  SavWnds2 := nil;
  nTimerTick := 0;
end;


end.

分享到:
评论

相关推荐

    delphi 实现延时自动关闭对话框 20200407.Demo_DlgAutoClose.zip

    delphi7代码编辑运行...代码包括了一个功能类,也就是unt_TimerDlg单元,主程序可以调用两种方法,实现不同效果。这种可自动关闭的对话框,适合各种管理系统or监控程序的提醒告知功能。 欢迎csdn好友下载,交流分享

    使任何消息框和对话框带有的功能

    这是我在实际工作中自己实现的一个技巧,拿出来与大家共享,自认为是好东西,所以请版主多多加分{*******************************************************}{ }{ 一种自动关闭对话框的简单方法 }{ }{ 使用方法:打开...

    定时自动关闭的弹出式对话框(全套delphi7源码)

    这是一整套自动延时关闭对话框的演示源码,可实现定时自动关闭即将弹出的对话框, 我在其中演示了三种延时自动关闭的对话框: (1)延时9秒关闭ShowMessage (2)延时8秒关闭MessageBox (3)延时8秒关闭自定义...

    VB制作多用途可自动关闭的对话框

    内容索引:VB源码,界面编程,对话框 VB制作多用途可的对话框,一种是可以自动关闭的对话框,设定时间,到时无需手动关闭;第二是打开一个始终居中的对话框;第三个是自定义对话框中的字体,系统字体随你选择。

    让Windows XP自动登录的两种方法

    第一种是修改注册表 这种方法比较麻烦,而且要求对注册表有一定的了解。 第1步:运行注册表编辑器,依次展开 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] 分支,然后在右侧窗口...

    防qq弹出对框

    Activities提供了一种方便管理的创建、保存、回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过...

    SimpleHUD透明提示框的对话框效果

    这三种提示框会在2秒后自动关闭。 3. 隐藏提示框 在调用新的show之前,SimpleHUD会自动关闭正在显示的HUD。 也可以使用SimpleHUD.dismiss(); 方法手动关闭。 4. 替换icon 四个图标在drawable文件夹内,使用相同...

    CuteFTP9简易汉化版

    使用粘贴URL对话框从剪贴板粘贴整个网址,创建一个新的网站,或直接从主菜单中启动一个现有的,或一种上传软件在程序启动时自动重新连接到上次访问站点。 代理/袜子/ Firewall-CuteFTP允许你通过代理连接,袜子,或防火墙...

    CAD实习报告-模板.doc

    命令行的改变、颜色、光标、选项 对话框的部分设置方法;工具栏的打开、关闭;画图的几种方式及特点:命令、 图标工具、菜单。 2. 简单图形的绘制:基本图形点、直线、射线、矩形、正多边形、圆、圆弧、椭圆、 样条...

    Radmin自动登录器v3.0

    用户选择某种外部语言便可以动态切换到新语言界面,无需重新启动程序,用户的语言选择将自动保存到RadminM.ini文件中,关闭程序后下次启动也会自动使用用户选择的新语言界面。 用户可以参照English.lng语言文件的...

    基于ASP.NET在线考试系统设计

    如何通过一种开发语言能高效的设计出这个系统是一个值考虑的一个需求。由于现代计算机网络技术的快速发展,信息已遍布全球。再加上现代考试的普及。网络已成为大众化的产物,所以将考试系统与网络相联,是很有意义的...

    硕士生,博士生论文排版技巧方法

    这里有另外一种方法,如果你想多学一点东西,请接着往下看。 选中所有的尾注文本,点“格式︱字体”,改为“隐藏文字”,切换到普通视图,选择“视图︱脚注”,此时所有的尾注出现在窗口的下端,在“尾注”下拉列表...

    会计理论考试题

    13.微机的键盘是一种分离式的智能键盘,通过电缆与主机连接。( Y ) 14.计算机的常用输出设备有打印机和键盘。( N) 15.汉字语音识别输入技术属于汉字智能输入技术。( Y ) 16.硬盘安装在主机箱内,一般用符号C:...

    【macOS】关闭Microsoft AutoUpdate

    如果您不需要弹出这个对话框,有两种方式。 方法一:设置权限不可访问 打开终端 cd /Library/Application\ Support/Microsoft/MAU2.0 sudo chmod 000 Microsoft\ AutoUpdate.app 输入密码。这样Microsoft ...

    (美化版) 定时关机 网络自动校时软件 V2.5 正式版+隐藏版(支持开机自动校时 后台校时)

    显示主界面的方法有两种: i. 【时钟提醒】界面显示时,单击【启】即可启动程序主界面。 ii. 再次运行程序(参考a栏目)可将程序主界面显示出来。 h) 网络校时: i. 单击【系统校时】程序将自动校时(注意校时为北京...

    定时器|TimeAlert-在指定时间自动执行任务的工具

    弹出一个提醒对话框,可自定义提醒文字内容 启动或打开一个文件(也可以不是执行文件,TXT、DOC都可以),可自定义程序或文件,废话 !提示并启动程序,和上面一样,只是界时会有20秒倒计时的提示窗 !进入休眠模式 ...

    android自动更新

    十一、提供两种模式的版本更新,一种是对话框显示下载进度,一种是通知栏显示后台默默下载形式 github:https://github.com/MZCretin/AutoUpdateProject 注:本文为转载作品,观看原文请移步github网址。

    Radmin自动登录器v3.0-多国语言绿色版-Release1-20150615

    用户选择某种外部语言便可以动态切换到新语言界面,无需重新启动程序,用户的语言选择将自动保存到RadminM.ini文件中,关闭程序后下次启动也会自动使用用户选择的新语言界面。 用户可以参照English.lng语言文件的...

    用_Excel_制作漂亮的工资条的方法.doc

     关闭编辑器,将自动返回到刚才的Excel表,选择“工具→宏→宏”,将弹出如下对话框:(见图3) 方法二:公式填充法  相比宏命令,公式填充法更便于理解,不过需要手工操作的步骤稍微多一些,“鱼和熊掌不可得兼”...

Global site tag (gtag.js) - Google Analytics