首页 > 系统相关 >【windows内核】探索WIN32 API的奥秘:通过window消息实现进程间通信

【windows内核】探索WIN32 API的奥秘:通过window消息实现进程间通信

时间:2024-12-09 21:33:01浏览次数:11  
标签:WIN32 IntPtr windows MSGDATA 间通信 int SendMessage 消息 msg

在应用开发中,常需实现应用间的数据交换,常用方法包括共享内存、共享存储、管道、消息队列及socket等。
今天,我们来介绍一种Windows下的通信方式——通过window消息实现进程间通信。这种方式在特定场景下非常有效,能够简化进程间的数据交换过程。

windows消息机制

windows是一个消息驱动的系统,windows的消息提供了应用程序之间、应用程序与windows 系统之间进行通信的手段。

Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视化的交互方式,窗口是总是在某个线程(Thread)内创建的。Windows系统通过消息机制来管理交互,消息(Message)被发送,保存,处理,一个线程会维护自己的一套消息队列(Message Queue),以保持线程间的独占性。队列的特点无非是先进先出,这种机制可以实现一种异步的需求响应过程。

SendMessage函数

该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是应用程序和应用程序之间进行消息传递的主要手段之一。

函数原型:

IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam);

参数说明

hWnd:其窗口程序将接收消息的窗口的句柄。
Msg:指定被发送的消息
wParam:指定附加的消息指定信息
IParam:指定附加的消息指定信息
返回值:返回消息处理的结果,依赖于所发送的消息

实现方式

定义消息ID、要传递的消息结构以及要调用WIN32函数

const int WM_SENDDATA = 0x004A;//消息ID
public struct MSGDATA
{
    public IntPtr dwData; // 可以是任意值
    public int lpLength;    // 指定lpData内存区域的字节数
    [MarshalAs(UnmanagedType.LPStr)]
    public string lpData; //消息内容
}

[DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, ref MSGDATA lParam);

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

获取要发送消息的窗体,向该窗体发送消息

IntPtr mainHandle = FindWindow(null, "座山雕");//获得要发送消息的窗体
if (mainHandle != IntPtr.Zero)
{
    MSGDATA msg;
    byte[] arr = System.Text.Encoding.Default.GetBytes(msgInfo);
    msg.dwData = (IntPtr)0;
    msg.lpLength = arr.Length + 1;
    msg.lpData = msgInfo;//消息内容
    SendMessage(mainHandle, WM_SENDDATA, 0, ref msg);
}

接收消息的实现方式

protected override void WndProc(ref Message m)//WinForm窗体要重写该方法
{
    if (m.Msg == WM_SENDDATA)
    {
        MSGDATA cds = new MSGDATA();
        Type t = cds.GetType();
        cds = (MSGDATA)m.GetLParam(t);
        string receiveInfo = cds.lpData;//消息内容
        this.richTextBox1.Text += "座山雕:" + receiveInfo + "\r\n";
    }
    else
    {
        base.DefWndProc(ref m);
    }
}

程序演示

PostMessage和SendMessage的区别

PostMessage 是异步的,SendMessage 是同步的。
PostMessage 只把消息放到队列,不管消息是不是被处理就返回,消息可能不被处理;
SendMessage等待消息被处理完了才返回,如果消息不被处理,发送消息的线程将一直处于阻塞状态,等待消息的返回。

原创 九天银河聊编程

标签:WIN32,IntPtr,windows,MSGDATA,间通信,int,SendMessage,消息,msg
From: https://www.cnblogs.com/o-O-oO/p/18596076

