Delphi中用MessageBox()API函数做倒计时对话框(使用Hook安装CBTHookCallback,计时器更改文字,SetWindowText API真正修改文字,引用未知函数)good
API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭。
- const
- IDTIMEDOUT = 32000;
- function MessageBoxTimeOut(hWnd: HWND;
- lpText: PChar; lpCaption: PChar; uType: UINT; wLanguageId: WORD;
- dwMilliseconds: DWORD): Integer; stdcall; external
- user32 name 'MessageBoxTimeoutA';
其实只要获得对话框的句柄就可以用时间器修改窗体或者按钮标题实现倒计时提示。
窗体激活后可以通过Hook CBT捕获HCBT_ACTIVATE
参考如下方法:
- var
- hookHandle: THandle;
- dialogHandle: THandle;
- second: Integer;
- function CBTHookCallback(nCode: Integer;
- wParam: WPARAM;
- lParam: LPARAM
- ): Integer; stdcall;
- begin
- case nCode of
- HCBT_ACTIVATE:
- begin
- dialogHandle := wParam;
- second := 5;
- UnhookWindowsHookEx(hookHandle);
- end;
- end;
- Result := CallNextHookEx(hookHandle, nCode, wParam, lParam);
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Timer1.Enabled := True;
- hookHandle := SetWindowsHookEx(WH_CBT, CBTHookCallback, HInstance, 0);
- MessageBox(Handle, 'Zswang 路过', '倒计时(5)', 0);
- end;
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
- Dec(second);
- if second <= 0 then
- begin
- PostMessage(dialogHandle, WM_CLOSE, 0, 0);
- TTimer(Sender).Enabled := False;
- end;
- SetWindowText(dialogHandle, PChar(Format('倒计时(%d)', [second])));
- end;
相对来说,C#中写得更麻烦一些,因为要自己什么API,如下是修改按钮标题的例子:
- public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
- [DllImport("user32.dll")]
- public static extern IntPtr SetWindowsHookEx(int hookid,
- HookProc pfnhook, IntPtr hinst, int threadid);
- [DllImport("user32.dll")]
- public static extern IntPtr CallNextHookEx(IntPtr hhook,
- int code, IntPtr wparam, IntPtr lparam);
- [DllImport("kernel32.dll")]
- public static extern IntPtr GetModuleHandle(string modName);
- [DllImport("user32.dll")]
- public static extern bool UnhookWindowsHookEx(IntPtr hhook);
- public const int WH_CBT = 5;
- public const int HCBT_ACTIVATE = 5;
- IntPtr hookHandle = IntPtr.Zero;
- public delegate bool WNDENUMPROC(IntPtr hwnd, int lParam);
- [DllImport("user32.dll")]
- public static extern int EnumChildWindows(IntPtr hWndParent,
- WNDENUMPROC lpEnumFunc, int lParam);
- [DllImport("user32.dll")]
- public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,
- int nMaxCount);
- [DllImport("user32.dll")]
- public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString,
- int nMaxCount);
- [DllImport("user32.dll")]
- public static extern void SetWindowText(IntPtr hwnd, string lpString);
- public bool EnumChild(IntPtr hwnd, int lParam)
- {
- StringBuilder vBuffer = new StringBuilder(256);
- GetClassName(hwnd, vBuffer, vBuffer.Capacity);
- if (vBuffer.ToString().ToLower() == "button") // 按钮
- {
- StringBuilder vText = new StringBuilder(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, "就这样吧");
- }
- return true;
- }
- private IntPtr CBTHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
- {
- switch (nCode)
- {
- case HCBT_ACTIVATE:
- EnumChildWindows(wParam, new WNDENUMPROC(EnumChild), 0);
- UnhookWindowsHookEx(hookHandle);
- break;
- }
- return CallNextHookEx(hookHandle, nCode, wParam, lParam);
- }
- private void button1_Click(object sender, EventArgs e)
- {
- hookHandle = SetWindowsHookEx(WH_CBT, new HookProc(CBTHookCallback),
- GetModuleHandle(null), 0);
- MessageBox.Show("Zswang 路过", "提示", MessageBoxButtons.AbortRetryIgnore);
- }
http://blog.csdn.net/zswang/article/details/3081063
Delphi中用MessageBox()API函数做倒计时对话框(使用Hook安装CBTHookCallback,计时器更改文字,SetWindowText API真正修改文字,引用未知函数)good的更多相关文章
- Restful风格API中用put还是post做新增操作有什么区别?
Restful风格API中用put还是post做新增操作有什么区别? 转 头条面试归来,有些话想和Java开发者说!>>> 这个是华为面试官问我的问题,回来我找了很多资料,想验证这个 ...
- 用CIL写程序:写个函数做加法
前言: 上一篇文章小匹夫为CIL正名的篇幅比较多,反而忽略了写那篇文章初衷--即通过写CIL代码来熟悉它,了解它.那么既然有上一篇文章做基础(炮灰),想必各位对CIL的存在也就释然了,兴许也燃起了一点 ...
- RCurl getURL()函数做debug
getURL()函数做获取网页做debug,三步骤 1.首先创建一个对象debugGatherer(),该对象包含三个函数:(update(), value(), reset()); R> de ...
- 阿里云api调用做简单的cmdb
阿里云api调用做简单的cmdb 1 步骤 事实上就是调用阿里api.获取可用区,比方cn-hangzhou啊等等.然后在每一个区调用api 取ecs的状态信息,最好写到一个excel里面去.方便排序 ...
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- python3中匿名函数做参数,匿名函数做实参,eval关键字
一:说到匿名函数,大家都感到陌生又熟悉,今天我带大家了解一下py3中的匿名函数,以及匿名函数作为函数的参数的情况 主要通过以下实例来说明: 实例一: newarr =[33,44444,6222,88 ...
- C++ 友元 (全局函数做友元) (类做友元) (成员函数做友元)
1 //友元 全局函数做友元 2 /* 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 7 ...
- 【Go语言学习笔记】函数做参数和闭包
函数做参数 在Go语言中,函数也是一种数据类型,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型.类似于重写(同名覆盖). 回调函数:函数有一个参数是函数类型,这个 ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
随机推荐
- Google Android Studio Kotlin
Google Android Studio Kotlin 开发环境配置 Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对 ...
- 【hdu2457】ac自动机 + dp
传送门 题目大意: 给你一个字符主串和很多病毒串,要求更改最少的字符使得没有一个病毒串是主串的子串. 题解: ac自动机 + dp,用病毒串建好ac自动机,有毒的末尾flag置为true 构建fail ...
- 【13.77%】【codeforces 734C】Anton and Making Potions
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- iOS开发 - OC - block的详解 - 深入篇
深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...
- 获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录
获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录 ===========================获取全局上下文(getA ...
- poj1639 Picnic Planning,K度限制生成树
题意: 矮人虽小却喜欢乘坐巨大的轿车,车大到能够装下不管多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了集中到聚餐地点,矮人A 要么开车到矮人B 家中,留下自己的轿车在矮人B 家,然后乘坐B ...
- 把搜狗输入法词库导入Google拼音输入法
为PC端Google拼音输入法增加词库 为什么折腾词库 都在说百度.讯飞等输入法上传用户词库,为了安全建议大家使用google输入法之类,话说回来,要想使用智能联想功能是不是就得把你输入习惯放在他的里 ...
- andriod 实现新浪、QQ场地、朋友微信圈、微信朋友分享功能
前言:在自己的学习过程中的一些操作,分享一些理解. 下面将说明什么: 下载链接:http://download.csdn.net/detail/u014608640/7490357 首先.我们须要去S ...
- Java SpringMVC实现国际化整合案例分析(i18n) 专题
所谓国际化就是支持多种语言,web应用在不同的浏览环境中可以显示出不同的语言,比如说汉语.英语等.下面我将以具体的实例来举例说明: (1)新建动态Javaweb项目,并导入几个SpringMVC必需的 ...
- session_start()的逻辑
//session_start -Start new or resume existing session session_start(); print_r($_SESSION); //看有没有ses ...