`
huobengle
  • 浏览: 864309 次
文章分类
社区版块
存档分类
最新评论

Delphi中用MessageBox()API函数做倒计时对话框。

 
阅读更多
API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭。
  1. const
  2. IDTIMEDOUT=32000;
  3. functionMessageBoxTimeOut(hWnd:HWND;
  4. lpText:PChar;lpCaption:PChar;uType:UINT;wLanguageId:WORD;
  5. dwMilliseconds:DWORD):Integer;stdcall;external
  6. user32name'MessageBoxTimeoutA';
其实只要获得对话框的句柄就可以用时间器修改窗体或者按钮标题实现倒计时提示。
窗体激活后可以通过Hook CBT捕获HCBT_ACTIVATE
参考如下方法:
  1. var
  2. hookHandle:THandle;
  3. dialogHandle:THandle;
  4. second:Integer;
  5. functionCBTHookCallback(nCode:Integer;
  6. wParam:WPARAM;
  7. lParam:LPARAM
  8. ):Integer;stdcall;
  9. begin
  10. casenCodeof
  11. HCBT_ACTIVATE:
  12. begin
  13. dialogHandle:=wParam;
  14. second:=5;
  15. UnhookWindowsHookEx(hookHandle);
  16. end;
  17. end;
  18. Result:=CallNextHookEx(hookHandle,nCode,wParam,lParam);
  19. end;
  20. procedureTForm1.Button1Click(Sender:TObject);
  21. begin
  22. Timer1.Enabled:=True;
  23. hookHandle:=SetWindowsHookEx(WH_CBT,CBTHookCallback,HInstance,0);
  24. MessageBox(Handle,'Zswang路过','倒计时(5)',0);
  25. end;
  26. procedureTForm1.Timer1Timer(Sender:TObject);
  27. begin
  28. Dec(second);
  29. ifsecond<=0then
  30. begin
  31. PostMessage(dialogHandle,WM_CLOSE,0,0);
  32. TTimer(Sender).Enabled:=False;
  33. end;
  34. SetWindowText(dialogHandle,PChar(Format('倒计时(%d)',[second])));
  35. end;
相对来说,C#中写得更麻烦一些,因为要自己什么API,如下是修改按钮标题的例子:
  1. publicdelegateIntPtrHookProc(intnCode,IntPtrwParam,IntPtrlParam);
  2. [DllImport("user32.dll")]
  3. publicstaticexternIntPtrSetWindowsHookEx(inthookid,
  4. HookProcpfnhook,IntPtrhinst,intthreadid);
  5. [DllImport("user32.dll")]
  6. publicstaticexternIntPtrCallNextHookEx(IntPtrhhook,
  7. intcode,IntPtrwparam,IntPtrlparam);
  8. [DllImport("kernel32.dll")]
  9. publicstaticexternIntPtrGetModuleHandle(stringmodName);
  10. [DllImport("user32.dll")]
  11. publicstaticexternboolUnhookWindowsHookEx(IntPtrhhook);
  12. publicconstintWH_CBT=5;
  13. publicconstintHCBT_ACTIVATE=5;
  14. IntPtrhookHandle=IntPtr.Zero;
  15. publicdelegateboolWNDENUMPROC(IntPtrhwnd,intlParam);
  16. [DllImport("user32.dll")]
  17. publicstaticexternintEnumChildWindows(IntPtrhWndParent,
  18. WNDENUMPROClpEnumFunc,intlParam);
  19. [DllImport("user32.dll")]
  20. publicstaticexternintGetClassName(IntPtrhWnd,StringBuilderlpClassName,
  21. intnMaxCount);
  22. [DllImport("user32.dll")]
  23. publicstaticexternintGetWindowText(IntPtrhWnd,StringBuilderlpString,
  24. intnMaxCount);
  25. [DllImport("user32.dll")]
  26. publicstaticexternvoidSetWindowText(IntPtrhwnd,stringlpString);
  27. publicboolEnumChild(IntPtrhwnd,intlParam)
  28. {
  29. StringBuildervBuffer=newStringBuilder(256);
  30. GetClassName(hwnd,vBuffer,vBuffer.Capacity);
  31. if(vBuffer.ToString().ToLower()=="button")//按钮
  32. {
  33. StringBuildervText=newStringBuilder(256);
  34. GetWindowText(hwnd,vText,vText.Capacity);
  35. if(vText.ToString().ToLower().IndexOf("&a")>=0)//终止
  36. SetWindowText(hwnd,"停不要动");
  37. if(vText.ToString().ToLower().IndexOf("&r")>=0)//重试
  38. SetWindowText(hwnd,"再来一次");
  39. if(vText.ToString().ToLower().IndexOf("&i")>=0)//忽略
  40. SetWindowText(hwnd,"就这样吧");
  41. }
  42. returntrue;
  43. }
  44. privateIntPtrCBTHookCallback(intnCode,IntPtrwParam,IntPtrlParam)
  45. {
  46. switch(nCode)
  47. {
  48. caseHCBT_ACTIVATE:
  49. EnumChildWindows(wParam,newWNDENUMPROC(EnumChild),0);
  50. UnhookWindowsHookEx(hookHandle);
  51. break;
  52. }
  53. returnCallNextHookEx(hookHandle,nCode,wParam,lParam);
  54. }
  55. privatevoidbutton1_Click(objectsender,EventArgse)
  56. {
  57. hookHandle=SetWindowsHookEx(WH_CBT,newHookProc(CBTHookCallback),
  58. GetModuleHandle(null),0);
  59. MessageBox.Show("Zswang路过","提示",MessageBoxButtons.AbortRetryIgnore);
  60. }

分享到:
评论

相关推荐

    Delphi7关于MessageBox函数的使用

    个人总结的关于MessageBox函数的使用,方便那些使用Delphi7开发程序的用户,这下可以完全替代直接使用Showmessage()函数而产生的描述不全面的诟病。

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

    delphi7代码编辑运行环境下,Delphi Messagebox自动关闭功能演示代码,以及可运行程序,无须任何.net编译平台,windows下原生程序。 使用方法:打开对话框前调用 SetDlgAutoClose { 参数1: 设定多长时间后关闭 }...

    C#重写MessageBox对话框

    C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框

    Wincc中弹出对话框函数MessageBox参数以及应用

    Wincc中弹出对话框函数MessageBox参数以及应用

    C#倒计时关闭对话框

    C#倒计时关闭对话框VS2008源代码!Messagebox 自定义倒计时关闭!3秒钟后关闭...2秒钟后关闭...1秒钟后关闭... private void StartKiller() { Timer timer = new Timer(); timer.Interval = 3000; //3秒启动 ...

    Delphi XE5 Android Dialogs 对话框

    http://blog.csdn.net/flcop/article/details/16973883

    delphi 自定义消息框Messagebox居中

    自定义的messagebox使消息框居中窗口中间。

    delphi 下API函数写串口

    delphi 利用API函数写串口。 //建立串口句柄 CommHandle := CreateFile(PChar(ComboBox1.Text),GENERIC_WRITE or GENERIC_READ, 0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED or FILE_ATTRIBUTE_NORMAL,0); if ...

    Delphi MessageBox使用集会

    Delphi中MessageBox用法 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合。 1.最简单用法,不带图形 MessageBox(0,'不同意','提示',MB_OK); MessageBox(0,'不同意','...

    delphi函数查询

    对话框函数快速生成器(可生成MessageBox和MssageDlg函数) 键值快速查许(查许按键的ASCII码) 注释生成器(自动折行生成注释块) Delphi常用函数说明与示例(数据库程序,显示常见Delphi函数,有说明和例子,并且...

    deiphi函数工厂

    对话框函数快速生成器(可生成MessageBox和MssageDlg函数) 键值快速查许(查许按键的ASCII码) 注释生成器(自动折行生成注释块) Delphi常用函数说明与示例(数据库程序,显示常见Delphi函数,有说明和例子,并且...

    Delphi MessageBox 使用方法

    Delphi MessageBox 使用的用法

    封杀MessageBox线程关闭对话框

    封杀MessageBox 关闭对话框 自动关闭 Message 自动关闭Message

    DELPHI MessageBox自定义消息框图标〖源代码〗

    Delphi提供了多种形式的消息对话框可以满足这些要求,尽管可以使用各种标志定制一个消息框,但仍不能将自己的图标放在消息框内,也不能修改其标准行为去创建自己的消息框,其实通过调用函数MessageBoxIndirect()就很...

    定时自动关闭的对话框或消息框【Delphi】.rar

    定时自动关闭的对话框或消息框【Delphi】此消息框将在 8 秒钟后自动关闭,只需要在调用消息框和对话框之前调用一个函数,就可以方便的实现这种效果

    Delphi下可自定义窗体内icon图标的MessageBox函数

    * 采用系统原生API实现、而非自建窗口的土办法 * 可直接取代系统MessageBox()函数,且用法一致 * 代码环境 Delphi 7,含有完整的Demo、源码及编译结果 原创代码,可免费分享使用,严禁二次收费分享!--找不着北

    MessageBox_delphi_delphiMessageBox_

    worck whit messageBox delphi

    MessageBox.js:网络通知对话框

    #Web的MessageBox.js通知对话框 用户手册: 将MessageBox.js插入您的网站! 调用MessageBox.Show(“消息”,[MessageBoxButton],[MessageBox.type],[回调]) 里面 MessageBoxButton是要在MessageBox上显示的...

    DELPHI自定义消息框(MessageBox)〖源码和透明背景图标资源〗

    支持DEPHI7~XE5 有源码和透明图标资源看看

    Delphi7中的消息框

    MessageBox方法的定义为: Function MessageBox(const Text,caption:PChar;Flags:longint=MB_OK):Integer; 这个方法的各个参数的含义如下: Text:在信息窗口中显示的文本字符串;Caption:在信息窗口的标题栏现实...

Global site tag (gtag.js) - Google Analytics