在C#中使用热键隐含窗口

在C#中采用的是事件驱动方式,但在我们使用的过程中,有时候通过调用系统原有的消息,处理起来会比较简单一些,特别是在处理与DLL文件的交互时,的确是非常的方便。
在C#中使用自定义消息
在C#中使用自定义消息非常简单,只需要下面几个简单的步骤就可以了:
1、 定义消息
定义消息的方法和VC中定义消息有一点点不同
比如在VC中申明一个自定义消息:
#define WM_TEST WM_USER + 101
而在c#中消息需要定义成windows系统中的原始的16进制数字,比如自定义消息
public const int USER = 0x0400;
那么我们在VC中申明的自定义消息,在C#中就可以做对应的声明:
public const int WM_TEST = USER+101;

2、 发送消息
消息发送是通过windows提供的API函数SendMessage来实现的,它的原型定义: [DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
uint wParam, // first message parameter
uint lParam // second message parameter
);
3、 消息接收
消息发出之后,在Form中如何接收呢?我们可以重载DefWinproc函数来接收消息。
protected override void DefWndProc ( ref System.Windows.Forms.Message m )
{
switch(m.Msg)
{
case Message.WM_TEST: //处理消息
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
在C#中使用系统消息
我们以WM_PAINT消息的处理为例,在C#中处理消息与MFC的消息处理是类似的,但更为简单。MFC中需要使用DECLARE_MESSAGE_MAP来定义消息映射,在C#就不需要了。比如WM_PAINT消息,我们只要重载父类中的OnPaint虚拟方法即可,方法如下:
在菜单View->Other Windows->Object Browser打开对象浏览窗口(或用CTRL+ALT+J打开),在我们的工程名下找到Form并选中,这时在右边的窗口列出所有Form类的成员函数,如图所示:

我们选中OnPaint(System.WinForms.PaintEventArgs)此时在下面会显示完整的OnPaint函数protected void OnPaint ( System.WinForms.PaintEventArgs e )我们将这一行字符串Copy下来。打开Form1.cs进行代码编辑,我们把刚才拷贝下来的函数定义复制到Form1类里面,并加上override关键字,此时我们便可以在里面添加我们的消息处理代码了,请参考如下代码段:
protected override void OnPaint (System.Windows.Forms.PaintEventArgs e )
{
Font font = new Font("黑体",28);///定义字体:黑体,大小:28
SolidBrush bluepen = new SolidBrush(Color.Blue);///创建蓝色画笔
SolidBrush blackpen = new SolidBrush(Color.FromARGB(0xa0,0xa0,0xb0));///创建黑色画笔
e.Graphics.DrawString("VC知识库",font,blackpen,65,25);///写字符串
e.Graphics.DrawString("VC知识库",font,bluepen,61,21);///偏移4个象素用不同的颜色再写一次,达到立体效果
}
示例应用
1、 定义消息
我们在工程中添加一个Message类用来定义消息。然后添加了三个成员变量,其中USER为自定义消息的初始值,相当与MFC中的WM_USER。WM_TEST为自定义的用来响应应用程序的消息,WM_MSG为自定义的用来响应DLL传递过来的消息。如何在DLL定义消息请参考文章:VC.Net从DLL传递消息到DLL。
public class Message
{
public const int USER = 0x0400;
//as mfc Define WM_TEST WM_USER + 101
public const int WM_TEST = USER+101;
public const int WM_MSG = USER+102;
}
2、 声明引用函数
在使用消息的地方,申明引用的函数,我们这里在MsgForm.cs文件中申明:
//申明发送消息函数
[DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
uint wParam, // first message parameter
uint lParam // second message parameter
);

//申明DLL中启动消息函数
[DllImport("MessageDLL.dll",EntryPoint="StartSendMessage")]
private extern static void StartSendMessage(IntPtr hWnd);

3、 处理系统消息
protected override void OnPaint ( System.Windows.Forms.PaintEventArgs e )
{
///定义字体:黑体,大小:28
Font font = new Font("黑体",28);
///创建蓝色画笔
SolidBrush bluepen = new SolidBrush(Color.Blue);
///创建黑色画笔
SolidBrush blackpen = new SolidBrush(Color.FromArgb(0xa0,0xa0,0xb0));
///写字符串
e.Graphics.DrawString("VC知识库",font,blackpen,65,25);
///偏移4个象素用不同的颜色再写一次,达到立体效果
e.Graphics.DrawString("VC知识库",font,bluepen,61,21);
}
4、 触发自定义消息

//测试应用程序消息
private void TestAppbutton_Click(object sender, System.EventArgs e)
{
SendMessage(this.Handle,Message.WM_TEST,100,200);
}
//测试DLL消息
private void TestDLLbutton_Click(object sender, System.EventArgs e)
{
StartSendMessage(this.Handle);
}

5、 响应和处理自定义消息
protected override void DefWndProc ( ref System.Windows.Forms.Message m )
{
string message;
switch(m.Msg)
{
case Message.WM_TEST://处理消息
message = string.Format("收到从应用程序发出的消息!参数为:{0},{1}",m.WParam,m.LParam);
MessageBox.Show(message);///显示一个消息框
break;
case Message.WM_MSG:
message = string.Format("收到从DLL发出的消息!参数
为:{0},{1}",m.WParam,m.LParam);
MessageBox.Show(message);///显示一个消息框
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。

break;
}
}
程序运行结果:
当我们点击测试DLL消息时,弹出消息框显示收到消息的参数,窗口也会调用WM_PAIN函数对窗口进行重新绘制。

时间: 2024-11-08 18:28:50

在C#中使用热键隐含窗口的相关文章

在WinForm中注册热键

Q:WinForm 如何注册热键? A: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.DirectoryServices; using System.Runtime.InteropServ

使用Excel中画一个登陆窗口的方法

使用Excel中画一个登陆窗口的方法   第1步:全选工作表,填充灰色背景. 第2步:选中中间一块区域,填充15%灰色. 第3步:浅灰色区域设置边线,右边线和下边线设置黑粗线条,左和上边线设置白粗线条. 第4步:添加标题栏.在中间区间第一行填充蓝色背景和白粗字体.输入标题. 第5步:添加文本框.文本框的和窗体边线设置正好相反.右和下边线设置为白色边线,左和上边线设置为黑色边线. 第6步:设置按钮.按钮右和下边线设置黑色线条,左和上边线设置白色线条.按钮所在单元格填充最浅的灰色. 第7步:添加窗体

Excel2007冻结窗口,表格中如何“横竖”固定窗口

我们常常在Excel中查看规模比较大的工作表时,都比较难比较表中的不同部分的数据,这时候我们就可以利用工作表中的冻结窗口功能来固定窗口,将某几行或某几列的数据冻结起来,这样如果滚动窗口时,这几行或这几列数据就会被固定住,而不会随着其他单元格的移动而移动. 一般来说,冻结的工作表行标题和列标题可以将屏幕外的单元格与行标题和列标题相对应起来,非常方便我们查看.下面就一起来学习在Excel2007中是如何冻结窗口的! Excel2007冻结窗口之--横向冻结某行方法: ①如果要冻结某行,首先需要选中它

电脑中打开图片另存为窗口没有可以保存到桌面的选项如何解决

  电脑中打开图片另存为窗口没有可以保存到桌面的选项如何解决          1.如果要保存一张图片,通常会右击图片,选择"图片另存为"; 2.但是打开的另存为窗口却没有可以保存到桌面的选项; 3.这时可以右击左侧的"库",选择"新建"; 4.新建的库可以命名为"桌面"; 5.点击这个新建的库"桌面",点击"包括一个文件夹"; 6.点击左上角的用户文件夹,可以在里面看到桌面的图标,并双

Word2007中怎么并排查看窗口?

  Word2007具有多个文档窗口并排查看的功能,通过多窗口并排查看,可以对不同窗口中的内容进行比较.在Word2007中实现并排查看窗口的步骤如下所述: 第1步,打开两个或两个以上Word2007文档窗口,在当前文档窗口中切换到"视图"功能区.然后在"窗口"分组中单击"并排查看"命令,如图2008081309所示. 图2008081309 单击"并排查看"命令 第2步,在打开的"并排比较"对话框中,选择

win7系统中如何禁止改变窗口颜色的方法

  大家都知道,电脑中很多的设置都是系统默认好的,一般情况下不手动调整都不会有多大的改变,比如说电脑的字体和字号,每次打开电脑都是固定的样式,这就是系统默认的作用.其实除了文字和字号之外,窗口的颜色也是系统默认好的,但是有些年轻人都喜欢自定义主题,把窗口的颜色也顺便改变了,那么该如果把窗口的颜色恢复到默认的样式呢?下面小编就来帮大家解答如何在win7电脑中禁止窗口颜色改变. win7系统中如何禁止改变窗口颜色的方法如下 第一步:我们需要进入win7本地策略窗口,具体进入方法可通过运行窗口(组合键

如何在ghost win7中快速打开网络连接窗口?

  上网的过程中遇到网络相关的问题是很正常的,那么如何解决呢?这个时候,咱们就很有可能会涉及到打开ghost win7 64位旗舰版下载中的网络连接窗口了,但是大家也知道,在ghost win7中要打开网络连接窗口的话,就需要很多繁琐的步骤,例如需要先进入到控制面板界面中,然后依次进入到网络共享中心-网路和Internet窗口,之后,咱们才能找到网络连接,每次这样的操作大家会不会也觉得很麻烦呢?今天,小编就来介绍一个在ghost win7中打开网络连接的简便方法吧!下面,小编将具体的操作步骤分享

java ee-EL表达式中对pageContext隐含对象

问题描述 EL表达式中对pageContext隐含对象 这个pageContext对象是不是等于就是JSP里的.不清楚地方是通过pageContext访问的其他8个JSP内置对象 ,调用的方法怎么和servelt中不一样呢.例如${pageContext.request.queryString} queryString方法 就是HttpServletRequest.getQueryString(), JSP里内置对象的方法还是和对应Servlet的一模一样. 只是在EL中都如此去掉了get对吗?

winform-Winform中如何保持登录窗口在主窗口的前面

问题描述 Winform中如何保持登录窗口在主窗口的前面 Winform中如何保持登录窗口在主窗口的前面,并且只有输入了正确的密码,才能切换掉主窗口? 解决方案 窗体.ShowDialog() 解决方案二: 一般是通过登录窗口验证到主窗口的,为何要保持在前面 解决方案三: 参考winform登陆后关闭登录窗口跳转到主窗体 解决方案四: 先做个你想要提前显示的窗体,然后用这个窗体类在form_load函数中创建对象,然后显示这个窗体即可.