C#中使用SendMessage进行进程通信的实例

简介: 原文: C#中使用SendMessage进行进程通信的实例 1 新建解决方案SendMessageSecondExample 在解决方案下面新建两个项目:Sender和Receiver,两者的输出类型均为“Windows 应用程序”。
原文: C#中使用SendMessage进行进程通信的实例

新建解决方案SendMessageSecondExample

在解决方案下面新建两个项目:SenderReceiver,两者的输出类型均为“Windows 应用程序”。整个程序的结构如下图所示。

 

 

实现项目Sender

Sender仅包含一个名为“消息发送者”的窗体,如下图所示。

 

编写窗体后端代码,如下所示。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
 
namespace Sender
{
    public partial class frmSender : Form
    {
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
 
        const int WM_KEYDOWN = 0x0100;
        const int WM_KEYUP = 0x0101;
        public frmSender()
        {
            InitializeComponent();
        }
 
        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            Process[] procs = Process.GetProcesses();
            foreach (Process p in procs)
            {
                if (p.ProcessName.Equals("Receiver"))
                {
                    IntPtr hWnd = p.MainWindowHandle;
                    int data = Convert.ToInt32(txtMsg.Text);//未做数据校验
                    SendMessage(hWnd, WM_KEYDOWN, (IntPtr)data, (IntPtr)0);
                    Thread.Sleep(1000);
                    SendMessage(hWnd, WM_KEYUP, (IntPtr)0, (IntPtr)0);
                }
            }
        }
    }
}

实现项目Receiver

Receiver项目仅包含一个名为“消息接收者”的窗体,如下图所示。

 

编写窗体后端代码,如下所示。

using System.Windows.Forms;
 
namespace Receiver
{
    public partial class frmReceiver : Form
    {
        public frmReceiver()
        {
            InitializeComponent();
        }
 
        private void frmReceiver_KeyDown(object sender, KeyEventArgs e)
        {
            this.lsvMsgList.Items.Add(e.KeyValue.ToString());
        }
 
        private void frmReceiver_KeyUp(object sender, KeyEventArgs e)
        {
            this.lsvMsgList.Items.Add(e.KeyValue.ToString());
        }
    }
}

运行程序

运行程序,效果如下图所示。

 

从结果中了解到,“消息发送者”向“消息接收者”发送了六次消息,其中,WM_KEYDOWN消息3次,传递了数据1,2,3(为文本框中输入的数据);WM_KEYUP消息同样为三次,传递数据为0。

附:Windows系统消息

     范围               意义

0x0001——0x0087  主要是窗口消息

0x00A0——0x00A9  非客户区消息

0x0100——0x0108  键盘消息 

0x0111——0x0126  菜单蹋消息

0x0132——0x0138  颜色控制消息

0x0200——0x020A  鼠标消息 

0x0211——0x0213  菜单循环消息

0x0220——0x0230  多文档消息 

0x03E0——0x03E8  DDE消息

0x0400  WM_USER 

0x0400——0x7FFF  自定义消息

Windows消息大全之类的可查阅:http://bbs.csdn.net/topics/70453732

 

 

目录
相关文章
|
1月前
|
消息中间件 Unix Linux
Linux进程间通信(IPC)介绍:详细解析IPC的执行流程、状态和通信机制
Linux进程间通信(IPC)介绍:详细解析IPC的执行流程、状态和通信机制
48 1
|
1月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
4月前
|
消息中间件 存储 Unix
进程间通信和线程间通信总结
写在前面 面试的时候一定不要疲劳战,比如上午面了一个,然后中午不休息直接赶到另外一个相距比较远的公司,影响状态。 面试的时候一定不要紧张,不管对方有几个人,总之面试的时候做好充分准备,休息好,放松心态。 好了,言归正传,开始总结。
39 0
|
3月前
|
编解码 监控 API
操作系统:进程的控制和通信(Windows2000)
操作系统:进程的控制和通信(Windows2000)
45 0
|
1月前
|
消息中间件 Linux API
跨进程通信设计:Qt 进程间通讯类全面解析
跨进程通信设计:Qt 进程间通讯类全面解析
80 0
|
1月前
|
消息中间件 并行计算 网络协议
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
34 0
|
2月前
|
Python
Python多进程间通信的最佳实践
Python多进程间通信的最佳实践
|
2月前
|
消息中间件 Linux
Linux下的系统编程——进程间的通信(九)
Linux下的系统编程——进程间的通信(九)
36 1
Linux下的系统编程——进程间的通信(九)
|
3月前
|
存储 缓存 Unix
C语言第四章(进程间的通信,管道通信,pipe()函数)
C语言第四章(进程间的通信,管道通信,pipe()函数)
54 0
|
3月前
|
消息中间件 Unix Linux
Linux进程间的通信万字总结大全
POSIX(Portable Operating System Interface for Computing Systems)是由IEEE 和ISO/IEC 开发的一簇标准。该标准是基于现有的UNIX 实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。它是在1980 年早期一个UNIX 用户组(usr/group)的早期工作的基础上取得的。该UNIX 用户组原来试图将AT&T 的系统V 和Berkeley CSRG的BSD 系统的调用接口之间的区别
28 0

相关实验场景

更多