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. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值