狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#使用SendMessage進行進程間通訊


2024年9月23日 8:3 本文熱度 1241

最近公司有個需求是,拖動文件到桌面圖標上,自動打開文件。那么只需在OnStartup事件中通過StartupEventArgs獲取文件名然后進行操作即可。操作之后發現當軟件已經啟動了(單例運行),那么將無法將參數傳給業務層。原因是因為跨進程了,那么我們可以通過窗口句柄的方式來進行通訊。

public partial class App : Application
 {
     private static Mutex AppMutex;
     public App()
     {


     }


     protected override void OnStartup(StartupEventArgs e)
     {
         //獲取啟動參數
         var param = string.Empty;
         if (e.Args.Length > 0)
         {
             param = e.Args[0].ToString();
         }


         //WpfApp8 = 你的項目名稱
         AppMutex = new Mutex(true, "WpfApp8", out var createdNew);


         if (!createdNew)
         {
             var current = Process.GetCurrentProcess();


             foreach (var process in Process.GetProcessesByName(current.ProcessName))
             {
                 if (process.Id != current.Id)
                 {
                     Win32Helper.SetForegroundWindow(process.MainWindowHandle);
                     Win32Helper.SendMessageString(process.MainWindowHandle, param);
                     break;
                 }
             }
             Environment.Exit(0);
         }
         else
         {
             base.OnStartup(e);
         }
     }
 }
public class Win32Helper
 {
     [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
     public static extern bool SetForegroundWindow(IntPtr hWnd);


     /// <summary>
     /// 發送消息
     /// </summary>
     /// <param name="hWnd"></param>
     /// <param name="Msg"></param>
     /// <param name="wParam"></param>
     /// <param name="lParam"></param>
     /// <returns></returns>
     [DllImport("user32.dll")]
     public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);


     // 聲明常量
     public const int WM_COPYDATA = 0x004A;


     // 定義 COPYDATASTRUCT 結構
     [StructLayout(LayoutKind.Sequential)]
     public struct COPYDATASTRUCT
     {
         public IntPtr dwData;
         public int cbData;
         public IntPtr lpData;
     }


     /// <summary>
     /// 發送字符串消息
     /// </summary>
     /// <param name="hWnd"></param>
     /// <param name="message"></param>
     public static void SendMessageString(IntPtr hWnd, string message)
     {
         if (string.IsNullOrEmpty(message)) return;


         byte[] messageBytes = Encoding.Unicode.GetBytes(message + '\0'); // 添加終止符


         COPYDATASTRUCT cds = new COPYDATASTRUCT();
         cds.dwData = IntPtr.Zero;
         cds.cbData = messageBytes.Length;
         cds.lpData = Marshal.AllocHGlobal(cds.cbData);
         Marshal.Copy(messageBytes, 0, cds.lpData, cds.cbData);
         try
         {
             SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, ref cds);
         }
         finally
         {
             //釋放分配的內存,即使發生異常也不會泄漏資源
             Marshal.FreeHGlobal(cds.lpData);
         }
     }
 }
public partial class MainWindow : Window
 {
     public MainWindow()
     {
         InitializeComponent();
     }


     protected override void OnSourceInitialized(EventArgs e)
     {
         base.OnSourceInitialized(e);


         HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
         hwndSource.AddHook(WndProc);
     }


     private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
     {
         if (msg == WM_COPYDATA)
         {
             COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
             string receivedMessage = Marshal.PtrToStringUni(cds.lpData);


             Console.WriteLine("收到消息:" + receivedMessage);


             //TODO:業務處理
             MessageBox.Show(receivedMessage);


             handled = true;
         }


         return IntPtr.Zero;
     }
 }

轉自https://www.cnblogs.com/wihalo/p/18293731


該文章在 2024/9/25 8:35:35 編輯過
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved