1. 程式人生 > >C#傳送和接收訊息

C#傳送和接收訊息

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; } } }