vb.net如何通过窗口句柄获取进程名

求助如何用窗口句柄来获取程序名呢?... 求助 如何用窗口句柄来获取程序名呢? 展开
 我来答
空雪梦见
2013-11-24 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1189万
展开全部
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的那个
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式