首页 > 开发 > 综合 > 正文

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

2024-07-21 02:18:36
字体:
来源:转载
供稿:网友
在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函数对窗口进行重新绘制。





发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表