windows进程间通信

企业级AI项目落地实战指南 企业级 AI 项目落地需构建“分阶段实施 + 多维度风控”的双轮驱动体系:实施端通过 POC 验证技术可行性、试点建立评估标准、规模化实现价值复制,各阶段需结合行业案例(如东阳光药、旺盈集团)提炼可复用经验;风险端则需覆盖技术(数据安全、模型稳定性)、合规(全球监管动态)、组织(人才与文化)维度,通过工具化框架(AI TRISM)与案例策略(邮储银行可解释性设计、拓斯达培训体系)实现风险可控。最终通过“场景聚焦 - 合规嵌入 - 持续优化”的循环机制,实现 AI 技术从“试点成功”到“全面价值创造”的跨越。 阅读详情

这次我们来说一下通过windows消息机制来进行进程间的通信。

如果只是简单的传递一个值,可以定义一个自己的消息类型。
如果需要传递较复杂的类型,可以使用Data Copy
 

说明:

WM_USER常量

WM_USER常量是用来给帮助应用程序定义自己的用户消息,常用的形式如:

WM_USER + X,其中X 是一个整数。通过这个常量的定义消息的发送方与接收方就可以行成一个协议。

public const int WM_USER = 0x0400;

更多关于WM_USER的信息请参考:

http://msdn.microsoft.com/zh-cn/library/ms644931(en-us,VS.85).aspx

WM_COPYDATA 消息

一个应用程序可以通过WM_COPYDATA发送数据给接收方。

WM_COPYDATA只可以能过SendMessage发送,如果使用PostMessage,接收方就不会收到发送的消息,因为PostMessage不是同步的调用,这样就无法保证在接收方收到消息的时个WM_COPYDATA中的数据还正确的保存在内存中。我在一开始实现WM_COPYDATA消息的时候就犯了这个错误。

SendMessage的声明:

[DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtrhWnd, int msg, IntPtr wParam, ref COPYDATASTRUCT lParam);

COPYDATASTRUCT结构是真正用来传递数据的结构,我们有必要先来看一个这个结构的样子:代码中有注释,不多说了。

public struct COPYDATASTRUCT

      {

            public IntPtr dwData;//Specifies data to be passed to the receiving application.

            public int cbData;//Specifies the size, in bytes, of the data pointed to by the lpData member.

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;//Pointer to data to be passed to the receiving application. This member can be NULL.

}

 

也可以参考:

http://msdn.microsoft.com/zh-cn/partners/ms649011(en-us,VS.85).aspx

 

得到接收消息窗口的句柄

在上边SendMessage的方法声明中第一个参数需要一个hWnd(IntPtr)的数据,其实这应该是接收消息的窗口句柄,如何来得到这个句柄呢?这是一个很关键的问题。有两种方法:

1.       通过窗体的Title找到窗体,从而得到句柄

我是通过遍历系统中所有窗体的方法来找到窗体,在这过程中用到的API:

public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);

 

        [DllImport("user32.dll")]

        public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);

 

        [DllImport("user32.dll")] public static extern int GetWindowText(IntPtrhWnd, StringBuilder title, int size);

 

部分代码:

public void EnumWindwos(string name)

        {

            this.name = name;

            Win32Wrapper.EnumWindowsProc _EunmWindows = newWin32Wrapper.EnumWindowsProc(NetEnumWindows);

            Win32Wrapper.EnumWindows(_EunmWindows, 0);

        }

 

        private bool NetEnumWindows(IntPtr handle, int p_Param)

        {

            StringBuilder sb = new StringBuilder(256);

            Win32Wrapper.GetWindowText(handle, sb, 256);

 

            if (sb != null)

                //System.Windows.Forms.MessageBox.Show(sb.ToString());

                if (string.Compare(name, sb.ToString(), true) == 0)

                    hwnd = handle;

 

            return hwnd == IntPtr.Zero;

   }

