新建工程,添加一个command按钮和一个textbox,然后将下面的代码copy到代码区,运行即可见到效果了
'Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Sub Command1_Click()
On Error Resume Next
Dim notepad_hwnd As Long, i As Long, pid As Long
Dim notepad_path As String
Shell "notepad.exe", vbNormalFocus
notepad_hwnd& = FindWindow(vbNullString, "无标题 - 记事本") '获得窗口句柄
i = GetWindowThreadProcessId(notepad_hwnd, pid) '获得记事本pid
notepad_path = GetProcessPathByProcessID(pid) '获取记事本全路径
Text1.Text = notepad_path
End Sub
Private Function GetProcessPathByProcessID(pid As Long) As String '获取应用程序的完整路径
On Error GoTo ErrLine
Dim cbNeeded As Long
Dim szBuf(1 To 250) As Long
Dim Ret As Long
Dim szPathName As String
Dim nSize As Long
Dim hProcess As Long
hProcess = OpenProcess(&H400 Or &H10, 0, pid)
If hProcess <> 0 Then
Ret = EnumProcessModules(hProcess, szBuf(1), 250, cbNeeded)
If Ret <> 0 Then
szPathName = Space$(260)
nSize = 500
Ret = GetModuleFileNameExA(hProcess, szBuf(1), szPathName, nSize)
GetProcessPathByProcessID = Left$(szPathName, Ret)
End If
End If
Ret = CloseHandle(hProcess)
If GetProcessPathByProcessID = "" Then
GetProcessPathByProcessID = "can't not catch"
End If
ErrLine:
End Function
摘自:网络整理
评论