使用Windows API实现两个进程间(含窗体)的通信
来源:互联网 发布:安德罗波夫 知乎 编辑:程序博客网 时间:2024/06/09 19:54
在Windows下的两个进程之间通信通常有多种实现方式,在.NET中,有如命名管道、消息队列、共享内存等实现方式,这篇文章要讲的是使用Windows的API来实现简单的进程间通信,这两个进程既可以都是基于C#开发,也可以都是基于C++开发,也可以是一个C#开发而另一个为C++开发,在C++开发方面,不需要额外调用Windows的API,而是可以直接使用相关方法即可。所以,这里重点要讲的就是在C#中是如何做的,而至于在C++中是如何做的将给出例子,并不做详述。
这里笔者使用2010Express来做实现,在C#中的代码相对较简单。对于接收消息,只需要重写DefWndProc函数即可,对于发送消息,笔者编写了一个类MsgHandler来实现。要顺利实现消息的接收与发送,使用了Windows的API:FindWindow、SendMessage等。在C#环境中,通过DllImport来引入相应的API,代码示例如下:
笔者查阅了相关网络资源,发现很少有提及使用自定义消息来发送和接收消息的,几乎都是使用了系统消息WM_COPYDATA来实现。在本例中,笔者除了使用系统消息WM_COPYDATA来收发消息外,还将使用自定义消息来实现收发消息。不过,值得注意的是,笔者在测试过程中发现,使用自定义的消息来收发结构体时发生了一些异常,该异常提示说内存不能读,对于该问题,还有待进一步解决,当然,若是哪位前辈或朋友有遇到过该问题并已顺利解决的话,不妨告知,笔者将洗耳恭听。
消息发送类MsgHandler的代码示例如下:
消息接收重写了DefWndProc方法,其代码示例如下:
消息的接收与发送最终通过一个WinForm展现出来,其代码实现如下:
通过上述的C#部分的代码,已经可以实现两个C#窗体间的通信,其界面截图如下图所示:
那么,在C++中又是如何实现的呢?这个其实也是很简单的。要实现消息的收发,同理也要重写WindowProc以便于接收消息,而通过调用方法亦可实现消息的发送。
对于消息接收,如果是系统消息,可以通过OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)事件完成;如果是自定义消息,可以通过重写WindowProc完成。代码示例如下:
对于消息发送,只需要调用形如SendMessage(m_hwndMsg, WM_DATA_TRANSFER, wParam, lParam)方法即可实现,lParam参数可以是PCOPYDATASTRUCT等。
通过上面的介绍,相信已经可以轻松实现两个进程间(含窗体)的通信的,使用这样的方法,既简单又能够满足大部分的应用需求,不失为一种简便的方法。
- 使用Windows API实现两个进程间(含窗体)的通信
- Linux进程间通信-----使用数据报套接字实现两个进程之间的通信
- C#使用委托创建事件实现两个窗体间通信
- Windows中操作窗体的两个API
- 使用管道实现两个进程之间的通信
- 实践手记--串口通信/Windows API 实现 No.1:串口通信 API 介绍【含简单实例】
- 【C语言】【unix c】如何使用管道实现两个进程间的通信
- C#两个窗体间的通信
- Windows API 进程间通信,管道(Pipe)
- Windows API 进程间通信,管道(Pipe)
- Windows API 进程间通信,管道(Pipe)
- Linux下的有名管道(05)---使用两个管道实现两个进程之间的通信(对讲机模式)
- Linux下的有名管道(06)---使用两个管道实现两个进程之间的通信(手机模式)
- LINUX 实现两个进程之间的通信
- WPF应用程序使用SendMessage实现进程间通信(含示例代码)
- 使用FIFO来进行两个进程间的通信
- 使用AIDL实现进程间的通信
- 使用管道实现进程间的通信
- 等待
- Tomcat启动的时候出错
- 框架初映像
- Firefox 常用插件
- ihex & srec
- 使用Windows API实现两个进程间(含窗体)的通信
- shell中用curl获取外网ip地址
- virtualbox-设置共享文件夹
- T-SQL经验总结----网摘
- 面向对象与领域建模
- 在Eclipse中用Java实现百灵报表(BIRT)的事件处理
- 电话号码对应的英文单词 手机数字短信翻译小工具 数字输入法初型 需求“ya tou”咋写程序实现翻译成“丫头”,有哪位有思路的请指教。
- j2me的自画像
- 淘宝充值150,被骗惨了…呜呜呜…