在联想智能识别项目中,需要用到进程间通讯,并且是低权限向高权限发送消息。首先声明一下,此项目是wpf的。

首先先简要说一下什么时候会用到进程间通讯,如:在Windows程序中,各个进程之间如果需要交换数据,此时就可以用到进程通讯。

先讲讲怎么实现发送消息: 要用进程间通讯,就必须用到参数WM_COPYDATA,此参数的主要目的是允许在进程间传递只读数据。

发送消息需要用到SendMessage函数,如果接受方未接收完数据的话,是不会返回的,所以发送方在此过程中是不可能删除和修改数据的。

这个函数如下:

  1. [DllImport("User32.dll", EntryPoint = "SendMessage")]
  2. private static extern int SendMessage(
  3. IntPtr hWnd, //目标窗体句柄
  4. int Msg, //WM_COPYDATA
  5. int wParam, //自定义数值
  6. ref CopyDataStruct lParam //传递消息的结构体,
  7. );

SendMessage函数用到的数据结构如下:

  1. [StructLayout(LayoutKind.Sequential)]
  2. public struct CopyDataStruct
  3. {
  4. public IntPtr dwData;//用户定义数据
  5. public int cbData;//字符串长度
  6. [MarshalAs(UnmanagedType.LPStr)]
  7. public string lpData;//字符串
  8. }

该结构用来定义用户要传递的消息的数据

上面SendMessage的第一个参数需要传递目标窗体的句柄,所以,发送消息前,我们得先找到目标窗体的句柄。 方法如下:

  1. [DllImport("User32.dll", EntryPoint = "FindWindow")]
  2. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

参数:

lpszClassName       指向一个以null结尾的字符串,指定了窗口类(一个WNDCLASS结构)的名字。如果lpszClassName为NULL,则所有的类名都匹配。

lpszWindowName   指向一个以null结尾的字符串,指定了窗口的名字(窗口的标题)。如果lpWindowName为NULL,所有的窗口名都匹配。

我们在找时,可以第一个窗体传Null,第二个传入接受消息的窗体的名称。 找到目标窗体的句柄之后,我们就可以来发送消息了 说完发送消息,再来说说接收消息。 接收消息同样也会用到参数WM_COPYDATA和发送消息用的数据结构CopyDataStruct 。

接下来在接收消息的窗体中重写OnSourceInitialized方法 用法如下:

  1. protected override void OnSourceInitialized(EventArgs e)
  2. {
  3. base.OnSourceInitialized(e);
  4. HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
  5. if (hwndSource != null)
  6. {
  7. IntPtr handle = hwndSource.Handle;
  8. hwndSource.AddHook(new HwndSourceHook(WndProc));
  9. }
  10. }
  11.  
  12. IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
  13. {
  14. if (msg == WM_COPYDATA)
  15. {
  16. CopyDataStruct cds = (CopyDataStruct)Marshal.PtrToStructure(lParam, typeof(CopyDataStruct));//从发送方接收到的数据结构
  17. string param = cds.lpData;//获取发送方传过来的消息
  18.  
  19. }
  20.  
  21. return hwnd;
  22. }

文章接近尾声了,但如果只用上面的发送消息,接受消息的方法,对于平级的或者高权限向低权限的程序来说可能没问题。但如果是低权限向高权限的程序发送消息,该怎么办呢。其实很简单,在我们接受消息前,先调用一下下面这个方法

  1. [DllImport("user32")]
  2. public static extern bool ChangeWindowMessageFilter(uint msg, int flags);

此方法是用来添加或删除能通过隔离级别的消息,第一个参数就是咱们发送消息用到的WM_COPYDATA,相当于一个标识,第二个参数,可以传入1,相当于Add,使咱们传过来的消息能通过级别隔离,如果传入2的话,是删除,即不让通过。 ChangeWindowMessageFilter还有更多参数,在此用不上,所以不多讲了。

示例下载

http://www.cnblogs.com/cssmystyle/archive/2011/10/31/2230033.html

