定时关闭各种对话框

{*******************************************************}
{                                                       }
{       定时关闭各种对话框                              }
{                                                       }
{       版权所有 (C) 2007 咏南工作室(陈新光)          }
{                                                       }
{*******************************************************}

unit uTimerDlg;

interface

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

// 如果指定的时间没有操作对话框,则自动关闭
procedure ResetDlgAutoClose;
procedure SetDlgAutoClose(nTime: Integer=1000; ADoHint:Boolean=False;AReturn: 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;
  bReturn: Boolean = false;

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
      if (not bReturn) then PostMessage(hDlgWnd, WM_CLOSE, 0, 0) else
      begin
        //主要用于关闭那些关闭按钮为灰的窗口
        PostMessage(hDlgWnd,wm_KeyDown,vk_Return,0);
        PostMessage(hDlgWnd,wm_KeyUp,vk_Return,0);
      end;
      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=1000; ADoHint:Boolean=False;AReturn: 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;
  bReturn:=AReturn;
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.
 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在LabVIEW中,要实现对话框延时自动关闭,可以通过以下步骤进行操作: 1. 首先,进入LabVIEW,并创建一个新的VI。 2. 在Block Diagram面板上,拖放一个"Dialog"(对话框)的VI组件。 3. 连接该对话框组件的输出线到"Wait(ms)"(等待毫秒)的输入端。 4. 在"Wait(ms)"的输入端,设置一个适当的等待时间,即希望对话框显示的时间。 5. 连接"Wait(ms)"的输出线到"Dialog"组件的输入端。 6. 在"Dialog"组件的属性中,设置对话框的样式、标题、提示信息等等。 7. 连接"Dialog"组件的输出线到Block Diagram面板上的其他控件或处理结构,以定义对话框弹出后的操作或逻辑。 8. 编译并运行该VI。 通过以上步骤,LabVIEW中的对话框将会在指定的等待时间后自动关闭。这种方法可以在需要延时自动关闭对话框的LabVIEW程序中使用,以改善用户界面和用户体验。 ### 回答2: 在LabVIEW中,可以使用以下步骤实现对话框的延时自动关闭: 1. 首先,创建一个VI(虚拟仪器)来实现这个功能。在VI中,将需要弹出对话框的代码放置在“While循环”中。 2. 在开始之前,我们需要定义一个记数器变量来计算延时时间。可以使用“计时器”或“循环计数”组件来实现该功能。 3. 在对话框弹出的前面,添加一个判断语句来检查记数器的值是否达到了预定的延时时间。 4. 如果记数器没有达到预设时间,就将记数器加一,然后继续循环。 5. 如果记数器达到了预定时间,就自动关闭对话框。可以使用“关闭VI”函数或“取消显示对话框”函数来关闭对话框。 6. 在循环结束之后,需要释放内存和关闭VI。 通过以上步骤,可以实现LabVIEW对话框延时自动关闭的功能。这样,在弹出对话框后,它将会自动关闭,而不需要用户手动关闭。这对于需要在一定时间后自动关闭对话框的应用场景非常有用。 ### 回答3: 在LabVIEW中,可以利用Timed Loop结构和Dialog Timeout Express VI实现对话框的延时自动关闭。 首先,将对话框控件放置在主VI的界面上。然后,在Timed Loop结构内部创建一个子VI,用于执行一个定时的延时操作。在子VI内部,使用Dialog Timeout Express VI来实现对话框的自动关闭。这个VI的输入参数包括对话框及其ID、延时时间等。在子VI中,将延时时间作为输入传递给Dialog Timeout Express VI,并将对话框及其ID连接到该VI的相应输入终端。这样,当子VI被启动后,对话框会在指定的延时时间后自动关闭。 在主VI中,将子VI的输出结果与对话框控件的输入终端连接起来,以实现对话框的显示。通过控制子VI的启动和停止,可以控制对话框的出现和关闭。 需要注意的是,Timed Loop结构的定时器设置应与子VI的延时时间相同,以保证对话框在正确的时间后关闭。 以上是一种基于LabVIEW的实现方式,通过Timed Loop结构和Dialog Timeout Express VI可以实现对话框的延时自动关闭

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值