c#利用VM_COPYDATA实现进程间通信
c#进程间的通信方式很多种,只会这种,感觉比较简单。不懂原理,能用就行。
假设有两个程序:server(主进程),client(子进程)
1.server端:
/*定义一个结构体,用来接收从子进程传过来的信息,与子进程定义的一样*/
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
} /*定义一个消息类型,与子进程定义的一样*/
const int WM_COPYDATA = 0x004A; /*处理消息的方法*/
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{ switch (m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
this.label2.Text = mystr.lpData;
MessageBox.Show( mystr.lpData);
break;
default:
base.DefWndProc(ref m);
break;
}
}
2.client端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; //引入这些命名空间
using System.Diagnostics; namespace Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} /*发送消息的结构,与主进程一样*/
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData; } /*发送消息的类型,与主进程一样*/
const int WM_COPYDATA = 0x004A; /*通过这个方法,可以找到主进程的窗体*/
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName); /*发送消息的结构体*/
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
int hWnd,
int Msg,
int wParam,
ref COPYDATASTRUCT lParam
); private void button1_Click(object sender, EventArgs e)
{
/*C#进程通信(Server): 主进程的tilte*/
int WINDOW_HANDLER = FindWindow(null, @"C#进程通信(Server)");
if (WINDOW_HANDLER == )
{
}
else
{
int age = ;
byte[] sarr = System.Text.Encoding.Default.GetBytes("hello,world");
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)age;
cds.lpData = "hello,world";
cds.cbData = len + ;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, , ref cds); }
} }
}
3.主要事项:
①.因为FindWindow这个方法是用来找到窗体的,所以server端一定要是winform程序,client可以是winform,也可以是控制台
②.当把发送消息的方法,放在循环中的时候,会降低程序的性能。上千或上万次的循环,效果会非常明显。
③.不需要引入其他的dll,直接原生态
c#利用VM_COPYDATA实现进程间通信的更多相关文章
- 【Android】17.5 利用Messenger实现进程间通信(IPC)
分类:C#.Android.VS2015: 创建日期:2016-03-03 一.Messager类简介 本章前面曾经说过,要在Android上执行带服务的进程间通信(IPC),既可以用Messenge ...
- 利用WM_COPYDATA进行进程间通信
发信消息 void CControlDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 CString strWindowTitle = _T ...
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- Windows的进程间通信
对于任何一个现代的操作系统,进程间通信都是其系统结构的一个重要组成部分.而说到Windows的进程(线程)间通信,那就要看是在什么意义上说了.因为正如"Windows的跨进程操作" ...
- Android Service使用拾遗[阿里工程师分享]
Service作为android的四大组件之一常用来帮助我们完成一些需要放在后台处理的任务,通过startService和bindService两种方式被调用.因为Service也是在主线程中运行的, ...
- Linux--管道pipe
管道是一种最基本的IPC机制,由pipe函数创建:#include <unistd.h> int pipe(int filedes[2]); 调用pipe函数时在内核中开辟一块缓冲区(称为 ...
- python 闯关之路四(下)(并发编程与数据库编程)
并发编程重点: 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别.互斥锁.信号. 事件.join.GIL.进程间通信.管道.队列. 生产者消息者模型.异步模 ...
- IPC_管道
1.管道特点: 1)单向数据通信 2)匿名管道-常用于(父子进程/有血缘关系的进程之间) 3)命名管道-常用于(无血缘关系进程之间通信) 4)提供一种流式服务(发送和接受不接受字节数的大小,可取任意大 ...
- 【Android】17.0 第17章 服务绑定—本章示例主界面
分类:C#.Android.VS2015: 创建日期:2016-03-03 一.简介 通过服务绑定(Bound Services),可以轻松实现后台服务与界面(UI)的交互. 二.本章示例主界面 1. ...
随机推荐
- Drawable与Bitmap 自定义
Drawable简介 Drawable是Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF.PNG.JPG,当然也支持BMP.相比于View,我们并不需要去考虑如何measure. ...
- Tree( 树) 组件[4]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...
- <div> 如何布局两个标签的布局
想做一个div的曾背景颜色是黄绿色,内部有<a>标签. 代码如下: <div align="center" style=" width: 900px;h ...
- HTML5 格式化、样式、链接、表格
HTML格式化.样式.链接.表格的使用举例
- [转]Xcode的重构功能
Xcode提供了以下几个重构功能: Rename Extract Create Superclass Move Up Move Down Encapsulate 在菜单栏中的位置如下图: 在代码区里直 ...
- 网络流——增广路算法(dinic)模板 [BeiJing2006]狼抓兔子
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #in ...
- Width vs Pitch
1.单位不同,width是像素,pitch是字节.因此一个640*480的8位图和640*480的32位 图他们width一样而pitch不一样. 2.pitch可能大于width个像素所占字节数.w ...
- python之6-1常用函数
1.休眠函数 import time time.sleep(n) n可以是整数或者小数,单位是秒 2.打开文件函数 open('n','m',k) n是文件路径,如果只有文件名,则是py程序所在文件夹 ...
- 请转到http://zhuangyongyao.com
个人博客搬迁到http://zhuangyongyao.com.
- BZOJ 1492 货币兑换Cash
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 思路: 问题转变为维护一个凸包,每次转移都找凸包上的点,并更新凸壳 可以用splay维护,或者 ...