vb.net GetWindowThreadProcessId 取pid为0的解决方法
vb.net吧
全部回复
仅看楼主
level 1
西游脚本 楼主
GetWindowThreadProcessId
如果是告诉请你飘过直接无视。 很多人在RT 这个问题上每次得到的Pid都是0
到底怎么回事呢,我现在告诉大家 Private Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As Long, ByVal lpdwProcessId As Integer) As Integer ByVal hwnd As Long 其实 Hwnd 在vb.net 当调用这个api时。 ByVal hwnd As 的 不是 Long 也 不是 integer 而是 IntPtr 这个类型是 vb.net 中指定的一个用来表达 Hwnd 就是用来表示(句柄)的。那么这个api 需要的是 句柄 那么
正确的
声明如下
Private Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As IntPtr, ByVal lpdwProcessId As Integer) As Integer 调用方法还是和其他语言一样,老方法调用。 private sub 取进程Pid
dim 窗口句柄 as IntPtr '注意到这个变量的声明了吗? 是 intptr 如果你已经有了句柄是Long的类型的话很简单看下面
dim pid as Integer
窗口句柄 = 原来的窗口 '这里把类型转换下就可以
GetWindowThreadProcessId(窗口句柄,PID) msgbox pid ’这个时候你就能得到Pid了。
希望这个能对广大喜欢用 vb.net 的同志们帮助。 高手勿喷!其实这个鸟东西我也研究了很久。刚开始我也和大家一样取到的pid 都是0 一直是0 蛋都快碎了。
2012年08月26日 14点08分 1
level 7
...
建议你了解下值传递和地址传递,也就是ByVal和ByRef。
VB6里默认的传递方式是地址传递(ByRef)。
而VB.NET里的默认传递方式是值传递(ByVal)。
在VB6的API阅览器中的GetWindowThreadProcessId声明原形应该是
Public Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
请注意lpdwProcessId参数,也就是获取ProcessID的那个参数。
他之前没有声明传递方式,所以在VB6中,就默认为地址传递(ByRef)。但如果你将这段代码复制到VB.NET里,那VB.NET则会自动加上ByVal,标记其的传递方式为值传递。
所以这个API在VB.net里的声明应该是
Public Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As IntPtr, ByRef lpdwProcessId As IntPtr) As Int32
或则
Public Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As Integer, ByRef lpdwProcessId As Integer) As Integer
你可以试下[抛媚眼]

2012年08月26日 17点08分 2
level 1
西游脚本 楼主
都可以
2012年09月24日 14点09分 3
level 13
声明错误。把long改成integer
2012年10月04日 01点10分 4
第二个参数加上byref
2012年10月04日 01点10分
1