{******************************************************
{
{ 一种自动关闭对话框的简单方法
{
{ 使用方法:打开对话框前调用 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好友下载,交流分享
这是我在实际工作中自己实现的一个技巧,拿出来与大家共享,自认为是好东西,所以请版主多多加分{*******************************************************}{ }{ 一种自动关闭对话框的简单方法 }{ }{ 使用方法:打开...
这是一整套自动延时关闭对话框的演示源码,可实现定时自动关闭即将弹出的对话框, 我在其中演示了三种延时自动关闭的对话框: (1)延时9秒关闭ShowMessage (2)延时8秒关闭MessageBox (3)延时8秒关闭自定义...
内容索引:VB源码,界面编程,对话框 VB制作多用途可的对话框,一种是可以自动关闭的对话框,设定时间,到时无需手动关闭;第二是打开一个始终居中的对话框;第三个是自定义对话框中的字体,系统字体随你选择。
第一种是修改注册表 这种方法比较麻烦,而且要求对注册表有一定的了解。 第1步:运行注册表编辑器,依次展开 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] 分支,然后在右侧窗口...
Activities提供了一种方便管理的创建、保存、回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过...
这三种提示框会在2秒后自动关闭。 3. 隐藏提示框 在调用新的show之前,SimpleHUD会自动关闭正在显示的HUD。 也可以使用SimpleHUD.dismiss(); 方法手动关闭。 4. 替换icon 四个图标在drawable文件夹内,使用相同...
使用粘贴URL对话框从剪贴板粘贴整个网址,创建一个新的网站,或直接从主菜单中启动一个现有的,或一种上传软件在程序启动时自动重新连接到上次访问站点。 代理/袜子/ Firewall-CuteFTP允许你通过代理连接,袜子,或防火墙...
命令行的改变、颜色、光标、选项 对话框的部分设置方法;工具栏的打开、关闭;画图的几种方式及特点:命令、 图标工具、菜单。 2. 简单图形的绘制:基本图形点、直线、射线、矩形、正多边形、圆、圆弧、椭圆、 样条...
用户选择某种外部语言便可以动态切换到新语言界面,无需重新启动程序,用户的语言选择将自动保存到RadminM.ini文件中,关闭程序后下次启动也会自动使用用户选择的新语言界面。 用户可以参照English.lng语言文件的...
如何通过一种开发语言能高效的设计出这个系统是一个值考虑的一个需求。由于现代计算机网络技术的快速发展,信息已遍布全球。再加上现代考试的普及。网络已成为大众化的产物,所以将考试系统与网络相联,是很有意义的...
这里有另外一种方法,如果你想多学一点东西,请接着往下看。 选中所有的尾注文本,点“格式︱字体”,改为“隐藏文字”,切换到普通视图,选择“视图︱脚注”,此时所有的尾注出现在窗口的下端,在“尾注”下拉列表...
13.微机的键盘是一种分离式的智能键盘,通过电缆与主机连接。( Y ) 14.计算机的常用输出设备有打印机和键盘。( N) 15.汉字语音识别输入技术属于汉字智能输入技术。( Y ) 16.硬盘安装在主机箱内,一般用符号C:...
如果您不需要弹出这个对话框,有两种方式。 方法一:设置权限不可访问 打开终端 cd /Library/Application\ Support/Microsoft/MAU2.0 sudo chmod 000 Microsoft\ AutoUpdate.app 输入密码。这样Microsoft ...
显示主界面的方法有两种: i. 【时钟提醒】界面显示时,单击【启】即可启动程序主界面。 ii. 再次运行程序(参考a栏目)可将程序主界面显示出来。 h) 网络校时: i. 单击【系统校时】程序将自动校时(注意校时为北京...
弹出一个提醒对话框,可自定义提醒文字内容 启动或打开一个文件(也可以不是执行文件,TXT、DOC都可以),可自定义程序或文件,废话 !提示并启动程序,和上面一样,只是界时会有20秒倒计时的提示窗 !进入休眠模式 ...
十一、提供两种模式的版本更新,一种是对话框显示下载进度,一种是通知栏显示后台默默下载形式 github:https://github.com/MZCretin/AutoUpdateProject 注:本文为转载作品,观看原文请移步github网址。
用户选择某种外部语言便可以动态切换到新语言界面,无需重新启动程序,用户的语言选择将自动保存到RadminM.ini文件中,关闭程序后下次启动也会自动使用用户选择的新语言界面。 用户可以参照English.lng语言文件的...
关闭编辑器,将自动返回到刚才的Excel表,选择“工具→宏→宏”,将弹出如下对话框:(见图3) 方法二:公式填充法 相比宏命令,公式填充法更便于理解,不过需要手工操作的步骤稍微多一些,“鱼和熊掌不可得兼”...