# C#与C++相互发送消息 #

## C#端: ##

namespace CshapMessage
{
///

/// MainWindow.xaml 的交互逻辑
///

public partial class MainWindow : Window
{
IntPtr hwnd;

const int WM_COPYDATA = 0x004A;

public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}

[DllImport("User32.dll")]
public static extern int SendMessage(int hwnd, int msg, int wParam, ref COPYDATASTRUCT IParam);
[DllImport("User32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);

public MainWindow()
{
InitializeComponent();
this.Title = "CshapMessage";
this.Loaded += MainWindow_Loaded;
this.Closed += MainWindow_Closed;
}

private void MainWindow_Closed(object sender, EventArgs e)
{
try
{
HwndSource.FromHwnd(hwnd).RemoveHook(WndProc);
}
catch (Exception) { }
}

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
hwnd = new WindowInteropHelper(this).Handle;
HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
}

///

/// 向C++程序 CshapMessage发送消息
///

///
///
///
private bool CshapSendMessage(int nMessgeId, String strSend)
{
int WINDOW_HANDLE = FindWindow(null, "VcMessage");//VcMessage为向C++程序发送的窗口名称
if (WINDOW_HANDLE != 0)
{
COPYDATASTRUCT cdata;
cdata.dwData = (IntPtr)100;//这里可以传入一些自定义的数据,但只能是4字节整数
cdata.lpData = strSend;//消息字符串
cdata.cData = System.Text.Encoding.Default.GetBytes(strSend).Length+1;//注意,这里的长度是按字节来算的

SendMessage(WINDOW_HANDLE, WM_COPYDATA, 0, ref cdata);
}
else
{
return false;
}
return true;
}

private void button_Click(object sender, RoutedEventArgs e)
{
String strSend = "C#发送的信息";
int nMessageId = 100;

if (CshapSendMessage(nMessageId,strSend))
{
MessageBox.Show("发送消息成功");
}
else
{
MessageBox.Show("消息发送失败,请打开VcMessage程序");
}
}

//接收消息。
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_COPYDATA)
{
COPYDATASTRUCT cdata = new COPYDATASTRUCT();
Type mytype = cdata.GetType();
cdata = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, mytype);
switch (cdata.dwData.ToInt32())
{
case 1:
{
string strRecv = cdata.lpData;
break;
}
default:
break;
}
}

return IntPtr.Zero;
}
}
}

## C++端: ##

BOOL CVcMessageDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

//接收C#发送来的数据
switch (pCopyDataStruct->dwData)
{
case 100:
{
CStringA strRecv = (char*)pCopyDataStruct->lpData;
break;
}

default:
{
break;
}
}

return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

void CVcMessageDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码

CStringA strSend = "VC发送的数据";

if (VCSendMessage(1,strSend))
{
AfxMessageBox(_T("消息发送成功"));
}
else
{
AfxMessageBox(_T("消息发送失败"));
}
}

//************************************
// Method: VCSendMessage
// FullName: CVcMessageDlg::VCSendMessage
// Access: public
// Returns: BOOL
// Qualifier: 向C#程序 CshapMessage发送消息
// Parameter: int nMessgeId
// Parameter: CStringA strSend
//************************************
BOOL CVcMessageDlg::VCSendMessage(int nMessgeId,CStringA strSend)
{
HWND hSendWindow = this->m_hWnd;
if (hSendWindow == NULL)
{
return FALSE;
}

CWnd *phwnd = FindWindow(NULL, _T("CshapMessage"));
HWND hRecvWindow = NULL;
if (phwnd == NULL)
{
return FALSE;
}

hRecvWindow = phwnd->GetSafeHwnd();

if (hRecvWindow == NULL)
{
return FALSE;
}

COPYDATASTRUCT CopyData;
CopyData.dwData = nMessgeId;
CopyData.cbData = strSend.GetLength()+1;
CopyData.lpData = (PVOID)strSend.GetBuffer(CopyData.cbData);

::SendMessage(hRecvWindow, WM_COPYDATA, (WPARAM)hSendWindow, (LPARAM)&CopyData);

return TRUE;
}

最新文章

  1. WCF学习之旅—基于Fault Contract 的异常处理(十八)
  2. 1.vim常用方法
  3. opentsdb basic install
  4. JNI_Android项目中调用.so动态库实现详解【转】
  5. .Net刷新页面的小结
  6. 关于location
  7. android布局ui
  8. css滚动条样式
  9. Javascript Duff装置 循环展开(Javascript Loop unrolling Duff device)
  10. php开启虚拟域名功能
  11. eclipse报错:发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素
  12. HTTP长连接--Keep-Alive
  13. 二、linux的安装
  14. foreach控制循环if判断
  15. python学习Day7 数据类型的转换,字符编码演变历程
  16. ORM版学员管理系统3
  17. jenkins使用(ubuntu16.0环境)
  18. Django之Auth模块 实现登录,退出,自带session 与认证功能的一个重要的模块
  19. IE不支持 Promise 解决办法
  20. Random类(随机数)

热门文章

  1. iframe用法
  2. HTML 事件(三) 事件流与事件委托
  3. Java 输出流中的flush方法
  4. [C#] 简单的 Helper 封装 -- RandomHelper
  5. php cryptr 加密函数
  6. APEX:对object中数据进行简单处理?
  7. java 字节流与字符流的区别
  8. mysql删除重复记录语句的方法
  9. Linux测试环境搭建的学习建议
  10. Ognl表达式基本原理和使用方法