场景 :需要开发一个通讯组件 流程为:界面-开启接收服务-通过发送组件发送信息到 其他客户端和服务端

接受服务接收其他客户端发送的消息 需要传递给对应组件或者界面 因此会出现类库重复引用问题。因为采用消息队列,和数据库中转来传递消息需要每个组件知道太多其他组件的业务,并且耗损性能和时间更多一下因此都被排除掉。最后采用Windows API传递消息

后续如果有更好地办法再继续更新上来

由于项目进程间和线程间需要进行通讯,因此通过api调用windows底层消息传递
   [DllImport("User32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(IntPtr wnd, int msg, IntPtr wP, IntPtr lP); 

但是由于程序开发是WPF因此与传统的WinForm调用 PostMessage 消息有一定区别,并且无法传递结构体

因此通过实验和调查实现了WPF调用PostMessage传递消息,并且支持传递结构体(转换概念:现将结构体进行转换为16进制,WinProc接收后在进行转换为结构体) 具体代码如下:

/// <summary>
        /// Receive message window form handle 消息接收窗口句柄
        /// </summary>
        public static IntPtr Handle;

/// <summary>
        /// PostMessage Dll Import API方法
        /// </summary>
        [DllImport("User32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(IntPtr wnd, int msg, IntPtr wP, IntPtr lP);

/// <summary>
        /// Message Data Struct  结构体
        /// </summary>
        public struct MessageDataStruct
        {
//message对象
            public CMessageData messageData;
        }

/// <summary>
        /// user-defined message no 自定义消息
        /// </summary>
        public const int USER_MESSAGE = 0x0400;

发送消息

/// <summary>
        /// Send mesage data to window message queue
        /// </summary>
        /// <param name="messageData">message data</param>
        public void PostMessageToMessageQueue(MessageDataStruct messageData)
        {
            //结构体赋值
            MessageDataStruct mds = new MessageDataStruct();
            mds.messageData = new CMessageData();
            LocalClientInfo lci = new LocalClientInfo();
            lci.ClientID = "我是客户端id";
            lci.ClientIP = "我是客户端ip";
            mds.messageData.LocalClientInfo = new LocalClientInfo();
            mds.messageData.LocalClientInfo = lci;

            //结构体转换为 IntPtr 16进制
            IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(mds));
            Marshal.StructureToPtr(mds, buffer, false);
            //发送消息
            PostMessage(Handle, BaseTypeParameters.USER_MESSAGE(等同于消息编号), buffer, IntPtr.Zero);
        }

Windows消息接收

调用系统WinProc方法

void win_SourceInitialized(object sender, EventArgs e)
        {

            HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
            if (hwndSource != null)
            {
                hwndSource.AddHook(new HwndSourceHook(WindowProc));
            }
        }
        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            this.win_SourceInitialized(this, e);
        }
        #region USB识别操
        private IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            IntPtr result = IntPtr.Zero;
            {
                //WM_DEVICECHANGE,系统硬件改变发出的系统消息   
                int param = msg;
                switch (param)
                {
//判断是否为自定义消息
                    case BaseTypeParameters.USER_MESSAGE:
//将消息转换为结构体 
                        MessageDataStruct mds = (MessageDataStruct)Marshal.PtrToStructure(wParam, typeof(MessageDataStruct));
                        MessageBox.Show(mds.messageData.LocalClientInfo.ClientID + "----" + mds.messageData.LocalClientInfo.ClientIP);
                        break;
                }
                return result;
            }
        }
        #endregion

//将窗句柄赋值给服务
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            ReceiveDataImplement.Handle = new WindowInteropHelper(this).Handle;
        }