2.       通过进程名字来得到进程主窗体的句柄。

在C#是这个实现起来比较简单,但是有一点需要注意的是:Visual Studio在调试应用程序和真正运行应用程序的时候进程的名字不一样。

具体代码:

        private IntPtr GetProcessMainFormHandle(string name, FindHandleTypetype)

        {

            if (type == FindHandleType.ProcessName)

            {

                Process process = GetProcessByName(name);

                if (process != null)

                    return process.MainWindowHandle;

                return IntPtr.Zero;

            }

            else if (type == FindHandleType.WindowName)

            {

                Win32EnumWindows win32Enum = new Win32EnumWindows();

                win32Enum.EnumWindwos(name);

                return win32Enum.Hwnd;

                //return Win32Wraper.FindWindow(string.Empty, name);

            }

 

            return IntPtr.Zero;

        }

 

        private Process GetProcessByName(string processName)

        {

            Process[] processes = Process.GetProcesses();

            foreach (Process p in processes)

            {

                //just for debug

                //this method has some question because the visual studio started process name

                //is not same with the release. so yan can close visual studio to test the project.

                //normal, you should use if(p.ProcessName == processName)

 

                //debug

                //if (p.ProcessName.StartsWith(processName))

                //    return p;

 

                //release

                if (p.ProcessName == processName)

                    return p;

            }

            return null;

        }

   到现在,发送方已经可以把消息发送到接收方的消息队列中了,那么接收方如何接收消息呢?

通过在WndProc方法中来接收双方协议好的消息:

protected override void WndProc(ref Message m)

        {

            switch (m.Msg)

            {

                case Win32Wrapper.WM_USER_TEST:

                    AddMessage("WndProc", m);

                    //if you call base.WndProc then the DefWndProc will handle this msg agaion.

                    //base.WndProc(ref m);

                    break;

                case Win32Wrapper.WM_COPYDATA:

                    Win32Wrapper.COPYDATASTRUCT mystr = newWin32Wrapper.COPYDATASTRUCT();

                    Type mytype = mystr.GetType();

                    mystr = (Win32Wrapper.COPYDATASTRUCT)m.GetLParam(mytype);

                    AddMessage("WndProc", mystr);

                    //base.WndProc(ref m);

                    break;

                default:

                    base.WndProc(ref m);

                    break;

            }

   }

一定不要忘记,自己不处理的消息要调用base.WndProc(ref m);这样才可以保证自己不处理的消息可以被其它需要处理的地方接收到。在.Net所以在WndProc中没有被处理的消息都会送到别一个消息处理函数中,名字叫做:DefWndProc, 这们来看,在这个消息函数中处理我们的消息也是可以的,但是最好还是在WndProc中处理比较好,这们大家比较好理解。

 

        protected override void DefWndProc(ref Message m)

        {

            switch (m.Msg)

            {

                case Win32Wrapper.WM_USER_UNDEFINED:

                    AddMessage("DefWndProc", m);

                    break;

                default:

                    base.DefWndProc(ref m);

                    break;

            }

  }

 

一点补充:

实际上我们还可以在别外一个地方来处理我们的消息,这个函数的名字叫做:OnNotifyMessage。在.NET下如果想在这个方法中统一处理我们自己的消息,需要设置一个FormStyle:

this.SetStyle(ControlStyles.EnableNotifyMessage, !this.GetStyle(ControlStyles.EnableNotifyMessage));

通过这个语句可以在打开NotifyMessage和关闭NotifyMessage之间转换,当然你也可以直接设置其值为true.