wpf进程间通讯的更多相关文章

  1. WPF 进程间通讯----inter-process communication

    进程间通讯--inter-process communication  进程间相互通讯的方法有很多,如用web services,xml 等互相读取, 网络的可以使用socket 等. 2个WinFo ...

  2. Android进程间通讯

    最近研究了一下Android进程间通讯,原来只是会用,但是只是会用是不行滴,就来研究一下. 刚开始看的时候,我的头是这么大,看了一夜的时候,头就变成这样了,,吓得宝宝赶紧上床休息了,. 先喝喝茶讲个故 ...

  3. Android进程间通讯之messenger

    这两天在看binder,无意间在文档看到messenger这么个东西,感觉这个东西还挺有意思的,给大家分享一下. 平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都 ...

  4. [转]Windows 下的进程间通讯及数据共享

    http://blog.codingnow.com/2005/10/interprocess_communications.html Windows 下有很多方法实现进程间通讯,比如用 socket, ...

  5. Android AIDL 进行进程间通讯(IPC)

    编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...

  6. win32进程间通讯--共享内存

    小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...

  7. Android进阶笔记04:Android进程间通讯(IPC)之Messenger

    一. Android进程间通讯之Messenger 的引入 (1)引言:      平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消 ...

  8. c#进程间通讯方案之IPC通道

    转载:http://www.cnphp.info/csharp-ipc-channel-remoting.html 最近一直纠结与使用多进程还是多线程来构建程序.多线程的方法似乎不错,但是一个进程可承 ...

  9. Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL

    一.IPC inter process communication  进程间通讯 二.AIDL android  interface  defination  language  安卓接口定义语言 满 ...

随机推荐

  1. React-native 底部导航栏(二)

    1.组件安装:npm install react-native-router-flux --save 2.定义菜单图片和文字: import React, { Component } from 're ...

  2. 2019-11-29-Roslyn-通过-Nuget-管理公司配置

    title author date CreateTime categories Roslyn 通过 Nuget 管理公司配置 lindexi 2019-11-29 08:58:52 +0800 201 ...

  3. php 克隆 __clone

    php 克隆 clone 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值, ...

  4. cnblogs博客使用LaTeX公式

    $ Entropy\ H(X) = -\sum p(X)\log p(X) $ $ Information\ Gain\ I(X,Y)= H(X)-H(X|Y) $ $ \pi $ = 3.14159 ...

  5. python+selenium破解极验验证登录

    1.前言: 目前很多网站会在正常的账号密码认证之外加一些验证码,以此来明确区分人/机行为,最典型的就是极验滑动验证.(如下图) 这里我们以简单实例说明如何实现自动校验类似验证. 2.步骤: 1)点击验 ...

  6. 推荐几个天气Api接口 (可在小程序中使用)

    国内的地图软件基本是支持查询天气的唯独腾讯地图不支持天气查询,当然其他天气平台提供的接口也是够个人使用的 1.高德地图(高德地图开发者平台)支持获取实时天气数据 2.百度地图(百度地图开放平台)支持获 ...

  7. Codeforces Round #569 (Div. 2) C. Valeriy and Deque

    链接: https://codeforces.com/contest/1180/problem/C 题意: Recently, on the course of algorithms and data ...

  8. pyqt5-QTDesigner--UI文件的使用方式

    方式一:直接加载UI文件 from PyQt5.QtWidgets import QApplication, QWidget import sys class win(QWidget): def __ ...

  9. 【NOIP2016提高A组集训第3场10.31】高维宇宙

    题解 分析 因为只有奇数和偶数配对才有可能得出质数, 暴力求出每一对\(a_i+a_j\)为质数,将其中的奇数想偶数连一条边. 二分图匹配,匈牙利算法. #include <cmath> ...

  10. hdu 1724 : Ellipse 【Simpson积分】

    题目链接 题意:给出椭圆方程中的a和b,再给出l.r,求l到r的积分的二倍. 输出时要求精度控制为保留到小数点后3位,如下代码中,eps设为1e-9 1e-8时均TLE,1e-4可以AC,1e-3会W ...