VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解

article/2025/10/16 8:05:34

目录

一、代码背景

二、主要工具

三、函数解析

1、FindWindow:

2、 FindWindowEx:

3、SendMessage:

四、具体代码示例:

 1、第一部分功能:

A、接收端:

B、发送端

C、运行测试

2.第二部分功能:

A、接收端

B、发送端

C、运行测试


一、代码背景

 针对复杂的多进程软件的编写,各进程间的通信能够保证任务的并行处理,而非多线程的伪并行。针对VB.net进程通信,本文所采用的是调用USER32内的Windows API函数。

二、主要工具

主要包括FindWindow、Fin的WindowEX、SendMessage函数。主要用到的工具为Visual Studio 和SPY++,SPY++自行百度下载。

三、函数解析

1、FindWindow:

根据标题名和窗体类别查找父窗体,并返回窗体的句柄数。声明过程如下:

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

lpClassName:窗体类的名字,具体窗体类的名字可以通过SPY++查看;

lpWindowName:窗体标题名字,具体窗体标题名字可以通过SPY++查看。

2、 FindWindowEx:

根据父窗体的句柄,和上一个子窗体的句柄及待查找的子窗体类名和窗体标题名字来查找待查找窗体的句柄。声明过程如下:

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer

hWnd1:父窗体句柄;

hWnd2:子窗体索引序号,为0则根据Z序列检索左下角满足要求的窗体,将得到的左下角窗体句柄赋给此参数,则根据Z序列检索左下角窗体下一个窗体的句柄。

关于Z序列的解释:子窗体在VB Form中的排序按照Z序列排序,所谓Z序列是指在XY坐标系的第一象限根据Z的笔顺来排序的,而由于电脑窗体的XY的方向是水平向右为X,竖直向下为Y,故与现实生活中的XY坐标系沿着X轴进行镜像,如下图所示。

 依次检索上图右侧①②③④即可索引到对应位置窗体的句柄。

lpsz1:子窗体类的名字,具体窗体类的名字可以通过SPY++查看;

lpsz2:子窗体标题的名字,具体窗体标题的名字可以通过SPY++查看; 

关于lpsz2这个参数,笔者尝试TextBox、RichTextBox、Label等控件的Text属性均未检索成功,故采用VbNullString作为检索,即不考虑窗体标题名字,最终定位到每个句柄均依靠Z序列来实现。

3、SendMessage:

根据提供的句柄和消息类型及其余两个参数来实现进程间的通信。声明如下:

 Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As String) As Integer

hwnd:窗体的句柄;

wMsg:消息类型;

这个可以去看另一篇博主的文章,讲解wMsg参数常量值的。本文引用几处。

wMsg参数常量值:
  #DeFine WM_CREATE 0x01
  创建一个窗口
  #DeFine WM_DESTROY 0x02
  当一个窗口被破坏时发送
  #DeFine WM_MOVE 0x03
  移动一个窗口
  #DeFine WM_SIZE 0x05
  改变一个窗口的大小
  #DeFine WM_ACTIVATE 0x06
  一个窗口被激活或失去激活状态
  #DeFine WM_SETFOCUS 0x07
  一个窗口获得焦点
  #DeFine WM_KILLFOCUS 0x08
  一个窗口失去焦点
  #DeFine WM_ENABLE 0x0A
  一个窗口改变成Enable状态
  #DeFine WM_SETREDRAW 0x0B
  设置窗口是否能重画
  #DeFine WM_SETTEXT 0x0C
  应用程序发送此消息来设置一个窗口的文本
————————————————
版权声明:本文为CSDN博主「物联网小镇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41476542/article/details/106708127

其中  #DeFine WM_SETTEXT 0x0C

是本文代码使用的常量,十进制为12,在VB.net中可以用十进制12表示,或者&HC来表示16进制的12。表示的意思为发送此消息来设置一个窗口的文本。

wParam:表示于常量有关的常量值,这个参数笔者没搞懂,但是默认0是好用的。

lParam:发送的字符串信息。

四、具体代码示例:

 1、第一部分功能:

发送端检索接收端四个Textbox窗口的句柄信息,并通过msgbox显示出来。

A、接收端:

不用添加任何代码,绘制四个Textbox,修改窗体Text属性为Receive,如下图所示。

运行接收端,使用SPY++查看TextBox文本框的类名 。

 B、发送端

绘制一个按钮 

 添加代码:

