进程通信-SendMessage的使用方法

用过SendMessage进行进程通信的同学都知道,这个函数一般都搭配FindWindow使用。通过FindWindow查找进程句柄,然后使用SendMessage 向这个句柄发送信息。这接口使用起来比较简单,但是当初也是费了好大的劲,只为用作记录。

第一步:设计用户界面

用户界面需要有一下几个元素,设置本地的窗口名称,目标的窗口名称,发送数据,以及接受数据。

第二步:引用接口

//Win32 API函数

[DllImport("User32.dll", EntryPoint = "SendMessage")]

private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

[DllImport("User32.dll", EntryPoint = "FindWindow")]

private static extern int FindWindow(string lpClassName, string lpWindowName);

const int WM_COPYDATA = 0x004A;

public struct COPYDATASTRUCT

{

public IntPtr dwData;

public int cbData;

[MarshalAs(UnmanagedType.LPStr)]

public string lpData;

}

当初做的时候,将WM_COPYDATA 改为其他值,像c++ 一样,我只需要通过消息定义为WM_USER+1 即可向该消息发送数据。但是做的时候,发现不对,刚接触c# 不知道是我哪里理解不对还是怎么。改成其他值不行的。只能设置成0x004A;

第三步:发送消息

private void buttonSend_Click(object sender, EventArgs e)

{

string wndName = textBoxDestWindowName.Text;

string message = textBoxSendData.Text;

int hWnd = FindWindow(null, wndName);

if(hWnd != 0)

{

byte[] sarr = System.Text.Encoding.Default.GetBytes(message);

int len = sarr.Length;

COPYDATASTRUCT cds;

cds.dwData = (IntPtr)Convert.ToInt16(1);//可以是任意值

cds.cbData = len + 1;//指定lpData内存区域的字节数

cds.lpData = message;//发送给目标窗口所在进程的数据

SendMessage(hWnd, WM_COPYDATA, 0, ref cds);

}

}

第四步:接受消息

protected override void DefWndProc(ref Message m)

{

switch (m.Msg)

{

case WM_COPYDATA:

COPYDATASTRUCT cds = new COPYDATASTRUCT();

Type t = cds.GetType();

cds = (COPYDATASTRUCT)m.GetLParam(t);

string strResult = cds.lpData;

string strType = cds.dwData.ToString();

RecvOneDataPacket(strResult, strType);

break;

default:

base.DefWndProc(ref m);

break;

}

}

private void RecvOneDataPacket(string strResult, string strType)

{

//throw new NotImplementedException();

listBoxRecv.Items.Add(strResult);

}

这个接口在当初做的时候,老是出错,就在这个地方。

cds = (COPYDATASTRUCT)m.GetLParam(t);

我也不知道为什么,也许是因为消息值的定义吧。不清楚,反正以后得注意了。

代码地址:https://github.com/liningg/sendmessage

进程通信-SendMessage使用方法的更多相关文章

  1. C# 进程通信SendMessage和有关消息参数

    SendMessage是啥? 函数原型: LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)SendMessage( ...

  2. unity3d进程通信利用WM_COPYDATE和HOOK

    hello,近期用unity做了进程通信,应该是和c++的PC端实现通信,才開始一头雾水,后来实现了才知道好繁杂......先感谢对我提供帮助的百度,谷歌以及游戏圈的大大们. 在进程通信中非常多方法, ...

  3. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  4. WinForm实现跨进程通信的方法

    public class WinMessageHelper { private struct COPYDATASTRUCT { public IntPtr dwData; public int cbD ...

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

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

  6. Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...

  7. AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)

    首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...

  8. Android中的跨进程通信方法实例及特点分析(一):AIDL Service

    转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...

  9. [转]WINDOW进程通信的几种方式

    windows进程通信的几种方式 1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/O操作,只需简单的指针 ...

随机推荐

  1. accp8.0转换教材第5章事务、视图、索引、备份和恢复理解与练习

    知识点:事务.视图.索引.数据库的备份和恢复 一.单词部分 ①transation事务②atomicity原子性③consistency一致性④isolation隔离性 ⑤durability持久性⑥ ...

  2. C# 中关于接口实现、显示实现接口以及继承

    先列出我写的代码: 接口以及抽象类.实现类 public interface IA { void H(); } public interface IB { void H(); } public abs ...

  3. Hibernate使用注解进行ORM映射实例

    在上一篇博客中,我们通过xml配置文件进行实体类和表的映射,但是近两年来有更多的项目对一些比较稳定的实体类使用了注解进行ORM映射,这样使得编程更加简洁.简单.其实使用注解进行ORM映射和使用xml进 ...

  4. Java数据类型在实际开发中的应用一

    在前边的博文中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...

  5. IT小天博客APP版本

    今天弄了一个博客的APP版本,感觉还不错,欢迎下载体验. 共 1 张图片 APP名称:[IT小天博客APP] APP版本:1.3 APP上线时间:2017-06-29 下载地址:点击下载

  6. 官方Tomcat镜像Dockerfile分析及镜像使用

    官方Tomcat镜像 地址:https://hub.docker.com/_/tomcat/ 镜像的Full Description中,我们可以得到许多信息,这里简单介绍下: Supported ta ...

  7. 谈谈ES6箭头操作符

    如果你会C#或者Java,你肯定知道lambda表达式,ES6中新增的箭头操作符=>便有异曲同工之妙.它简化了函数的书写.操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=& ...

  8. Sass学习笔记(补充)

    阅读目录 1. Sass和SCSS的区别 2. @while循环 3. @at-root 4. @content 5. 凸显注释 6. CSS输出样式 7. 重置浏览器样式 8. Sass调试和@de ...

  9. gtest 操作指南

    首先,下载gtest-17.0,CSDN上就可以免费下载. 然后,打开gtest-17.0下的msvc文件夹,运行gtest.sln,右键解决方案,选择生成解决方案,此时会在gtest-17.0/ms ...

  10. 启动Tomcat提示:指定的服务未安装

    新下载的Tomcat7.0 解压缩完了运行tomcat7.exe屏幕一闪就没了 运行tomcat7w.exe弹出个筐 指定的服务并未以已安装的服务存在 Unable to open the Servi ...