OnNotifyMessage函数中的实现方法是一样的,给出一个例子:

        protected override void OnNotifyMessage(Message m)

        {

            switch (m.Msg)

            {

                case Win32Wrapper.WM_USER_TEST:

                    AddMessage("OnNotifyMessage", m);

                    break;

                case Win32Wrapper.WM_COPYDATA:

                    Win32Wrapper.COPYDATASTRUCT mystr = newWin32Wrapper.COPYDATASTRUCT();

                    Type mytype = mystr.GetType();

                    mystr = (Win32Wrapper.COPYDATASTRUCT)m.GetLParam(mytype);

                    AddMessage("OnNotifyMessage", mystr);

                    break;

                default:

                    base.OnNotifyMessage(m);

                    break;

            }

  }

过滤消息功能:

最后来看一下关于过滤消息的应用。如果我们想在一个统一的地方把一些我们不想处理的消息过滤掉,如何处理呢。可以通过如下的函数来实现:

添加过滤:

Application.AddMessageFilter(MessageFilter.Filter);

取消过滤:

Application.RemoveMessageFilter(MessageFilter.Filter);

过滤消息的类:

    public class MessageFilter : IMessageFilter

    {

        static MessageFilter filter = new MessageFilter();

 

        public static MessageFilter Filter

        {

            get { return MessageFilter.filter; }

        }

 

        #region IMessageFilter Members

 

        public bool PreFilterMessage(ref Message m)

        {

            return (m.Msg >= Win32Wrapper.WM_USER);

        }

 

        #endregion

}

 

太简单了,不写了。

 

好了,最后给一下完整的代码,上面提到在代码中都有实现,写的有点乱,请包含。因为在调试环境中,进程名字不同的原因,调试环境下通过进程名字的方法应该工作不正常,你可以通过把注释的代码放开,也可以直接运行编译应用程序。

http://houzhengqing.qupan.com/4596371.html

 

解密OpenVLA的ActionTokenizer:如何用256个Token控制7维机器人动作 本文深入解析了OpenVLA模型中ActionTokenizer的核心机制。该分词器通过将7维连续机器人动作空间离散化为256个Token,巧妙地解决了大语言模型输出精确控制指令的难题。文章详细阐述了其设计哲学、与Llama-2词表的集成方式,并分析了256个离散区间在精度与效率间的平衡,为机器人视觉-语言-动作控制提供了关键技术桥梁。 阅读详情

相关推荐

生成式引擎优化(GEO)全流程解析

生成式引擎优化(GEO)已成为AI时代数字营销新趋势,通过优化企业内容以提升在AI生成答案中的引用率。本文系统梳理了GEO优化的完整流程,包括:1)前期准备与市场调研;2)数据治理与知识库构建;3)模型适配与算法优化;4)内容权威性建设;5)本地化营销;6)效果监测与优化。研究显示,实施GEO的企业AI曝光率提升62%,转化率增长2.3倍。未来GEO将向多模态内容、实时个性化、垂直场景深化方向发展。企业需建立动态知识图谱,采用结构化数据标记,持续优化内容策略,以在AI搜索时代获取流量优势。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 3246

32位&64位版本Windows下运行win32程序扩展用户模式虚拟地址~

/3GB /3GB 在 32 位版本的 Windows 上,/3GB 参数启用 4 GT RAM 调节,该功能将用户模式虚拟地址空间放大到 3 GB 并将内核模式组建限制在剩余的 1 GB。     /3GB [ /userva=SizeInMB ]       子参数 /userva 为使用 /3GB 参数启

兴趣是最好的老师 1626

WPF实战:HelixToolkit 3D图形开发入门指南

本文详细介绍了如何使用HelixToolkit在WPF中进行3D图形开发,从环境搭建到创建第一个3D程序(如彩色立方体),再到进阶技巧和常见问题排查。通过实战案例和性能优化建议,帮助开发者快速掌握3D场景构建和模型导入技术,提升开发效率。

weixin_29197051的博客 761

Windows核心编程 进程间通信

Windows核心编程 进程间通信的方式

qq_61553520的博客 2891

基于线性光耦HCNR200的高压直流采样电路设计与精度优化