Public Class Form1Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntegerPrivate Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntegerPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As String) As Int32Dim myhwnd As Integer            '主窗口句柄Dim sub_1Hwnd As Integer         '子窗口1句柄Dim sub_2Hwnd As Integer         '子窗口2句柄Dim sub_3Hwnd As Integer         '子窗口3句柄Dim sub_4Hwnd As Integer         '子窗口4句柄Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Clickmyhwnd = FindWindow("WindowsForms10.Window.8.app.0.141b42a_r7_ad1", "Receive")    ’检索主窗体句柄sub_1Hwnd = FindWindowEx(myhwnd, 0, "WindowsForms10.EDIT.app.0.141b42a_r7_ad1", vbNullString)            ’检索子窗口1句柄sub_2Hwnd = FindWindowEx(myhwnd, sub_1Hwnd, "WindowsForms10.EDIT.app.0.141b42a_r7_ad1", vbNullString)            ’检索子窗口2句柄sub_3Hwnd = FindWindowEx(myhwnd, sub_2Hwnd, "WindowsForms10.EDIT.app.0.141b42a_r7_ad1", vbNullString)            ’检索子窗口3句柄sub_4Hwnd = FindWindowEx(myhwnd, sub_3Hwnd, "WindowsForms10.EDIT.app.0.141b42a_r7_ad1", vbNullString)            ’检索子窗口4句柄MsgBox(Hex(sub_1Hwnd) + "   " + Hex(sub_2Hwnd) + "   " + Hex(sub_3Hwnd) + "   " + Hex(sub_4Hwnd))            ’以16进制字符串显示句柄信息End Sub
End Class

C、运行测试

先运行接收端,再运行发送端并单击Button1测试:

弹出对话框,得出如下16进制句柄:

210EE6、171014、210604、191022

再次使用SPY++查找各个窗口的句柄

 

 

 满足我们推算的Z序列。

2.第二部分功能:

验证SendMessage通信,本代码Z序列中第2个窗口为例。

A、接收端

窗体控件不动,添加代码

Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.LoadTextBox3.Text = "窗口2"End SubPrivate Sub TextBox3_TextChanged(sender As Object, e As EventArgs) Handles TextBox3.TextChanged     'Texebox3窗口内容改变If TextBox3.Text <> "窗口2" Then                                                                'Texebox3窗口内容不等于窗口2MsgBox("收到数据:" + TextBox3.Text)                                                        '弹出收到数据:对话框End IfTextBox3.Text = "窗口2"                                                                          '恢复默认值窗口2End Sub
End Class

B、发送端

窗体增加Textbox控件作为发送信息的文本载体,如图

代码修改如下,增加SendMessage函数的调用:

Public Class Form1Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntegerPrivate Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntegerPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As String) As Int32Dim myhwnd As Integer            '主窗口句柄Dim sub_1Hwnd As Integer         '子窗口1句柄Dim sub_2Hwnd As Integer         '子窗口2句柄Dim sub_3Hwnd As Integer         '子窗口3句柄Dim sub_4Hwnd As Integer         '子窗口4句柄Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Clickmyhwnd = FindWindow("WindowsForms10.Window.8.app.0.141b42a_r7_ad1", "Receive")    ’检索主窗体句柄sub_1Hwnd = FindWindowEx(myhwnd, 0, "WindowsForms10.EDIT.app.0.141b42a_r7_ad1", vbNullString)            ’检索子窗口1句柄sub_2Hwnd = FindWindowEx(myhwnd, sub_1Hwnd, "WindowsForms10.EDIT.app.0.141b42a_r7_ad1", vbNullString)            ’检索子窗口2句柄sub_3Hwnd = FindWindowEx(myhwnd, sub_2Hwnd, "WindowsForms10.EDIT.app.0.141b42a_r7_ad1", vbNullString)            ’检索子窗口3句柄sub_4Hwnd = FindWindowEx(myhwnd, sub_3Hwnd, "WindowsForms10.EDIT.app.0.141b42a_r7_ad1", vbNullString)            ’检索子窗口4句柄'MsgBox(Hex(sub_1Hwnd) + "   " + Hex(sub_2Hwnd) + "   " + Hex(sub_3Hwnd) + "   " + Hex(sub_4Hwnd))            ’以16进制字符串显示句柄信息SendMessage(sub_2Hwnd, 12, 0, TextBox1.Text)TextBox1.Text = ""End Sub
End Class

C、运行测试

先运行接收端,再运行发送端,待发送窗口填写"Hello World"。并单击Button1(发送数据)测试,如接收端弹出:"接收数据:Hello World"。则测试成功

