API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭。
-
const
-
IDTIMEDOUT=32000;
-
functionMessageBoxTimeOut(hWnd:HWND;
- lpText:PChar;lpCaption:PChar;uType:UINT;wLanguageId:WORD;
- dwMilliseconds:DWORD):Integer;stdcall;external
-
user32name'MessageBoxTimeoutA';
其实只要获得对话框的句柄就可以用时间器修改窗体或者按钮标题实现倒计时提示。
窗体激活后可以通过Hook CBT捕获HCBT_ACTIVATE
参考如下方法:
-
var
- hookHandle:THandle;
- dialogHandle:THandle;
- second:Integer;
-
functionCBTHookCallback(nCode:Integer;
- wParam:WPARAM;
- lParam:LPARAM
- ):Integer;stdcall;
-
begin
-
casenCodeof
- HCBT_ACTIVATE:
-
begin
- dialogHandle:=wParam;
-
second:=5;
- UnhookWindowsHookEx(hookHandle);
-
end;
-
end;
- Result:=CallNextHookEx(hookHandle,nCode,wParam,lParam);
-
end;
-
procedureTForm1.Button1Click(Sender:TObject);
-
begin
-
Timer1.Enabled:=True;
-
hookHandle:=SetWindowsHookEx(WH_CBT,CBTHookCallback,HInstance,0);
-
MessageBox(Handle,'Zswang路过','倒计时(5)',0);
-
end;
-
procedureTForm1.Timer1Timer(Sender:TObject);
-
begin
- Dec(second);
-
ifsecond<=0then
-
begin
-
PostMessage(dialogHandle,WM_CLOSE,0,0);
- TTimer(Sender).Enabled:=False;
-
end;
-
SetWindowText(dialogHandle,PChar(Format('倒计时(%d)',[second])));
-
end;
相对来说,C#中写得更麻烦一些,因为要自己什么API,如下是修改按钮标题的例子:
-
publicdelegateIntPtrHookProc(intnCode,IntPtrwParam,IntPtrlParam);
-
[DllImport("user32.dll")]
-
publicstaticexternIntPtrSetWindowsHookEx(inthookid,
-
HookProcpfnhook,IntPtrhinst,intthreadid);
-
[DllImport("user32.dll")]
-
publicstaticexternIntPtrCallNextHookEx(IntPtrhhook,
-
intcode,IntPtrwparam,IntPtrlparam);
-
[DllImport("kernel32.dll")]
-
publicstaticexternIntPtrGetModuleHandle(stringmodName);
-
[DllImport("user32.dll")]
-
publicstaticexternboolUnhookWindowsHookEx(IntPtrhhook);
-
publicconstintWH_CBT=5;
-
publicconstintHCBT_ACTIVATE=5;
- IntPtrhookHandle=IntPtr.Zero;
-
publicdelegateboolWNDENUMPROC(IntPtrhwnd,intlParam);
-
[DllImport("user32.dll")]
-
publicstaticexternintEnumChildWindows(IntPtrhWndParent,
-
WNDENUMPROClpEnumFunc,intlParam);
-
[DllImport("user32.dll")]
-
publicstaticexternintGetClassName(IntPtrhWnd,StringBuilderlpClassName,
-
intnMaxCount);
-
[DllImport("user32.dll")]
-
publicstaticexternintGetWindowText(IntPtrhWnd,StringBuilderlpString,
-
intnMaxCount);
-
[DllImport("user32.dll")]
-
publicstaticexternvoidSetWindowText(IntPtrhwnd,stringlpString);
-
publicboolEnumChild(IntPtrhwnd,intlParam)
- {
-
StringBuildervBuffer=newStringBuilder(256);
- GetClassName(hwnd,vBuffer,vBuffer.Capacity);
-
if(vBuffer.ToString().ToLower()=="button")
- {
-
StringBuildervText=newStringBuilder(256);
- GetWindowText(hwnd,vText,vText.Capacity);
-
if(vText.ToString().ToLower().IndexOf("&a")>=0)
-
SetWindowText(hwnd,"停不要动");
-
if(vText.ToString().ToLower().IndexOf("&r")>=0)
-
SetWindowText(hwnd,"再来一次");
-
if(vText.ToString().ToLower().IndexOf("&i")>=0)
-
SetWindowText(hwnd,"就这样吧");
- }
-
returntrue;
- }
-
privateIntPtrCBTHookCallback(intnCode,IntPtrwParam,IntPtrlParam)
- {
-
switch(nCode)
- {
-
caseHCBT_ACTIVATE:
-
EnumChildWindows(wParam,newWNDENUMPROC(EnumChild),0);
- UnhookWindowsHookEx(hookHandle);
-
break;
- }
-
returnCallNextHookEx(hookHandle,nCode,wParam,lParam);
- }
-
privatevoidbutton1_Click(objectsender,EventArgse)
- {
-
hookHandle=SetWindowsHookEx(WH_CBT,newHookProc(CBTHookCallback),
-
GetModuleHandle(null),0);
-
MessageBox.Show("Zswang路过","提示",MessageBoxButtons.AbortRetryIgnore);
- }
分享到:
相关推荐
个人总结的关于MessageBox函数的使用,方便那些使用Delphi7开发程序的用户,这下可以完全替代直接使用Showmessage()函数而产生的描述不全面的诟病。
delphi7代码编辑运行环境下,Delphi Messagebox自动关闭功能演示代码,以及可运行程序,无须任何.net编译平台,windows下原生程序。 使用方法:打开对话框前调用 SetDlgAutoClose { 参数1: 设定多长时间后关闭 }...
C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框
Wincc中弹出对话框函数MessageBox参数以及应用
C#倒计时关闭对话框VS2008源代码!Messagebox 自定义倒计时关闭!3秒钟后关闭...2秒钟后关闭...1秒钟后关闭... private void StartKiller() { Timer timer = new Timer(); timer.Interval = 3000; //3秒启动 ...
http://blog.csdn.net/flcop/article/details/16973883
自定义的messagebox使消息框居中窗口中间。
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用法 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合。 1.最简单用法,不带图形 MessageBox(0,'不同意','提示',MB_OK); MessageBox(0,'不同意','...
对话框函数快速生成器(可生成MessageBox和MssageDlg函数) 键值快速查许(查许按键的ASCII码) 注释生成器(自动折行生成注释块) Delphi常用函数说明与示例(数据库程序,显示常见Delphi函数,有说明和例子,并且...
对话框函数快速生成器(可生成MessageBox和MssageDlg函数) 键值快速查许(查许按键的ASCII码) 注释生成器(自动折行生成注释块) Delphi常用函数说明与示例(数据库程序,显示常见Delphi函数,有说明和例子,并且...
Delphi MessageBox 使用的用法
封杀MessageBox 关闭对话框 自动关闭 Message 自动关闭Message
Delphi提供了多种形式的消息对话框可以满足这些要求,尽管可以使用各种标志定制一个消息框,但仍不能将自己的图标放在消息框内,也不能修改其标准行为去创建自己的消息框,其实通过调用函数MessageBoxIndirect()就很...
定时自动关闭的对话框或消息框【Delphi】此消息框将在 8 秒钟后自动关闭,只需要在调用消息框和对话框之前调用一个函数,就可以方便的实现这种效果
* 采用系统原生API实现、而非自建窗口的土办法 * 可直接取代系统MessageBox()函数,且用法一致 * 代码环境 Delphi 7,含有完整的Demo、源码及编译结果 原创代码,可免费分享使用,严禁二次收费分享!--找不着北
worck whit messageBox delphi
#Web的MessageBox.js通知对话框 用户手册: 将MessageBox.js插入您的网站! 调用MessageBox.Show(“消息”,[MessageBoxButton],[MessageBox.type],[回调]) 里面 MessageBoxButton是要在MessageBox上显示的...
支持DEPHI7~XE5 有源码和透明图标资源看看
MessageBox方法的定义为: Function MessageBox(const Text,caption:PChar;Flags:longint=MB_OK):Integer; 这个方法的各个参数的含义如下: Text:在信息窗口中显示的文本字符串;Caption:在信息窗口的标题栏现实...