几天遇见一个问题需要检查某个wpf程序是否已经运行,如果没有运行则启动传递参数,如果已运行则需要直接传递消息。在没有运行 情况下传递参数很简单,我们只需要Process cmd窗口启动并传递参数,在程序中处理。但是如果程序已经启动有点麻烦,凭着我曾winform的经验第一时间想到的是win32 api  SendMessage,我们的C#程序只需要DllImport就可以调用了。经过一番查找和对wpf window和DispatcherObject的Reflector,花了我大半天终于找到了System.Windows.Interop.HwndSource中有AddHock方法可以添加对win32消息机制的监听。这下就很好办了我们只需要注册MainWindow的这个时间,来监听win32消息处理我们的0x004A消息。

控制台代码,主要应用的FindWindow 这个win32方法查找我们的窗体,SendMessage发送我们的消息,和winform没有什么差别,对于win32的使用你可以参考毒龙的程序人生 的关于C#中实现两个应用程序消息通讯的问题。难得查win32 Api直接copy,借来用用。

程序:

  1. 查看代码
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Runtime.InteropServices;
  7. namespace ConsoleApplication1
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. string ch = "";
  14. while (ch.ToLower() != "q")
  15. {
  16. if (!SendMessage("Window1", @"Hello,I am from Console Program:" + ch))
  17. {
  18. Console.WriteLine("no window");
  19. };
  20. ch = Console.ReadLine();
  21. }
  22. }
  23. public static bool SendMessage(string windowName, string strMsg)
  24. {
  25. if (strMsg == null) return true;
  26. IntPtr hwnd = (IntPtr)FindWindow(null, windowName   );
  27. if (hwnd != IntPtr.Zero)
  28. {
  29. CopyDataStruct cds;
  30. cds.dwData = IntPtr.Zero;
  31. cds.lpData = strMsg;
  32. cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;
  33. int fromWindowHandler = 0;
  34. SendMessage(hwnd, 0x004A, fromWindowHandler, ref  cds);
  35. return true;
  36. }
  37. return false;
  38. }
  39. [DllImport("User32.dll", EntryPoint = "FindWindow")]
  40. private static extern int FindWindow(string lpClassName, string lpWindowName);
  41. [DllImport("User32.dll", EntryPoint = "SendMessage")]
  42. private static extern int SendMessage
  43. (
  44. IntPtr hWnd,
  45. int Msg,
  46. int wParam,
  47. ref  CopyDataStruct lParam
  48. );
  49. }
  50. [StructLayout(LayoutKind.Sequential)]
  51. public struct CopyDataStruct
  52. {
  53. public IntPtr dwData;
  54. public int cbData;
  55. [MarshalAs(UnmanagedType.LPStr)]
  56. public string lpData;
  57. }
  58. }
  59. 复制代码

wpf端程序:主要需要在MainWindow中loaded事件订阅消息监听:这里需要System.Windows.Interop.HwndSource的AddHock方法注册
程序:

  1. 查看代码
  2. IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
  3. {
  4. if (msg == 0x004A)
  5. {
  6. CopyDataStruct cds = (CopyDataStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, typeof(CopyDataStruct));
  7. MessageBox.Show(cds.lpData);
  8. this.Visibility = Visibility.Visible;
  9. }
  10. return hwnd;
  11. }
  12. private void Window_Loaded(object sender, RoutedEventArgs e)
  13. {
  14. (PresentationSource.FromVisual(this) as System.Windows.Interop.HwndSource).AddHook(new System.Windows.Interop.HwndSourceHook(WndProc));
  15. }
  16. 复制代码

截个图:

很简单的东西结果被MS封装的不知哪里去,让我查了半天(其实应该是我的无知吧,不管怎么解决了就是心情舒畅了);

转载于:https://blog.51cto.com/whitewolfblog/835234

Wpf消息循环之消息传递相关推荐

  1. MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)

    注意:非模态和模态对话框都有自己的消息响应过程函数WindowPro,只不过他们的调用模态是自己的消息泵,非模态是由父窗体或父窗体的上一级的消息泵来调用.模态对话框和非模态对话框都可以通过SendMe ...

  2. 1.4 消息循环和回调函数

    ************************************************** * 本文由小鸟飞飞整理发表 <samboy@sohu.com> * * 首发网站:蓝丽 ...

  3. 理解MiniGUI消息循环和窗口过程

    1.2  消息和消息循环 在Windows系列操作系统中,广泛使用了消息驱动的概念.在MiniGUI中,我们也使用了消息驱动作为应用程序的创建构架. 在消息驱动的应用程序中,计算机外设发生的事件,例如 ...

  4. Windows 消息循环(1) - 概览

    本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...

  5. 异步IO(协程,消息循环队列)

    同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其 ...

  6. 应用程序进程(三):创建消息循环

    1.在ActivityThread的main方法中开启主线程的消息循环 在其它线程中创建Looper可使用 Looper.prepare()方法 //ActivityThread#main publi ...

  7. android 结束if循环_Android Handler 消息循环机制

    前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...

  8. 模态对话框和非模态对话框的消息循环

    1.非模态对话框和父窗口共享当前线程的消息循环 2.模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口.模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发 ...

  9. android 消息循环机制--looper handler

    Looper类说明   Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结 ...

最新文章

  1. 0322 第一天 心得体会
  2. c语言ifft,用于ARM上的FFT与IFFT源代码-C语言
  3. 电子工程师:不停改方案,神仙都要跑路!
  4. Hadoop平台 以Parcel包安装CDH
  5. 95-190-744-源码-WindowFunction-WindowFunction
  6. ITester软件测试小栈历时9个月文章汇总
  7. mysql不定参数函数_可变参数函数(一)
  8. python qt designer
  9. 游戏制作之路(3)Blender制作极简动画
  10. java后端getmonth_Java中的LocalDateTime getMonth()方法
  11. 游建慧:大山铺镇侧卧恐龙身畔的烟火人间骇伦
  12. Cors跨域(二):实现跨域Cookie共享的三要素
  13. CCF系列题解--2015年12月第三题 ASCII字符画
  14. 01.Windows系统安装
  15. 【CodeForces】Educational Codeforces Round 118 (Rated for Div. 2)【A-C】
  16. 蓝旭前端第二周预习———HTML标签+如何查看控制台
  17. visual studio西红柿插件过期解决办法——不断恢复试用
  18. dorado Tip控件:信息提示组件
  19. 看周鸿祎麻辣点评中国互联网公司
  20. mkv文件怎么转换成mp4?

热门文章

  1. iOS封装HTTPS双向和单向验证
  2. swift 中showAlertTitle的使用
  3. HTML5的学习,各个标签的尝试
  4. FastJson 简单使用
  5. Pascal's Triangle
  6. 面试题6:用两个栈实现队列
  7. 《父亲家书》选:给初为人师的儿子
  8. MySQL00-这都不知道还TM学啥MySQL
  9. 对标以太坊的EOS再火,也拼不过InterValue的区块链4.0
  10. 阿联酋gitex_航空公司网站不在乎您的隐私后续行动:阿联酋航空以以下方式回应我的文章:...