运行结果如图

 笔者水平有限,如有不足之处,评论区欢迎指教。

源码如

https://download.csdn.net/download/qq835128030/21700002?spm=1001.2014.3001.5503

注:Z序列理解有误,经过实践,笔者所推论的Z序列的理论属于巧合,sub_1Hwnd、sub_2Hwnd、sub_3Hwnd、sub_4Hwnd的值无论接收窗口文本框如何排列,均依次等于Textbox4、Textbox3、、Textbox2、、Textbox1的句柄。即文本框窗口的句柄检索排序按照放置的先后顺序的逆序,先放后检索。后放先检索。作如上修订。2021/08/30 23:19


http://chatgpt.dhexx.cn/article/GJNTllEF.shtml

相关文章

C#-FindWindow的用法

C# FindWindow用法 函数功能&#xff1a;该函数获得一个顶层窗口的句柄&#xff0c;该窗口的类名和窗口名与给定的字符串相匹配。 这个函数不查找子窗口。在查找时不区分大小写。 函数型&#xff1a;HWND FindWindow&#xff08;LPCTSTR IpClassName&#xff0c;LPCTSTR IpWi…

vb.net中FindWindow方法的使用

问题描述 遇到的问题是&#xff0c;需要判断MsgBox是否已经弹出&#xff0c;如果已经弹出就不要重复弹出了。 解决方案&#xff1a; 利用FindWindow方法判断MsgBox是否已经出现 MsgBox的本质就是一个窗体&#xff0c;有标题和内容&#xff0c;可以使用FindWindow这个API函数去…

C# FindWindow的用法

找了一大堆C#怎么用FindWindowAPI函数不多说,请看步骤. 创建好WinForm窗口,如果不会创建的话,在图下面有. 项目名字和位置这个自己设置,下面那个框架,目前现在出5.0了,为了演示实例,就4.6吧. 创建完成后,把自己窗口设置一下

FindWindow ,GetWindowThreadProcessId , OpenProcess 和ReadProcessMemory

文章目录 FindWindow函数功能&#xff1a;函数声明&#xff1a;第一个参数第二个参数返回值注意&#xff1a;GetWindowThreadProcessId函数功能函数声明第一个参数&#xff1a;第二个参数&#xff1a;返回值代码实现OpenProcess函数功能&#xff1a;函数声明&#xff1a;第一个…

【CV系列】主动轮廓模型snake及其应用

DATE: 2019.5.30 前言 主动轮廓模型(Active Contour Model)&#xff0c;又被称为Snake&#xff0c;是由Andrew Blake教授提出的一种目标轮廓描述方法&#xff0c;主要应用于基于形状的目标分割。该模型的优越之处在于它对于范围广泛的一系列视觉问题给出了统一的解决方法,在最…

图像分割之Snake主动轮廓模型(Matlab代码)

示例演示 如果在中文搜索的话&#xff0c;一般会找到《数字图像处理-图像分割&#xff1a;Snake主动轮廓模型 Matlab代码及运行结果》。里面有句代码&#xff0c;千万别用&#xff0c;否则出不来效果。&#xff08;别问我怎么知道的&#xff09; % 转化为双精度型 %I im2doub…

Snake活动轮廓模型Matlab实现

1. Snake模型 人为地在图像感兴趣的区域&#xff08;ROI&#xff09;上给出初始轮廓曲线&#xff0c;最小化一个能量函数&#xff0c;使轮廓曲线在图像中运动&#xff08;变形&#xff09;&#xff0c;最终逼近该区域的边界。 设v(s)[x(s),y(s)]为活动轮廓线&#xff0c;s∈[0,…

snake主动轮廓模型

模型&#xff1a;一条可变形的参数曲线及相应的能量函数&#xff0c;以最小化能量函数为目标&#xff0c;控制参数曲线变形&#xff0c;具有最小能量的闭合曲线即是目标轮廓。 snake模型调和了上层知识和底层图像特征矛盾。 上层知识指物体形状。表示内部力。 底层图像特征是局…

Snake活动轮廓模型

1. Snake模型 人为地在图像感兴趣的区域&#xff08;ROI&#xff09;上给出初始轮廓曲线&#xff0c;最小化一个能量函数&#xff0c;使轮廓曲线在图像中运动&#xff08;变形&#xff09;&#xff0c;最终逼近该区域的边界。 设v(s)[x(s),y(s)]为活动轮廓线&#xff0c;s∈[0,…

基于边缘的主动轮廓模型——从零到一用python实现snake