相关文章

  • 【Windows内核】探索WIN32 API的奥秘:轻松抓取其他应用程序界面上的内容
    在Windows操作系统中,各式各样的应用程序构成了我们日常工作和生活的数字世界。这些应用程序的界面上展示着丰富的信息,有时我们可能希望将这些信息提取出来,用于进一步的分析、处理或自动化任务。在Windows操作系统中可以通过WIN32API定位到目标应用程序的窗口,获取其句柄,进而读取......
  • 在Windows或者macOS上使用FFmpeg合并.h264文件(包含FFmpeg 安装)
    1.FFmpeg的安装1.1Windows1.2macOS2.使用FFmpeg合并.h264文件1.FFmpeg的安装FFmpeg是一个强大的多媒体框架,可以用来处理视频和音频文件。这里主要介绍其在Windows和macOS上的安装方法:1.1Windows访问FFmpeg的官方网站或GitHub仓库下载适用于Windows的静态......
  • 记录报错:HADOOP_HOME and hadoop.home.dir are unset. -see https://wiki.apache.org/
    报错内容java.io.FileNotFoundException:java.io.FileNotFoundException:HADOOP_HOMEandhadoop.home.dirareunset.-seehttps://wiki.apache.org/hadoop/WindowsProblems第一次运行hadoop程序时,报了以上错误(java.io.FileNotFoundException:java.io.FileNotFoundEx......
  • windows隐藏账户、影子账户
    隐藏账户(HiddenAccount)和影子账户(ShadowAccount)并不是同一个概念,它们在计算机安全和系统管理中有不同的含义:隐藏账户(HiddenAccount):在操作系统或网络服务中,隐藏账户是指那些不在标准用户列表中显示的账户。这种账户通常被管理员用来进行远程访问或执行特定的管理任务,而不被......
  • wtsapi32.dll文件运行异常:Windows平台上的处理指南
    在使用Windows操作系统时,有时你可能会遇到一些与系统文件相关的错误,其中wtsapi32.dll文件运行异常就是一个较为常见的问题。wtsapi32.dll是Windows操作系统中的一个关键动态链接库(DLL)文件,它主要用于支持远程桌面协议(RDP)和其他终端服务相关的功能。当这个文件出现问题时,可能会导......
  • dragonfly.dll:Windows系统文件夹中的重要组件及其作用
    在Windows操作系统的庞大架构中,存在着众多不可或缺的系统文件,它们如同精密机械中的各个部件,共同驱动着整个系统的稳定运行。其中,dragonfly.dll(请注意,dragonfly.dll并非一个标准的或广为人知的Windows系统文件,此处为示例构建,旨在阐述DLL文件在Windows系统中的作用和重要性,实际使......
  • windows使用Zed编辑器
    前言众所周知,zed并没有发布windows版本,而是率先发布mac版本。windows版本需要自行编译。然而我都用windows了,你还让我编译多少有点说不过去。因此我找到了两个项目,他们发布了编译好了的windows版本zed。https://github.com/shenjackyuanjie/zed-win-build/releaseshttps://g......
  • Windows用户组(探究失败
    前言之前想要使用Scoop来管理应用(有部分github开源软件的发行使用scoop,不然我直接下载安装了)。但是Scoop不能在管理员状态下安装,于是我借此机会,了解一下windows的用户组。我的情况是,无论如何也无法切换到正常的命令行环境,始终是管理员权限。简单推测后,排除了配置文件的问题,查看......
  • windows10电脑缺少dll文件的解决方案,系统缺少dll修复指南
    在使用Windows10操作系统时,有时会遇到由于缺少某些动态链接库(DynamicLinkLibrary,简称DLL)文件而导致程序无法正常运行的问题。本指南将介绍几种解决此类问题的方法。什么是DLL文件?DLL文件是Windows系统中的一种特殊类型的文件,它包含了可以被多个应用程序共享的功能代码......
  • Ruby 安装 - Windows
    下面列出了在Windows机器上安装Ruby的步骤。下载地址:官网:http://rubyinstaller.org/downloads/国内:RubyInstallerforWindows-RubyInstaller国内镜像站注意:在安装时,您可能有不同的可用版本。Window系统下,我们可以使用RubyInstaller来安装Ruby环境,下载地址为:请......