C#傳送和接收訊息
阿新 • • 發佈:2019-01-23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this .Title = "CsharpMessage"; //視窗名稱
this.Loaded += MainWindow_Loaded; //載入
this.Closed += MainWindow_Closed; //關閉
}
IntPtr hwnd;
const int WM_COPYDATA = 0x004A; //記憶體區
public struct COPYDATASTRUCT //結構體
{
public IntPtr dwData;
public int cData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
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));
}
[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);
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:
{
//MessageBox.Show(cdata.dwData.ToString());
button.Content = cdata.dwData.ToString();
break;
}
default:
//MessageBox.Show(cdata.dwData.ToString());
button.Content = cdata.dwData.ToString();
break;
}
}
return IntPtr.Zero;
}
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 bool CshapSendMessage(int nMessgeId, String strSend)
{
int WINDOW_HANDLE = FindWindow(null, "CshapMessage"); //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;
}
}
}