从零到一实现snake算法 1、Snake算法原理2、基于曲线演化的实现方法2.1演化方程推导2.2离散化过程2.3 代码实现 3、基于水平集的实现方法4、讨论与分析源码地址[snake](https://github.com/woshimami/snake) 1、Snake算法原理 Kass等人1最早于1988年提出了主动轮廓模型&#x…

主动轮廓模型snake

原理概述 snake模型将图像分割问题转换为求解能量泛函最小值的问题。主要思路是构造能量函数进行迭代后&#xff0c;轮廓曲线由初始位置逐渐向使能量函数最小&#xff08;局部极小&#xff09;的图像边缘逼近&#xff0c;最终分割出目标。 曲线理论 假设一条光滑封闭曲线 C …

腾讯电脑管家,vs安装文件报成木马,还能信吗?

今天在公司安装vs2013&#xff0c;安装过程中腾讯公司的产品“电脑管家”提示有新版本&#xff0c;没有犹豫的点了升级&#xff0c;完成后直接在管家主界面上点了“全面体检”按钮&#xff0c;这一点不要紧&#xff0c;报告有一个木马&#xff0c;看紧看一下“详情”&#xff0…

计算机windows8黑屏怎么办,Win8电脑开机黑屏只有鼠标光标怎么解决

有些win8系统用户在开机的时候&#xff0c;遇到了黑屏的情况&#xff0c; 整个屏幕上面只有一个闪烁的鼠标光标&#xff0c;导致无法进入到系统桌面&#xff0c;遇到这样的情况该怎么解决呢&#xff1f;现在给大家分享一下Win8电脑开机黑屏只有鼠标光标的具体解决方法吧。 Win8…

解决ValueError: Cannot run multiple SparkContexts at once; existing SparkContext

一、问题描述 创建sparkcontext和SparkSession&#xff0c;连接spark集群时报错&#xff0c;如题ValueError: Cannot run multiple SparkContexts at once; existing SparkContext。 from pyspark.sql import SparkSession from pyspark.sql import functions as F from pysp…

1、Qt线程(二):继承QThread,重写run

一、功能说明 1、通过继承QThread&#xff0c;重写run的方式实现多线程 2、点击“开始”按钮启动子线程&#xff0c;同时通过信号槽的方式给子线程发送“开始”字符串&#xff1b; 3、子线程每隔1秒向主线程发送累加数&#xff1b; 4、点击"停止"按钮&#xff0c…

诡异的RunOnce病毒启动项和神奇的URL Protocol

整理磁盘发现之前有个有趣的流氓招数忘记分享了,每次看到新鲜的东东都感慨黑暗势力的层出不穷的招数,比某些安全厂商是不是自相残杀好多了.电脑日常使用过程中我们经常输入开头为http ftp,点击诸如ed2k的链接,每个链接的背后都会执行相应的功能.如http 通过iexplore.exe,ed2k通…

如何创建水晶报表

开发工具与关键技术&#xff1a;VS与MVC 作者&#xff1a;刘华叶 撰写时间&#xff1a;2019年4月29日 MVC是软件工程中的一种软件架构模式&#xff0c;涉及到的知识点也是相当广泛&#xff0c;而我们在做项目的过程中&#xff0c;总会遇到要制作一些报表&#xff0c;水晶报表就…

java 水晶报表教程_水晶报表 (Crystal Reports 2008)的配置

概要&#xff1a; Crystal Reports(水晶报表)是一款商务智能(BI)软件&#xff0c;主要用于设计及产生报表。水晶报表是业内最专业、功能最强的报表系统&#xff0c;它除了强大的报表功能外。最大的优势是实现了与绝大多数流行开发工具的集成和接口。在VS.Net平台做过报表开发的…

水晶报表教程:手把手教你制作基本报表

ASP.NET水晶报表的学习 这篇文章教你如何在.Net Web应用中使用水晶报表&#xff0c;也可以让你在学习过程中少走一些弯路。为了得到最好的效果&#xff0c;读者最好需要有一些基础的Asp.Net访问数据库的知识以及使用VS.Net的开发经验。 简介 水晶报表可以由很多的方法得到&a…

水晶报表基本使用方法

开发工具与关键技术&#xff1a;VS/MVC 作者&#xff1a;何桂朋 撰写时间&#xff1a;2019年4月22日 Crystal Reports&#xff08;水晶报表&#xff09;是一款商务智能&#xff08;BI&#xff09;软件&#xff0c;主要用于设计及产生报表。水晶报表是业内最专业、功能最强的报…