一个进程有很多窗口,怎么取这个进程的下所有窗口句柄

一个进程有很多窗口,怎么取这个进程的下所有窗口句柄,第1张

给你一个思路吧:如果是顶级窗口类名和标题都知道的话

用api的寻找顶级窗口

找到顶级窗口句柄

之后在用

api的寻找子窗口

寻找子窗口下的标题和类名

就可以取到子窗口的句柄

之后向该句柄发送信息就行!

这段代码你看下 希望对你有帮助 Private Type PROCESSENTRY32

dwSize As Long

cntUsage As Long

th32ProcessID As Long

th32DefaultHeapID As Long

th32ModuleID As Long

cntThreads As Long

th32ParentProcessID As Long

pcPriClassBase As Long

dwFlags As Long

szExeFile As String 1024

End Type

Const TH32CS_SNAPHEAPLIST = &H1

Const TH32CS_SNAPPROCESS = &H2

Const TH32CS_SNAPTHREAD = &H4

Const TH32CS_SNAPMODULE = &H8

Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)

Const TH32CS_INHERIT = &H80000000

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long

Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long

Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'查找进程的函数

Private Function fun_FindProcess(ByVal ProcessName As String) As Long

Dim strdata As String

Dim my As PROCESSENTRY32

Dim l As Long

Dim l1 As Long

Dim mName As String

Dim i As Integer, pid As Long

l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

If l Then

mydwSize = 1060

If (Process32First(l, my)) Then

Do

i = InStr(1, myszExeFile, Chr(0))

mName = LCase(Left(myszExeFile, i - 1))

If mName = LCase(ProcessName) Then

pid = myth32ProcessID

fun_FindProcess = pid

Exit Function

End If

Loop Until (Process32Next(l, my) < 1)

End If

l1 = CloseHandle(l)

End If

fun_FindProcess = 0

End Function

Private Sub Form_Load()

if fun_FindProcess("123exe") <> 0 then

Text1Text="123exe程序已启动"

Else

Text1Text = ""

End If

End Sub

首先说想取得其他程序的窗口句柄,怎么说都需要用到模块。大家都是在系统上运行,只有你的电脑系统知道那个程序的一切信息。你若想取出必须经过系统取,那么就要求系统提供这么一个支持的接口。当然了系统支持,最常见的便是API。windows系统的API非常强大,很多与系统交互都可以靠API。所以API就是一个模块,是系统对外辅助的支持接口模块。

没有接口与模块是做不到的,所以不要说不用模块。首先,像 精易模块、超级模块 这些易语言的整合模块中 很多命令就是通过调用API实现的。

所以你要用到API,既然如此直接用模块。有些东西不是你必须理解的,尤其对于您是初学者来说。就像你不需要去学汽车构造一样,你只要学了驾照就能开汽车。等你真正可以不用模块的时候,那是你充分了解了系统及漏洞,是计算机大师级人物了。

-------------------------------------------------------------------------------

其次,下面这个是:超级模块 中的命令,可以直接通过进程名取出窗口句柄。

子程序名:取进程窗口

通过进程ID与窗口标题来获取窗口句柄(成功返回窗口句柄,失败返回0)

返回值类型:整数型

参数<1>的名称为“进程ID”,类型为“整数型”。注明:窗口所在进程ID。

参数<2>的名称为“标题”,类型为“文本型”,允许接收空参数数据。注明:窗口标题。

参数<3>的名称为“必须可见”,类型为“逻辑型”,允许接收空参数数据。注明:默认为假:可以是不可见窗口 真:必须是可见窗口。

就用GetWindowThreadProcessId,这个函数是获取指定窗口的线程ID和进程ID

HWND hWnd; // 窗口的句柄

DWORD dwPID;

DWORD dwThreadID = ::GetWindowThreadProcessId(hWnd, &dwPID);

执行成功后,dwPID便是获取到的进程ID

最简单的窗体置前方法:

在你主窗体的(通用)模块里面加入代码:

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

以上是对相关API的声明,注意:API的函数名必须区分大小写,一旦错误,会使程序莫名其妙地出现找不到DLL入口点的问题,检查半天还检查不出来(我就犯过这样的错误),所以建议你还是直接Ctrl+C,Crtl+V吧!

然后在窗体上加一个复选框ChkTop,加入以下代码:

Private Sub ChkTop_Click()

If ChkTopValue = 1 Then

SetWindowPos FrmMainhwnd, -1, 0, 0, 0, 0, &H2 + &H1

Else

SetWindowPos FrmMainhwnd, -2, 0, 0, 0, 0, &H2 + &H1

End If

End Sub

注意,前提是你的主窗体名称为FrmMain,如果为其他,则修改上面代码中的FrmMain为相应的名称。

这样的实现方式有一个漏洞(我学信息安全的~习惯性地就想去分析程序的安全性和严密性,不好意思哈~):窗体开始显示时的Z顺序无法控制。为了弥补这个缺陷,在窗体FrmMain的Load事件中,加入以下代码:

SetWindowPos FrmMainhwnd, Val(ChkTopValue), 0, 0, 0, 0, &H2 + &H1

这样,无论如何,都是窗体置前最简单的实现方式,而且完全没有BUG。

衷心希望我的回答对你有帮助!!

以上就是关于一个进程有很多窗口,怎么取这个进程的下所有窗口句柄全部的内容,包括:一个进程有很多窗口,怎么取这个进程的下所有窗口句柄、如何通过进程得到窗体句柄、易语言 ,知道进程名,取窗口句柄的思路应该是怎样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10151259.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存