根据进程名获取进程PID以及进程

本文分享了如何使用VB.NET编写一段代码,通过进程名称查找对应的进程PID。利用了API声明,并特别指出在VB.NET中将Long转换为Integer以避免错误。此方法适用于后续参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,帮人解答问题时,用VB.NET写了段根据进程名称查找PID的方法。

以前用VB6时积累的API发挥了作用,主要在VB.NET处理API声明时注意一下把所有的long改成Integer,同时如果有Any的话也需要改成Object。

VB6的Long对应VB.NET的Integer。如果混了,会报错的。

既然写了,就记录一下,便于后面使用

Module Module1
    Private Const GW_HWNDNEXT = 2
    Private Const GW_CHILD = 5
    Private Declare Function GetDesktopWindow Lib "user32" () As Integer
    Private Declare Function GetParent Lib "user32" (ByVal hwnd As Integer) As Integer
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Integer, ByVal wCmd As Integer) As Integer
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Integer, ByRef lpdwProcessId As Integer) As Integer
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA"  (ByVal hwnd As Integer) As Integer
    '进程名,不带.exe danielinbiti
    Public Function ProcessPidOnly(ByVal ProcessName As String) As String
        Dim myProcess As Process() = Process.GetProcessesByName(ProcessName)
        Dim pid As String = ""
        Dim windowname As String = ""
        If myProcess.Length - 1 = 0 Then
            pid = myProcess(0).Id
        Else
            For i As Short = 0 To myProcess.Length - 1
                pid = pid & myProcess(i).Id & ";"
            Next
        End If
        If Trim(pid) <> "" Then
            Dim hwnd As Integer
            Dim pidArr = pid.Split(";")
            For i As Short = 0 To pidArr.Length - 1
                If Trim(pidArr(i)) <> "" Then
                    hwnd = GetWinHandle(CInt(pidArr(i)))
                    windowname = windowname + vbCrLf + getWindowName(hwnd)
                End If
            Next i
        End If
        ProcessPidOnly = windowname
    End Function
    Private Function GetWinHandle(ByVal hInstance As Integer) As Integer
        Dim tempHwnd As Integer
        Dim test_pid As Integer
        Dim test_thread_id As Integer
        GetWinHandle = 0
        tempHwnd = GetDesktopWindow()
        tempHwnd = GetWindow(tempHwnd, GW_CHILD)
        ' Loop until you find a match or there are no more window handles:
        Do Until tempHwnd = 0
            ' Check for PID match
            ' 取该窗口所属的进程ID
            If GetParent(tempHwnd) = 0 Then
                test_thread_id = GetWindowThreadProcessId(tempHwnd, test_pid)
                If test_pid = hInstance Then
                    ' Return found handle
                    GetWinHandle = tempHwnd
                    ' Exit search loop
                    Exit Do
                End If
            End If
            ' Get the next window handle
            tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT)
        Loop
    End Function
    Private Function getWindowName(ByVal hwnd As Integer)
        Dim sTitle As String = ""
        Dim nSize As Integer
        nSize = GetWindowTextLength(hwnd)
        If nSize > 0 Then

            sTitle = Space$(nSize + 1)
            GetWindowText(hwnd, sTitle, nSize + 1)
        End If
        getWindowName = sTitle
    End Function



End Module


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值