1个回答
展开全部
Imports System.Runtime.InteropServices
Module winapi
<DllImport("User32.dll", CallingConvention:=CallingConvention.StdCall, EntryPoint:="GetWindowThreadProcessId")> _
Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, ByRef procId As UInt32) As UInt32
End Function
<DllImport("kernel32.dll", CallingConvention:=CallingConvention.StdCall, EntryPoint:="OpenProcess")> _
Function OpenProcess(ByVal access As UInt32, ByVal inherit As Boolean, ByVal procid As UInt32) As IntPtr
End Function
<DllImport("kernel32.dll", CallingConvention:=CallingConvention.StdCall, EntryPoint:="CloseHandle")> _
Function CloseHandle(ByVal handle As IntPtr) As Boolean
End Function
<DllImport("psapi.dll", CallingConvention:=CallingConvention.StdCall, EntryPoint:="GetModuleFileNameExW", Charset:=CharSet.Unicode)> _
Function GetModuleFileNameExW(ByVal hProc As IntPtr, ByVal hMod As IntPtr, ByVal arrName() As Char, ByVal arrSize As UInt32) As UInt32
End Function
End Module
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim procid As UInt32
GetWindowThreadProcessId(Me.Handle, procid)
Dim handle As IntPtr
handle = OpenProcess(1040, False, procid)
Dim name(65536) As Char
Dim nameSize As UInt32 = GetModuleFileNameExW(handle, IntPtr.Zero, name, 65536)
Dim strName As String = New String(name, 0, nameSize)
CloseHandle(handle)
MsgBox(strName)
End Sub
End Class
可恶……我不会vb……临时去七拼八凑查了点语法……尽力了
更多追问追答
追问
第30行,用得着弄上标那么大的数组吗,还有,调用示例能加一点注释吗?我好修改。。。
追答
……刚刚去看了一下才发现原来MAX_PATH是260 囧
那你用260吧。
这个代码说实在没什么太多好注释的,就是调用了三个windows api,OpenProcess是给出进程id打开进程,要有读内存权限和查询进程信息权限,这两个权限flag都是常量,执行or操作以后得到1040
然后用GetModuleFileNameEx从进程句柄获取进程主模块的路径,既然MAX_PATH是260那就用260吧……它返回的值是字符串的长度
GetWindowThreadProcessId可以从窗口句柄获取到进程id,获取以后就用openprocess去开,然后就是刚才所说的。
再就是因为windows api没有涉及到 string 这种类型,用的都是“字符数组”,这里得到了包含有文件名的字符数组以后要转成string以便vb使用,直接用string的构造函数即可,指定要从字符数组的哪里到哪里创建这个string对象
因为windows api里涉及到的HANDLE类型实际上长度和指针一致,所以用IntPtr即可。
更具体的信息就要去查windows api了,这几个api的使用应该不难查到。
关于函数末尾的W,因为涉及到字符串的windows api很多都有两个版本,一个末尾带A一个末尾带W,对应不同的字符串类型。VB.net里char类型对应的是宽字符,所以用的W的那个
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询