windows进程通信WM_COPYDATA

打开vs2013,点击文件->新建 ->项目


点击确定,再点击下一步,点击确定,VS自动创建出模版文件


这里我们删除_tWinMain里面的两句,

// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_INTERPROCESS_COMMUNICATION_WM_COPYDATA_SERVER, szWindowClass, MAX_LOADSTRING);


并且将窗口标题,窗口类字符串定义处更改一下,为了我们的发送端 能够简单的找到这个程序创建的窗口

TCHAR szTitle[MAX_LOADSTRING]=TEXT("");// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]=TEXT("TEST_SERVER");// 主窗口类名


在LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)里面的

switch(message){

....

}

添加 case WM_COPYDATA: 消息处理


设置vs2013: 点击帮助->设置帮助首选项->在浏览器中启动


vs2013上输入WM_COPYDATA,然后按下F1跳转来到MSDN WM_COPYDATA(点击链接)


MSDN 上对WM_COPYDATA的说明

An application sends the WM_COPYDATA message to pass data to another application.

wParam

A handle to the window passing the data.

将传递数据过来的窗口句柄

lParam

A pointer to a COPYDATASTRUCT structure that contains the data to be passed.

一个指向COPYDATASTRUCT 结构体的指针,该结构体包含传递过来的数据



同样我们看一下 COPYDATASTRUCT 结构体 F1它一下COPYDATASTRUCT(点击链接)


MSDN 上对COPYDATASTRUCT的说明

Contains data to be passed to another application by the WM_COPYDATA message.


dwData

Type: ULONG_PTR

The data to be passed to the receiving application.

传递给 接受程序 的数据,这个数据是个ULONG PTR 也就是ULONG 型变量

cbData

Type: DWORD

The size, in bytes, of the data pointed to by the lpData member.

传递数据,单位字节,针对lpData成员

lpData

Type: PVOID

The data to be passed to the receiving application. This member can be NULL.

传递称接受程序的数据,这个成员是个指针可以NULL


也就是说可以传递的是2个信息,一个是一个ulong型变量,一个是一个指针,至于指针指向的东西,可以是结构体,也可以是字符串~,只要你发送了对应的WM_COPYDATA,


好了,准备工作都好了,需要两个程序,一个发送端用来发送WM_COPYDATA消息,一个接受端用来接受 WM_COPYDATA消息

先来接收端:

承上,我们在 switch(message) 添加如下

case WM_COPYDATA:
	{
		PCOPYDATASTRUCT pcdt =( PCOPYDATASTRUCT)lParam;
		SetWindowText(hWnd,(TCHAR*)pcdt->lpData);
		break;
	}

为了简便处理,将发送过来的消息,设置为窗口标题,这里我发送的消息只是一个简单的字符串,后文可以看到,

好了接收端,就这样在强大的vs帮助下,简化到了这么一点步骤,


接下来看看 发送端的创建

在已有的解决方案下,右键添加->新建项目
设置如下....下图对话框点击确定,下一个对话卡框,点击确定,又有一个vs为你自动生成
的文件


 添加代码如下
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	TCHAR title[MAX_PATH] = {0};
	setlocale(LC_ALL,"Chinese-simplified");//设置中文环境,不然是你输入中文是会出现乱码的
	while(1)
	{
		wcin >> title ;
		COPYDATASTRUCT cdt = {0};
		cdt.lpData = title;
		cdt.cbData = (lstrlen(title)+1)*sizeof(TCHAR);//字符串缓冲区大小要设置合适,不然也会出现乱码的
		HWND hTargetWind=FindWindow(TEXT("TEST_SERVER"),NULL);
		SendMessage(hTargetWind,WM_COPYDATA,(WPARAM)hTargetWind,(LPARAM)&cdt);
	}
	
	system("pause");
	return 0;
}
效果如下
输入英文字符串



中文如下



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值