`
leonardleonard
  • 浏览: 821620 次
社区版块
存档分类
最新评论

C#中在应用程序和DLL使用消息

阅读更多
在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函数对窗口进行重新绘制。 

 
分享到:
评论

相关推荐

    C#中在应用程序和DLL使用消息[归纳].pdf

    C#中在应用程序和DLL使用消息[归纳].pdf

    C#应用程序调用C#编写的dll,C#编写的dll调用C++编写的dll

    5. **调用方法**:现在可以在C#应用程序中直接使用DLL中定义的类和方法,如同调用本地类一样。 接下来,我们讨论C# DLL如何调用C++ DLL。由于.NET框架和C++运行时环境不兼容,我们需要使用P/Invoke(Platform ...

    C#中加载和卸载DLL

    `AppDomain`可以视为一个独立的应用程序域,每个`AppDomain`都有自己的类加载器和安全边界。当一个`AppDomain`被卸载时,其中的所有资源也会被释放。 下面是一个具体的示例: ```csharp using System; using ...

    C# 钩子 程序(DLL)

    在实际使用时,你需要在主应用程序中加载并调用DLL中的`InstallKeyboardHook`函数来安装钩子。然后,当系统发生指定的事件时,你的钩子程序就会被调用。 注意,钩子编程需要谨慎操作,因为它可能会对系统性能造成...

    C#开发和调用DLL动态库的程序Demo

    在.NET框架中,C#是一种常用的编程语言,它支持创建和使用DLL(Dynamic Link Library)动态链接库。DLL是Windows操作系统中的一个重要组成部分,允许不同应用程序共享代码和资源,从而节省内存并提高执行效率。本...

    C#程序(含多个Dll)合并成一个Exe的简单方法

    在C#编程中,开发人员经常需要引用外部的DLL库以增强应用程序的功能。然而,这会导致最终的可执行文件(EXE)依赖于这些DLL,使得应用程序不能独立运行。为了解决这个问题,开发者可以采用将多个DLL合并到一个EXE...

    C++调用C#的DLL实例程序

    这些方法需要使用.NET Framework的特性进行标记,以便其他.NET应用程序能够识别和调用。 接着,让我们转向C++。由于C++并不直接支持.NET框架,因此调用C#的DLL需要使用C++/CLI(Managed C++),这是一种扩展的C++...

    C#Winform动态调用C++和C#的Dll

    DLL文件包含可执行代码和数据,当一个应用程序运行时,它可以通过系统加载器来加载和使用DLL中的函数。在C#中,我们可以使用`DllImport`属性来标记外部方法,指出该方法是存在于DLL中的,然后通过`Assembly.Load`或`...

    c#入门程序加dll文件依赖程序.zip

    DLL(Dynamic Link Library)文件是Windows操作系统中的一种共享库,它包含可由多个执行文件(如C#程序)同时使用的函数和资源。当你的C#程序引用了一个DLL,它依赖于该DLL提供的功能来运行。理解dll文件的依赖关系...

    C#开发的调用医保dll.zip

    考虑到上述情况,可以得知,在“C#开发的调用医保dll.zip”压缩包中,很可能包含的是一个基于C#和Windows Forms的Windows应用程序源代码。这个源代码将指导开发者如何在自己的软件项目中集成医保dll,并通过编程方式...

    VLC 所需DLL,在C#程序中使用

    标题中的"VLC所需DLL,在C#程序中使用"指的是一项技术,即在C#应用中嵌入VLC的功能,这通常通过引用VLC的动态链接库(DLL)文件实现。VLC提供了一个名为libvlc的API,可以用于创建自定义的多媒体播放器,包括视频...

    C#dll的学习例子

    要从另一个C#应用程序中使用这个DLL,首先需要将DLL添加到项目的引用中。在新项目中,右键点击“引用” -> “添加引用” -> “浏览”,找到刚才生成的“ClassLibrary1.dll”并添加。 5. 调用DLL方法 在主项目中,...

    C#开发websocket应用使用的Fleck.dll

    Fleck.dll就是这样一个库,专为C#设计,用于简化WebSocket应用程序的开发。 Fleck是一个轻量级、高性能的WebSocket服务器实现,它提供了简洁的API,让开发者能够快速搭建和管理WebSocket服务。在使用Fleck.dll之前...

    在MFC下调用C#DLL库函数实例

    - 在MFC项目中创建一个C++接口,与C# DLL中的接口相对应。这通常涉及使用`__declspec(dllexport)`和`__declspec(dllimport)`来处理导出和导入。 6. **实现P/Invoke**: - 使用`#pragma comment(lib, "CsharpDLL....

    C#使用CLR调用C++的DLL库

    然后,创建托管C++类,这些类封装了C++ DLL中的非托管代码,并提供给C#应用程序调用的接口。 3. **创建C# EXE应用** - 最后,创建一个C#控制台应用程序项目。在C#代码中,添加对C++ CLR类库的引用。然后,你可以像...

    如何编写DLL服务端程序(C#)

    在IT行业中,DLL(Dynamic Link Library)是一种共享库文件,用于封装可重用的代码,以便多个应用程序可以同时调用这些功能。C#是.NET框架下广泛使用的编程语言,它支持创建DLL服务端程序,这在开发分布式系统、提供...

    C# winform界面:IrisSkin4.dll 轻松实现WinForm应用程序窗体换肤美化

    在C#编程环境中,开发Windows桌面应用程序时,我们经常需要为用户提供美观的界面,以提升用户体验。`IrisSkin4.dll`是一个强大的库,专为WinForm应用设计,旨在帮助开发者轻松实现窗体的换肤和美化功能。本文将详细...

    VS2005 c#中创建DLL与使用DLL源码

    在压缩包`UseMyDll.zip`中,包含了`UseMyDll`项目,这是一个示例应用程序,演示了如何在实际环境中使用`MyDll.dll`。`MyDll`项目则是创建的DLL源代码,供参考和学习。通过这两个项目,你可以更深入地理解C#中DLL的...

    C#将dll打包到程序中

    在C#编程中,有时我们需要将DLL(动态链接库)文件打包到我们的应用程序中,以避免在部署时丢失外部依赖。这通常是通过嵌入资源或使用ILMerge工具来实现的。下面将详细介绍这两种方法。 首先,**嵌入资源** 是一种...

    c#中的dll文件使用实例

    在C#编程中,DLL(Dynamic Link Library)文件是一种共享代码库,允许多个应用程序同时使用相同功能,提高代码重用性和系统效率。本实例将深入探讨如何在C#项目中引用和使用DLL文件。 首先,我们需要理解DLL的工作...

Global site tag (gtag.js) - Google Analytics