LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#使用SendMessage进行进程间通讯


2024年9月23日 8:3 本文热度 338

最近公司有个需求是,拖动文件到桌面图标上,自动打开文件。那么只需在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-2024 ClickSun All Rights Reserved