经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C#使用SendMessage进行进程间通讯
来源:cnblogs  作者:韶光荏苒  时间:2024/7/11 11:12:06  对本文有异议

最近公司有个需求是,拖动文件到桌面图标上,自动打开文件。那么只需在OnStartup事件中通过StartupEventArgs获取文件名然后进行操作即可。操作之后发现当软件已经启动了(单例运行),那么将无法将参数传给业务层。原因是因为跨进程了,那么我们可以通过窗口句柄的方式来进行通讯。

  1. 1 public partial class App : Application
  2. 2 {
  3. 3 private static Mutex AppMutex;
  4. 4 public App()
  5. 5 {
  6. 6
  7. 7 }
  8. 8
  9. 9 protected override void OnStartup(StartupEventArgs e)
  10. 10 {
  11. 11 //获取启动参数
  12. 12 var param = string.Empty;
  13. 13 if (e.Args.Length > 0)
  14. 14 {
  15. 15 param = e.Args[0].ToString();
  16. 16 }
  17. 17
  18. 18 //WpfApp8 = 你的项目名称
  19. 19 AppMutex = new Mutex(true, "WpfApp8", out var createdNew);
  20. 20
  21. 21 if (!createdNew)
  22. 22 {
  23. 23 var current = Process.GetCurrentProcess();
  24. 24
  25. 25 foreach (var process in Process.GetProcessesByName(current.ProcessName))
  26. 26 {
  27. 27 if (process.Id != current.Id)
  28. 28 {
  29. 29 Win32Helper.SetForegroundWindow(process.MainWindowHandle);
  30. 30 Win32Helper.SendMessageString(process.MainWindowHandle, param);
  31. 31 break;
  32. 32 }
  33. 33 }
  34. 34 Environment.Exit(0);
  35. 35 }
  36. 36 else
  37. 37 {
  38. 38 base.OnStartup(e);
  39. 39 }
  40. 40 }
  41. 41 }
  1. 1 public class Win32Helper
  2. 2 {
  3. 3 [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
  4. 4 public static extern bool SetForegroundWindow(IntPtr hWnd);
  5. 5
  6. 6 /// <summary>
  7. 7 /// 发送消息
  8. 8 /// </summary>
  9. 9 /// <param name="hWnd"></param>
  10. 10 /// <param name="Msg"></param>
  11. 11 /// <param name="wParam"></param>
  12. 12 /// <param name="lParam"></param>
  13. 13 /// <returns></returns>
  14. 14 [DllImport("user32.dll")]
  15. 15 public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
  16. 16
  17. 17 // 声明常量
  18. 18 public const int WM_COPYDATA = 0x004A;
  19. 19
  20. 20 // 定义 COPYDATASTRUCT 结构
  21. 21 [StructLayout(LayoutKind.Sequential)]
  22. 22 public struct COPYDATASTRUCT
  23. 23 {
  24. 24 public IntPtr dwData;
  25. 25 public int cbData;
  26. 26 public IntPtr lpData;
  27. 27 }
  28. 28
  29. 29 /// <summary>
  30. 30 /// 发送字符串消息
  31. 31 /// </summary>
  32. 32 /// <param name="hWnd"></param>
  33. 33 /// <param name="message"></param>
  34. 34 public static void SendMessageString(IntPtr hWnd, string message)
  35. 35 {
  36. 36 if (string.IsNullOrEmpty(message)) return;
  37. 37
  38. 38 byte[] messageBytes = Encoding.Unicode.GetBytes(message + '\0'); // 添加终止符
  39. 39
  40. 40 COPYDATASTRUCT cds = new COPYDATASTRUCT();
  41. 41 cds.dwData = IntPtr.Zero;
  42. 42 cds.cbData = messageBytes.Length;
  43. 43 cds.lpData = Marshal.AllocHGlobal(cds.cbData);
  44. 44 Marshal.Copy(messageBytes, 0, cds.lpData, cds.cbData);
  45. 45 try
  46. 46 {
  47. 47 SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, ref cds);
  48. 48 }
  49. 49 finally
  50. 50 {
  51. 51 //释放分配的内存,即使发生异常也不会泄漏资源
  52. 52 Marshal.FreeHGlobal(cds.lpData);
  53. 53 }
  54. 54 }
  55. 55 }
  1. 1 public partial class MainWindow : Window
  2. 2 {
  3. 3 public MainWindow()
  4. 4 {
  5. 5 InitializeComponent();
  6. 6 }
  7. 7
  8. 8 protected override void OnSourceInitialized(EventArgs e)
  9. 9 {
  10. 10 base.OnSourceInitialized(e);
  11. 11
  12. 12 HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
  13. 13 hwndSource.AddHook(WndProc);
  14. 14 }
  15. 15
  16. 16 private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
  17. 17 {
  18. 18 if (msg == WM_COPYDATA)
  19. 19 {
  20. 20 COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
  21. 21 string receivedMessage = Marshal.PtrToStringUni(cds.lpData);
  22. 22
  23. 23 Console.WriteLine("收到消息:" + receivedMessage);
  24. 24
  25. 25 //TODO:业务处理
  26. 26 MessageBox.Show(receivedMessage);
  27. 27
  28. 28 handled = true;
  29. 29 }
  30. 30
  31. 31 return IntPtr.Zero;
  32. 32 }
  33. 33 }

原文链接:https://www.cnblogs.com/wihalo/p/18293731

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号