本文详细介绍了基于线性光耦HCNR200的高压直流采样电路设计与精度优化方法。针对直流高电压测量中的安全与干扰问题,提出采用HCNR200光耦隔离方案,实现高精度线性传输。文章深入解析电路设计关键细节,包括电阻网络、运放选型、滤波电容配置等,并提供精度优化实战技巧与常见问题排查指南,助力新能源电动汽车和高压储能系统的高压直流采样应用。

weixin_42713608的博客 579

【Linux】实际项目应该如何完成?--安防监控系统项目的总结

到目前为止我也做个5、6个嵌入式项目,但以往都是从零开始自己做,也就是毫无计划,想到那里做那里,有想法就会去实现,就这样导致我碰到了很多坑,也消耗了我许多时间,当然,不是说这样不好,因为在其中我也得到了一个很好的锻炼与练习,但是这不适用于在工作中去这样做。...

修成真的博客 6727

Windows下进程间通信

1. WM_COPYDATA 这种方法仅适合于Windows的GUI程序。利用WM_COPYDATA消息来进行进程间通信。其原理是如下: 在x86下,由于保护模式下进程都具有虚拟内存。所以每个进程都拥有4GB的虚存空间,并通过分页机制进行寻址管理。其中2GB的内核空间是进程共享的而2GB的用户空间则是每个进程独立拥有。 WM_COPYDATA消息会在内核空间开辟一段缓冲区。然后把要输入的内容传递进去。由于内核空间是共享的,所以其他进程可以直接获取。 这种方法比较消耗资源,不推荐携带大量数据。

輚至消亡 3542

Unity UGUI深度优化

Unity UGUI优化相关

不定时分享所学所得,包括游戏开发和其他收获! 2717

Windows系统编程 - 进程间通信

介绍了常用的进程通信方式:WM_COPYDATA、DLL共享段、文件映射、管道的相关知识

weixin_58038441的博客 1330

temu登录接口逆向分析(含Py纯算)

【代码】temu登录接口逆向分析(含Py纯算)

数据精灵喵 1946

DeepLabv3+改进专栏

🔥【DeepLabv3+改进专栏!探索语义分割新高度】🌟 你是否在为图像分割的精度与效率发愁?📢 本专栏重磅推出:✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化✅ 即插即用模块:ASPP+升级、解码器。

AIcurator的博客 2576

Windows——进程间通信

进程间通信进程间通信的概念Mailslots关于Mailslots命名规则使用管道关于管道匿名管道命名管道管道进阶 进程间通信的概念 每一个进程都是拥有自己独立的虚拟地址空间和页表结构,促使了进程独立,这也导致了进程之间合作存在问题,为了解决该问题,产生了进程间的通信。 Windows操作系统提供了促进应用程序之间的通信和数据共享的机制。 Mailslots mailslot 是一种机制,用于通过 IPC (单向) 。 应用程序可以将消息存储在 mailslot 中。 mailslot 的所有者可

qq_44745063的博客 3532

【AUTOSAR SystemServices】AUTOSAR CP中Watchdog Manager模块技术解析

本文深入解析了AUTOSAR中的Watchdog Manager模块实现。该模块通过多层次监督机制(Alive/Deadline/Logical Supervision)确保系统安全运行,具备动态模式切换和分级故障处理能力。 关键实现包括: 数据结构设计:包含监督实体状态结构体(实时状态维护)、监督配置结构体(支持模式切换)和全局状态信息(系统级监控) 核心流程优化:初始化采用事务性设计,检查点处理通过条件编译优化,主监控循环采用流水线式并行处理 监督机制实现:Alive监督采用滑动窗口算法,Deadlin

1038

C/C++ windows 进程间通信

