无法获得窗口句柄,哪里错了?

dafu2003 2010-10-29 01:08:29
这段程序以前正确,可以获取一个用shell运行的程序的窗口句柄,但是现在又不行了,之前只是系统装了360杀毒,并用360升级了一些系统模块。
hwndShell 函数运行一个程序,返回其窗口句柄。运行时都正确,也能返回一个句柄,但是经查发现返回的不是所运行程序的窗口句柄。

Function ProcIDFromWnd(ByVal hwnd As Long) As Long
Dim idProc As Long
' Get PID for this HWnd
GetWindowThreadProcessId hwnd, idProc
' Return PID
ProcIDFromWnd = idProc
End Function

Function GetWinHandle(hInstance As Long) As Long
Dim tempHwnd As Long, pid As Long
On Error GoTo errr
tempHwnd = FindWindow(vbNullString, vbNullString)
Do Until tempHwnd = 0
If GetParent(tempHwnd) = 0 Then
pid = ProcIDFromWnd(tempHwnd)
If hInstance = pid Then
GetWinHandle = tempHwnd
Exit Do
End If
End If
tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT)
Loop
errr:
End Function

Public Function hwndShell(fname As String, Optional gs As String) As Long
Dim hInst As Long
Dim s As String, s2 As String, s3 As String, p As Long, p2 As Long
On Error GoTo errr
Select Case gs
Case "exe"
s = fname
Case Else
s2 = String(260, vbNullChar)
p = FindExecutable(fname & vbNullChar, vbNullString, s2)
If p > 31 Then
p2 = InStr(1, s2, vbNullChar)
s3 = Left(s2, p2 - 1)
s = s3 & " " & fname
End If
End Select
If s <> "" Then
hInst = Shell(s, vbNormalFocus)
If hInst Then hwndShell = GetWinHandle(hInst)
errr:
End Function
...全文
223 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独剑_LPZ 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 asftrhgjhkjlkttttttt 的回复:]
"hwndShell 函数运行一个程序,返回其窗口句柄。运行时都正确,也能返回一个句柄,但是经查发现返回的不是所运行程序的窗口句柄。"

hwndShell,这个就是那个程序的句柄,是以10进制返回的,任务管理器里显示的是16进制的,转换一下值是相同的
[/Quote]
更正
hwndShell,这个就是那个程序的句柄,是以10进制返回的,spy++里显示的是16进制的,转换一下值是相同的
孤独剑_LPZ 2010-10-29
  • 打赏
  • 举报
回复
"hwndShell 函数运行一个程序,返回其窗口句柄。运行时都正确,也能返回一个句柄,但是经查发现返回的不是所运行程序的窗口句柄。"

hwndShell,这个就是那个程序的句柄,是以10进制返回的,任务管理器里显示的是16进制的,转换一下值是相同的
孤独剑_LPZ 2010-10-29
  • 打赏
  • 举报
回复
用spy++看看,spy++里显示的是16进制的,转换为10进制,和任务管理里的比较一下
dafu2003 2010-10-29
  • 打赏
  • 举报
回复
问题在于:
shell运行时360接管了控制,所以shell返回的不是所执行程序的进程号,导致找到的不是所执行程序的窗口把柄,现在就是要怎样绕过360,直接执行程序?我试了用CreateProcessA来执行,结果还是一样。
dafu2003 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 asftrhgjhkjlkttttttt 的回复:]
引用 1 楼 asftrhgjhkjlkttttttt 的回复:
"hwndShell 函数运行一个程序,返回其窗口句柄。运行时都正确,也能返回一个句柄,但是经查发现返回的不是所运行程序的窗口句柄。"

hwndShell,这个就是那个程序的句柄,是以10进制返回的,任务管理器里显示的是16进制的,转换一下值是相同的

更正
hwndShell,这个就是那个程序的句柄,是以10进制返回……
[/Quote]

有返回值且运行正确,但不是所运行程序的句柄。
我想到了,肯定是360在运行程序时外加了个壳,所以获得的肯定是这个壳的句柄。问题在这里,怎么解决?

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