WPF向系统发送消息 并传递结构体的更多相关文章

  1. C#调用C++DLL传递结构体数组的终极解决方案

    在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型 ...

  2. 绝对好文C#调用C++DLL传递结构体数组的终极解决方案

    C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文  http://blog.csdn.net/xxdddail/art ...

  3. python调用c/c++时传递结构体参数

    背景:使用python调用linux的动态库SO文件,并调用里边的c函数,向里边传递结构体参数.直接上代码 //test1.c # include <stdio.h> # include ...

  4. Winform 程序嵌入WPF程序 并发送消息

    废话不多说,先看解决方案目录 WindowsFormsDemo是主程序,WpfApp是嵌入的WPF程序,先看WPF程序,程序默认启动的页面是MainWindow.xaml,这里注释掉App.xaml里 ...

  5. c++与C# winform的消息通讯--(结构体与byte数组的使用)

    近期正在做一个蓝牙驱动的使用程序,其中有一块从c++发送数据到C#的部分,网上查了很多资料,大多都是介绍如何通过调用函数获取用户数据.并且在消息发送中,很少介绍如何发送一个结构体,并且结构体里面有 b ...

  6. Unix基本系统数据类型和stat结构体

    Unix基本系统数据类型 历史上,某些UNIX变量已与某些C数据类型联系在一起,例如,历史上主.次设备号存放在一个1 6位的短整型中, 8位表示主设备号,另外8位表示次设备号.但是,很多较大的系统需要 ...

  7. python 传递结构体指针到 c++ dll

    CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED ...

  8. go 函数传递结构体

    我定义了一个结构体,想要在函数中改变结构体的值,记录一下,以防忘记 ep: type Matrix struct{ rowlen int columnlen int list []int } 这是一个 ...

  9. CreateThread创建线程传递结构体参数

    #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <stdli ...

随机推荐

  1. Spring学习笔记之基础、IOC、DI(1)

    0.0 Spring基本特性 Spring是一个开源框架:是基于Core来架构多层JavaEE系统 1.0 IOC 控制反转:把对象的创建过程交给spring容器来做. 1.1 application ...

  2. Java 开源博客 Solo 1.1.0 发布 - 告别 GAE

    Solo 1.1.0 正式发布了,感谢一直以来关注 B3log 开源的朋友! 在这个版本中,我们对项目结构和发布包进行了重大调整: 各式***尚未普及,所以决定去除 GAE 版本 H2 版本使用人数较 ...

  3. DB2 char长度问题

    问题:发现用char转换了后的值长度都变为了11,更长的变为了254

  4. 基于Linux/C++简单线程池的实现

    我们知道Java语言对于多线程的支持十分丰富,JDK本身提供了很多性能优良的库,包括ThreadPoolExecutor和ScheduleThreadPoolExecutor等.C++11中的STL也 ...

  5. jq遍历 下拉框

    var selectA1 = $("select[name=A1]"); //从A1下拉框中 搜索值 $(selectA1).children("option" ...

  6. CorelDRAW X7软件中如何将图片剪贴到文字中

    将 图片剪贴到文字中是平面设计常用的一种处理方法之一,将图片剪贴到文字中是指将图片置入到该文字,且图片的外轮廓是沿着文字的形状剪贴的,这种处理手法被广泛应用于排版设计中.本教程将带大家了解如何用Cor ...

  7. 创建一个dynamics CRM workflow (三) - Creating Configuration Entity for Custom Workflow

    上个帖子中, 我们创建了个发email的workflow. 但是我们邮件当中的tax 值是 hard code, 这在开发当中是不容许的. 那今天我们来把这个build in workflow用 in ...

  8. SQL增删改

    USE sqlxx CREATE TABLE ygb( sid INT, sname VARCHAR(20), sgender VARCHAR(2), sbirthday DATE, semail V ...

  9. awk一次性分别赋值多个value给多个变量,速度对比

    方法 #方法1: echo "apple banana orange" | awk '{print $1,$2,$3}' | while read a b c do echo a= ...

  10. flex笔记 - 基础

    flex笔记 - 基础 文章中的所有图示代码都放在了github上: 阮一峰flex博客跟学代码 传统的布局解决方案,基于盒模型, 依赖 display, position, float属性来进行布局 ...