当前位置:
首页 > Python基础教程 >
-
C#教程之C#与C++相互发送消息
C#端:
namespace CshapMessage
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
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));
}
/// <summary>
/// 向C++程序 CshapMessage发送消息
/// </summary>
/// <param name="nMessgeId"></param>
/// <param name="strSend"></param>
/// <returns></returns>
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;
}
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式