亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#使用SendMessage進(jìn)行進(jìn)程間通訊


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

最近公司有個(gè)需求是,拖動(dòng)文件到桌面圖標(biāo)上,自動(dòng)打開文件。那么只需在OnStartup事件中通過StartupEventArgs獲取文件名然后進(jìn)行操作即可。操作之后發(fā)現(xiàn)當(dāng)軟件已經(jīng)啟動(dòng)了(單例運(yùn)行),那么將無法將參數(shù)傳給業(yè)務(wù)層。原因是因?yàn)榭邕M(jìn)程了,那么我們可以通過窗口句柄的方式來進(jìn)行通訊。

public partial class App : Application

 {

     private static Mutex AppMutex;

     public App()

     {


     }


     protected override void OnStartup(StartupEventArgs e)

     {

         //獲取啟動(dòng)參數(shù)

         var param = string.Empty;

         if (e.Args.Length > 0)

         {

             param = e.Args[0].ToString();

         }


         //WpfApp8 = 你的項(xiàng)目名稱

         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>

     /// 發(fā)送消息

     /// </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 結(jié)構(gòu)

     [StructLayout(LayoutKind.Sequential)]

     public struct COPYDATASTRUCT

     {

         public IntPtr dwData;

         public int cbData;

         public IntPtr lpData;

     }


     /// <summary>

     /// 發(fā)送字符串消息

     /// </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

         {

             //釋放分配的內(nèi)存,即使發(fā)生異常也不會(huì)泄漏資源

             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:業(yè)務(wù)處理

             MessageBox.Show(receivedMessage);


             handled = true;

         }


         return IntPtr.Zero;

     }

 }

轉(zhuǎn)自https://www.cnblogs.com/wihalo/p/18293731


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