给你一个思路吧:如果是顶级窗口类名和标题都知道的话
用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。
衷心希望我的回答对你有帮助!!
以上就是关于一个进程有很多窗口,怎么取这个进程的下所有窗口句柄全部的内容,包括:一个进程有很多窗口,怎么取这个进程的下所有窗口句柄、如何通过进程得到窗体句柄、易语言 ,知道进程名,取窗口句柄的思路应该是怎样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)