`
cfeers
  • 浏览: 140210 次
  • 性别: 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好友下载,交流分享

    Delphi设计可自动关闭的对话框

    对话框是应用程序中用于与用户进行交互的一种窗口,它通常包含一些控件如按钮、文本框等,用户通过这些控件输入信息或进行选择。在Delphi中,我们可以使用TForm或者TDialog类来创建自定义对话框。 为了实现自动关闭...

    用Delphi编写的消息对话框的自动关闭

    通常,我们会使用标准的VCL组件,例如`TMessageDlg`,它提供了一种简单的方式来显示标准的消息对话框。`TMessageDlg`函数接收一个消息文本、一个对话框类型(如mtInformation, mtWarning或mtError)以及一些其他选项...

    封杀MessageBox线程关闭对话框

    在Windows编程中,`MessageBox`是一个非常常用的函数,用于弹出一个简单的对话框,显示一些信息、警告或询问用户。然而,在某些特定情况下,我们可能需要控制`MessageBox`的显示和关闭,比如自动关闭或者在特定条件...

    倒计时自动关闭对话框DLL代码

    这篇内容主要介绍的是一个使用Visual Studio 2010开发的倒计时自动关闭对话框的DLL代码。DLL(Dynamic Link Library)是Windows操作系统中的一种共享库,它包含可由多个程序同时使用的函数和其他资源。在这个项目中...

    可定时自动关闭的对话框

    首先,`MessageBox`是.NET Framework提供的一种内置对话框,它用于显示简单的警告、确认或信息消息。然而,标准的`MessageBox`不具备自动关闭的能力,用户必须手动点击按钮才能关闭。为了实现定时自动关闭的`...

    msgbox对话框,倒计时自动关闭

    在编程领域,`MsgBox`对话框是一种常用的功能,它能够弹出一个用户交互界面,显示消息,并等待用户的响应。通常在VBScript、VBA(Visual Basic for Applications)、Visual Basic等环境中,`MsgBox`是内置函数,用于...

    VC++对话框自动布局

    在VC++编程环境中,对话框(Dialog)是用户界面中常见的一种元素,它通常用于收集用户输入或显示信息。在创建对话框应用时,我们可能会遇到一个挑战:如何让对话框内的控件随着对话框本身的大小变化而自动调整布局。...

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

    这个实例提供了一种方法来创建这样一个对话框,它不仅可以显示信息,还能根据设定的时间自动关闭,提高了用户体验。 首先,我们需要了解VB中的Form控件,它是创建用户界面的基本元素。在VB中,我们可以新建一个窗体...

    android7 关闭ANR对话框代码

    在Android 7.0版本中,框架引入了一种新特性,即自动关闭ANR对话框,并允许开发者对这个过程进行一定的控制。下面将详细解释这一特性的实现原理以及涉及的相关文件。 首先,我们要了解ANR的触发条件。当主线程(UI...

    android等待对话框(可定时自动关闭)

    在Android应用开发中,对话框(Dialog)是一种常见的用户交互元素,用于向用户显示临时信息或请求用户输入。本文将详细讲解如何实现一个具有“请稍候...”文本且能定时自动关闭的等待对话框,以及提供两种不同的定时...

    提示框过几秒钟后自动关闭

    在IT领域,特别是软件开发与用户界面设计中,“提示框过几秒钟后自动关闭”的功能是一种常见的用户体验优化手段。此功能旨在提升用户交互的流畅性和效率,通过在一定时间后自动关闭提示信息,避免了用户手动关闭的...

    Android 对话框 (一) 管理对话框

    在Android开发中,对话框(Dialog)是一种常见的用户交互组件,用于向用户显示临时信息或者进行简单的交互操作。本文将深入探讨如何管理和使用Android对话框,主要包括其基本概念、创建方式、自定义以及最佳实践。 ...

    C# 对话框自动消失

    在C#中,`System.Timers.Timer` 类提供了一种简单的方式来创建定时任务。它可以通过设置间隔时间来触发一个事件,该事件可以在每次间隔结束后执行特定的操作。下面是一些关键属性和方法: - **Interval**:定时器的...

    TimerDlg定时关闭对话框

    【标题】"TimerDlg定时关闭对话框"是一个Delphi编程中的实用示例,它展示了如何在应用程序中实现一个能够自动关闭的对话框功能。在软件开发中,有时我们需要设计一些临时性的窗口,如提示信息或者设置窗口,这些窗口...

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

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

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

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

    按钮旁边会自动弹出一个对话框

    对话框是用户界面中的一个重要元素,它提供了一种与用户交互的方式,可以用于输入数据、显示信息或者进行一系列相关的设置操作。在Windows API中,我们可以使用MFC(Microsoft Foundation Classes)库来创建和管理...

    九种js弹出对话框的方法总结

    ### 九种JS弹出对话框的方法总结 #### 1. 最基本的JS弹出对话框窗口代码 最基本的JavaScript弹出对话框实现非常简单,仅需几行代码即可完成: ```javascript &lt;!-- window.open("page.html"); //--&gt; ``` ...

    VC++同时关闭多个子对话框!!

    如果你使用了这些特性,关闭主窗口时,子对话框可能也会自动关闭。 在实际应用中,选择哪种方法取决于你的具体需求,如对话框的数量、是否跨线程、对话框之间的关系等。无论哪种方法,都要注意处理好资源释放、异常...

Global site tag (gtag.js) - Google Analytics