打开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.
A handle to the window passing the data.
将传递数据过来的窗口句柄
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.
Type: ULONG_PTR
The data to be passed to the receiving application.
传递给 接受程序 的数据,这个数据是个ULONG PTR 也就是ULONG 型变量
Type: DWORD
The size, in bytes, of the data pointed to by the lpData member.
传递数据,单位字节,针对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帮助下,简化到了这么一点步骤,
接下来看看 发送端的创建
#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;
}
效果如下
中文如下