惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
Stack Overflow Blog
Stack Overflow Blog
美团技术团队
博客园_首页
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
B
Blog
D
DataBreaches.Net
腾讯CDC
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
月光博客
月光博客
V
V2EX
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
The Cloudflare Blog
博客园 - 叶小钗
Y
Y Combinator Blog

博客园 - 李阳

Sqoop执行mysql删除语句 Java采用JDBC的方式连接Hive(SparkSQL) ubuntu 升级内核 Ubuntu 13.04设置root用户登录图形界面 ubuntu make menuconfig error Oracle创建用户和表空间脚本 GPL & BSD 许可证 - 李阳 SQLServer 存储过程简介与使用方法 SQLServer 游标简介与使用说明 SQLServer 表值函数与标量值函数 定义方式与调用区别 使用Graphics画图的小技巧 灵活使用多线程编程——EventWaitHandle类 灵活使用多线程编程——AutoResetEvent类 [提问] 关于C#自定义控件的问题(请高手帮忙解决) Access数据库连接池问题 软件版本号的详解 安全的ACCESS加密方法 Oracle Hint的用法 Oracle存储过程编写经验和优化措施
调用WindowsAPI显示帮助提示
李阳 · 2009-08-10 · via 博客园 - 李阳

导言

     前一段时间,在编写程序的过程中,需要一个帮助功能按钮。这个按钮众所周知,按下按钮以后,鼠标变成带有问号的鼠标,然后点击画面上的控件,然后就回出现一个提示的文本,该处是什么含意。就好像右击“我的电脑”以后,选择属性,然后在出现的系统属性对话框中的右上角问号按钮一样。其实要实现该功能很简单,我们只需要调用C#提供的HelpProvider类就可以了,但是这里有一个问题,如果我们使用该类显示帮助,需要将窗体的HelpButton设置为True,MaximizeBox设置为False,MinimizeBox设置为False,才能使用。那么我们有什么办法,既可以让窗体有最大化最小化,又可以让我们提供帮助按钮的功能呢?

实现

     我们为了实现该功能,主要的办法是我们调用了API库“user32.dll”的SendMessage函数,该函数发送了一条消息给窗体。首先我们在使用这个函数之前,需要DLLImport相关的DLL,并且定义好相关的参数,代码如下:

[DllImport( "user32.dll", CharSet = CharSet.Auto, SetLastError = false )]
private static extern IntPtr SendMessage
( IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam );

private const int WM_SYSCOMMAND = 0x112;
private const int SC_CONTEXTHELP = 0xf180;

我们定义完毕函数以后 ,需要定义一个HelpProvider对象,该对象的作用是截断帮助的请求,并且显示相应的提示。代码如下:

   private System.Windows.Forms.HelpProvider helpProvider1;
   helpProvider1.SetHelpString( textBox1, "http://www.shehui001.com/" );//帮助所提示的内容
   helpProvider1.SetShowHelp( textBox1, true );//将帮助信息与控件绑定

最后我们实行帮助按钮仿真功能按钮,在点击的事件中,我们必须使用适当的参数调用SendMessage函数。代码如下:

  private void btnHelp_Click( object sender, EventArgs e )
  {
   // 将Capture 设置为false
, 将使控件不会接收到所有的鼠标消息: 当鼠标在窗体的外边时,窗体是不会接收到任何消息.
            btnHelp.Capture = false;
   // 利用SendMessage函数模仿帮助功能

   SendMessage( this.Handle, WM_SYSCOMMAND, ( IntPtr )SC_CONTEXTHELP, IntPtr.Zero );
  }