发送端代码: HWND hwnd = ::FindWindow(NULL,TEXT("接收端窗口名")); if(hwnd == NULL) { MessageBox(0,TEXT("没找到窗口"),TEXT("ERROR"),MB_OK); } else { // ...

网瘾少年丶的博客 2365

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Windows进程间通信

因为Windows中每个进程都有自己的虚拟地址空间,所以一个进程无法访问到别一个进程的地址空间,因此相对来说进程间的通信要复杂一些。Windows操作系统为应用程序之间的进程间通信,数据共享提供了很多机制,称为interprocess communications (IPC)。其中一些机制可以用来在同一台计算机内不同进程之间通信,一些可以在网络中不同计算机上运行的进程之间进行通信。    典

suhuaiqiang_janlay的专栏 1685

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

windows 进程间通信

Windows内核所支持的进程间通信手段有:     l 共享内存区(Section)。     l 信号量(Semaphore)。     l 互斥门(Mutant)。     l 事件(Event)。

Yulay专栏 974

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

windows下进程间通信的

windows下进程间通信的 2010年09月04日   [b]windows下进程间通信的手段有哪些?[/b][b] [/b][b]收藏 [/b]   摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的。Microsoft Win32 API提供了多种进...

rl784rl 507

Windows进程间通信之:消息队列

这个消息特别适用于跨进程通信,允许一个应用程序向另一个应用程序的窗口发送数据,无论这些数据是简单的数值、字符串还是更复杂的结构通。这些消息被发送到一个特定的消息队列中,随后由应用程序的消息循环处理。dwData:这是一个用户定义的数据值,发送方可以使用它来传递额外的信息或数据类型标识,接收方则可以用它来决定如何解释接收到的数据。线程通过一个循环机制,称为消息循环或消息泵,从其消息队列中检索消息。hWnd:指定窗口的句柄,如果为NULL,则接收属于调用线程的任何窗口的消息。

zxf347085420的博客 671

C++ windows进程间通信

最近一直在找共享内存同步的操作,恰好这篇文章有讲解。本文转载:https://blog.youkuaiyun.com/bing_bing_bing_/article/details/82875302 方便记录,copy了一份。 2.进程间的通信 2.1进程 本章讲解windows平台下,进程间的通信方式。 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是操作系统动态执行的...

weixin_30496431的博客 266

windows 下的进程间通信

windows进程间通信 摘 要: 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的。Microsoft Win32 API提供了多种进程间通信的方法,全面地阐述了这些方法的特点,并加以比较和分析,希望能给读者选择通信方法提供参考。 关键词 进程 进程通信 

li1995qian的博客 452

Windows进程间通信的各种方法

Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行

u012422855的专栏 1070

Windows的进程间通信

对于任何一个现代的操作系统,进程间通信都是其系统结构的一个重要组成部分。而说到Windows的进程(线程)间通信,那就要看是在什么意义上说了。因为正如“Windows的跨进程操作”那篇漫谈中所述,在Windows上一个进程甚至可以“打开”另一个进程,并在对方的用户空间分配内存、再把程序或数据拷贝过去,最后还可以在目标进程中创建一个线程、让它为所欲为。显然,这已经不只是进程间的“通信”,而是...

weixin_33775572的博客 105

Windows平台进程间通信机制

互联网桌面应用上有时候无法避免的需要在不同进程间进行通信,传递数据或共享执行相同的代码:比如不同的客户端共享登陆态,不同的应用程序需要复制粘贴数据,边下边播时下载客户端与播放器客户端互相传递下载任务状态或播放状态,或者不同浏览器进程间的跨进程调用等等。 大部分桌面应用都是基于Widnows系统开发,Windows操作系统为不同应用程序间通信提供了一系列的机制,即我们常说的Inter-Process...

Mplayer_的博客 473

windows下进程间通信

windows下进程间通信的手段有哪些? 收藏 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的。Microsoft Win32 API提供了多种进程间通信的方法,全面地阐述了这些方法的特点,并加以比较和分析,希望能给读者选择通信方法提供参考。 关键

千里之外 2396
上一篇: 一个正规软件公司工作职责划分
下一篇: 名词解释
andycode
博客等级 码龄17年 12粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值