为什么FindWindowEx返回值总是0?

tisigv 2011-01-14 12:34:56
想通过pid获得窗口的句柄。
Dim pid
Private Sub Form_Load()
Dim WmiService As Object, Processes As Object, Process As Object
Set WmiService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set Processes = WmiService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = ""notepad.exe""")
For Each Process In Processes
pid = Process.ProcessId
Next
Set WmiService = Nothing
Set Processes = Nothing
Set Process = Nothing
MsgBox pid2whwnd(pid)
End Sub
Function pid2whwnd(pid2)
Dim hwnd2, pid3
hwnd2 = 0
Do
hwnd2 = FindWindowEx(0, hwnd2, 0, 0) 'FindWindowEx的返回值总是0
GetWindowThreadProcessId hwnd2, pid3
If pid2 = pid3 Then
pid2whwnd = hwnd2
hwnd2 = 0
End If
Loop Until hwnd2 = 0
End Function
...全文
486 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbcontrols 2011-01-14
  • 打赏
  • 举报
回复
后面的参数错误,第一个参数是父对象的句柄
cbm6666 2011-01-14
  • 打赏
  • 举报
回复
Option Explicit
Dim objWMIService, objProcess, colProcess
Private Sub Command1_Click()
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process")
Me.Cls
For Each objProcess In colProcess
Print objProcess.Name & "---" & objProcess.processid & "---" & objProcess.ExecutablePath
If UCase(objProcess.Name) = "NOTEPAD.EXE" Then Me.Caption = objProcess.Name & "---" & objProcess.processid & "---" & objProcess.ExecutablePath
Next
Set objWMIService = Nothing: Set colProcess = Nothing
End Sub
tisigv 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cbm666 的回复:]
不显示删除回复显示所有回复显示星级回复显示得分回复 为什么FindWindowEx返回值总是0?

因为你的 Function 后面没有 As Long 函数不会返回的

还有你变量都不定义型态

还有这行代码写法错误
Set Processes = WmiService.ExecQuery("SELECT * FROM Win32_Process WHERE Name
= ""……
[/Quote]
没有As Long是可以返回的,我试过。
那句代码可以读出pid的。
问题是出在
hwnd2 = FindWindowEx(0, hwnd2, 0, 0) 'FindWindowEx的返回值总是0

而不是自定义函数没有返回值。
tisigv 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cbm666 的回复:]
我在1F 的回帖弄错你的意思了

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetPa……
[/Quote]
这个可以,不过搞不懂为什么我写的代码不行。o(︶︿︶)o
dbcontrols 2011-01-14
  • 打赏
  • 举报
回复
&前后都要有空格,否则必错
cbm6666 2011-01-14
  • 打赏
  • 举报
回复
不显示删除回复显示所有回复显示星级回复显示得分回复 为什么FindWindowEx返回值总是0?

因为你的 Function 后面没有 As Long 函数不会返回的

还有你变量都不定义型态

还有这行代码写法错误
Set Processes = WmiService.ExecQuery("SELECT * FROM Win32_Process WHERE Name
= ""notepad.exe""")

Set Processes = WmiService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = " & chr(39) & "notepad.exe" &chr(39))

cbm6666 2011-01-14
  • 打赏
  • 举报
回复
我在1F 的回帖弄错你的意思了

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Const GW_HWNDNEXT = 2
Dim HwndVal&, objWMIService, objProcess, colProcess
Private Sub Command1_Click()
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objProcess In colProcess
If UCase(objProcess.Name) = "NOTEPAD.EXE" Then MsgBox InstanceToWnd(objProcess.processid): Exit For
Next
Set objWMIService = Nothing: Set colProcess = Nothing
End Sub

Function InstanceToWnd(ByVal Target_ProgID As Long) As Long
Dim Sub_ProgID&, Test_Thread_id&
HwndVal = FindWindow(ByVal 0&, ByVal 0&)
Do While HwndVal <> 0
If GetParent(HwndVal) = 0 Then
Test_Thread_id = GetWindowThreadProcessId(HwndVal, Sub_ProgID)
If Sub_ProgID = Target_ProgID Then InstanceToWnd = HwndVal: Exit Do
End If
HwndVal = GetWindow(HwndVal, GW_HWNDNEXT)
Loop
End Function


dbcontrols 2011-01-14
  • 打赏
  • 举报
回复
好像是选用的函数不当
看看这里
tisigv 2011-01-14
  • 打赏
  • 举报
回复
第1、3、4设为0表示搜索所有窗口。
第2个设为0表示从第一个子窗口开始搜索。
hWnd2 Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
我是想让程序在所有窗口中从第1个窗口开始搜索,直到搜到的窗口的进程的pid和我指定的pid一样为止。
dbcontrols 2011-01-14
  • 打赏
  • 举报
回复
你是不是应该用FindWindow啊?
hwnd2 = 0
hwnd2 = FindWindowEx(0, hwnd2, 0, 0)
你等于全指定为0,也就是说找谁你都没说
FindWindowEx的用途是找张三的儿子张小三
需要指定2个人的名字
FindWindow的用途是找张三
需要指定一个人的名字
你不说,否则谁知道你要找谁。
tisigv 2011-01-14
  • 打赏
  • 举报
回复
输入类名还是不行。为0是不是搜索所有窗口?
dbcontrols 2011-01-14
  • 打赏
  • 举报
回复
lpsz1 String,欲搜索的类名。零表示忽略
tisigv 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dbcontrols 的回复:]
后面的参数错误,第一个参数是父对象的句柄
[/Quote]
FindWindowEx
VB声明
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
说明
在窗口列表中寻找与指定条件相符的第一个子窗口
返回值
Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
hWnd1 Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
hWnd2 Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
lpsz1 String,欲搜索的类名。零表示忽略
lpsz2 String,欲搜索的类名。零表示忽略
这里说hWnd1为零,表示使用桌面窗口啊。
tisigv 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cbm666 的回复:]
Option Explicit
Dim objWMIService, objProcess, colProcess
Private Sub Command1_Click()
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set ……
[/Quote]
我要的是窗口的句柄。-_-|||
函数功能 在窗口列表中寻找与指定条件相符的第一个子窗口 。 该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。 参数; (1)hwndParent:要查找的子窗口所在的父窗口的句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。 如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。 Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。 (2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。 (3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。 (4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。 返回值 Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError 如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。 若想获得更多错误信息,请调用GetLastError函数。

1,486

社区成员

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

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