{******************************************************
{
{ 一种自动关闭对话框的简单方法
{
{ 使用方法:打开对话框前调用 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.
相关推荐
delphi7代码编辑运行...代码包括了一个功能类,也就是unt_TimerDlg单元,主程序可以调用两种方法,实现不同效果。这种可自动关闭的对话框,适合各种管理系统or监控程序的提醒告知功能。 欢迎csdn好友下载,交流分享
对话框是应用程序中用于与用户进行交互的一种窗口,它通常包含一些控件如按钮、文本框等,用户通过这些控件输入信息或进行选择。在Delphi中,我们可以使用TForm或者TDialog类来创建自定义对话框。 为了实现自动关闭...
通常,我们会使用标准的VCL组件,例如`TMessageDlg`,它提供了一种简单的方式来显示标准的消息对话框。`TMessageDlg`函数接收一个消息文本、一个对话框类型(如mtInformation, mtWarning或mtError)以及一些其他选项...
在Windows编程中,`MessageBox`是一个非常常用的函数,用于弹出一个简单的对话框,显示一些信息、警告或询问用户。然而,在某些特定情况下,我们可能需要控制`MessageBox`的显示和关闭,比如自动关闭或者在特定条件...
这篇内容主要介绍的是一个使用Visual Studio 2010开发的倒计时自动关闭对话框的DLL代码。DLL(Dynamic Link Library)是Windows操作系统中的一种共享库,它包含可由多个程序同时使用的函数和其他资源。在这个项目中...
首先,`MessageBox`是.NET Framework提供的一种内置对话框,它用于显示简单的警告、确认或信息消息。然而,标准的`MessageBox`不具备自动关闭的能力,用户必须手动点击按钮才能关闭。为了实现定时自动关闭的`...
在编程领域,`MsgBox`对话框是一种常用的功能,它能够弹出一个用户交互界面,显示消息,并等待用户的响应。通常在VBScript、VBA(Visual Basic for Applications)、Visual Basic等环境中,`MsgBox`是内置函数,用于...
在VC++编程环境中,对话框(Dialog)是用户界面中常见的一种元素,它通常用于收集用户输入或显示信息。在创建对话框应用时,我们可能会遇到一个挑战:如何让对话框内的控件随着对话框本身的大小变化而自动调整布局。...
这个实例提供了一种方法来创建这样一个对话框,它不仅可以显示信息,还能根据设定的时间自动关闭,提高了用户体验。 首先,我们需要了解VB中的Form控件,它是创建用户界面的基本元素。在VB中,我们可以新建一个窗体...
在Android 7.0版本中,框架引入了一种新特性,即自动关闭ANR对话框,并允许开发者对这个过程进行一定的控制。下面将详细解释这一特性的实现原理以及涉及的相关文件。 首先,我们要了解ANR的触发条件。当主线程(UI...
在Android应用开发中,对话框(Dialog)是一种常见的用户交互元素,用于向用户显示临时信息或请求用户输入。本文将详细讲解如何实现一个具有“请稍候...”文本且能定时自动关闭的等待对话框,以及提供两种不同的定时...
在IT领域,特别是软件开发与用户界面设计中,“提示框过几秒钟后自动关闭”的功能是一种常见的用户体验优化手段。此功能旨在提升用户交互的流畅性和效率,通过在一定时间后自动关闭提示信息,避免了用户手动关闭的...
在Android开发中,对话框(Dialog)是一种常见的用户交互组件,用于向用户显示临时信息或者进行简单的交互操作。本文将深入探讨如何管理和使用Android对话框,主要包括其基本概念、创建方式、自定义以及最佳实践。 ...
在C#中,`System.Timers.Timer` 类提供了一种简单的方式来创建定时任务。它可以通过设置间隔时间来触发一个事件,该事件可以在每次间隔结束后执行特定的操作。下面是一些关键属性和方法: - **Interval**:定时器的...
【标题】"TimerDlg定时关闭对话框"是一个Delphi编程中的实用示例,它展示了如何在应用程序中实现一个能够自动关闭的对话框功能。在软件开发中,有时我们需要设计一些临时性的窗口,如提示信息或者设置窗口,这些窗口...
这是我在实际工作中自己实现的一个技巧,拿出来与大家共享,自认为是好东西,所以请版主多多加分{*******************************************************}{ }{ 一种自动关闭对话框的简单方法 }{ }{ 使用方法:打开...
这是一整套自动延时关闭对话框的演示源码,可实现定时自动关闭即将弹出的对话框, 我在其中演示了三种延时自动关闭的对话框: (1)延时9秒关闭ShowMessage (2)延时8秒关闭MessageBox (3)延时8秒关闭自定义...
对话框是用户界面中的一个重要元素,它提供了一种与用户交互的方式,可以用于输入数据、显示信息或者进行一系列相关的设置操作。在Windows API中,我们可以使用MFC(Microsoft Foundation Classes)库来创建和管理...
### 九种JS弹出对话框的方法总结 #### 1. 最基本的JS弹出对话框窗口代码 最基本的JavaScript弹出对话框实现非常简单,仅需几行代码即可完成: ```javascript <!-- window.open("page.html"); //--> ``` ...
如果你使用了这些特性,关闭主窗口时,子对话框可能也会自动关闭。 在实际应用中,选择哪种方法取决于你的具体需求,如对话框的数量、是否跨线程、对话框之间的关系等。无论哪种方法,都要注意处理好资源释放、异常...