VB6中如何获得指定进程名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB6中如何获得指定进程名称相关的知识,希望对你有一定的参考价值。

比如我启动VB6之后,那么在进程里面就会有个VB6.exe.进程,如何对这个进程进行时时监控

楼主您好 VB技术部 为您解答在窗体上放置两个按钮 Command1 名字为开始获取 Command2 名字为停止获取 一个list 一个timer然后把timer 的属性 Enabled 设置为False Interval填写为1000 加入以下代码Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const SWP_NOMOVE = &H2
Dim s As String
Private Type POINTAPI
X As Long
Y As Long
End Type Private Sub Command1_Click()
List1.Clear
Timer1.Enabled = True
End SubPrivate Sub Command2_Click()
Timer1.Enabled = False
End SubPrivate Sub Timer1_Timer()
Dim lpPoint As POINTAPI
Dim QQhwnd As Long
Dim sBuffer As String
sBuffer = Space(255)
GetCursorPos lpPoint
QQhwnd = WindowFromPoint(lpPoint.X, lpPoint.Y)
GetWindowText QQhwnd, sBuffer, 255
List1.AddItem sBuffer
End Sub 运行后点下按钮 然后鼠标按下你要获取的窗口 1秒自动获得进程名称 效果图
参考技术A 要用api
貌似是getcurrentporcess

VB6 中的进程监视器/调度程序

【中文标题】VB6 中的进程监视器/调度程序【英文标题】:Process monitor / dispatcher in VB6 【发布时间】:2011-09-17 02:46:57 【问题描述】:

我需要在 VB6 中编写一个小应用程序来运行另一个 VB6 应用程序的实例并密切关注正在运行的进程,但我不知道如何在 VB6 中获取进程信息。我可以使用tasklist 实用程序查看我需要的一些内容,但我真的不知道如何创建进程(如果可能,指定进程或应用程序名称)以及从操作系统获取有关进程的信息。

此应用程序将在 Windows XP 机器上运行。

有人知道这类事情的入门教程或有用的网页吗?

【问题讨论】:

【参考方案1】:

您可以使用许多 Windows API 函数来执行此操作。我将从查看EnumProcesses (VB6 example and declaration here) 开始,它可用于收集有关所有正在运行的进程的信息。您也可以使用OpenProcess 开始向 Windows 询问特定进程 (another VB6 example)。

还有一个fairly nice example on MSDN。

当然,还有 CreateProcess (AllApi link) 或 ShellExecute (AllApi) 用于生成进程 - 前者让您可以更好地控制进程的创建,而后者更简单打电话。

There was another question posted about this a while back with some example code.

另一种可能的方法是使用WMI (some useful snippets to adapt)。

最后,这里有一些教程向您展示如何操作(不过我建议您自己先尝试一下:):

Getting Process Information using PSAPI Another EnumProcesses/OpenProcess implementation WMI-based demonstration

以下是一些相关问题,尽管您在发帖前搜索此网站时可能已经看到它们:

Monitoring processes to see if they've crashed in vb6 How can I execute a .bat file but wait until its done running before moving on? How To Enumerate Processes From VB 6 on Win 2003?

【讨论】:

【参考方案2】:

您无需为了获得您生成的子进程的句柄而对进程进行探索。 VB6 Shell() 函数返回一个进程ID,您可以使用它来调用OpenProcessCreateProcess 直接给你句柄。

好的,这里是一个在 VB6 中生成和监视程序的超级精简示例。该示例被编码为启动并重复重新启动命令 shell 的 3 个副本(简单的示例子程序)。它还被编写为在终止时杀死任何正在运行的孩子,并且在大多数情况下有更好的替代方案可供使用。见A Safer Alternative to TerminateProcess()。

此演示还报告退出的每个进程的退出代码。您可以输入exit 1234 或类似的名称来查看此操作。

要创建演示,请使用表单打开一个新的 VB6 项目。添加一个多行 TextBox Text1 和一个 Timer Timer1(用于轮询孩子完成)。将此代码粘贴到表单中:

Option Explicit

Private Const SYNCHRONIZE = &H100000
Private Const PROCESS_QUERY_INFORMATION = &H400&
Private Const PROCESS_TERMINATE = &H1&
Private Const WAIT_OBJECT_0 = 0
Private Const INVALID_HANDLE = -1
Private Const DEAD_HANDLE = -2

Private Declare Function CloseHandle Lib "kernel32" ( _
    ByVal hObject As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" ( _
    ByVal hProcess As Long, _
    ByRef lpExitCode As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" ( _
    ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" ( _
    ByVal hProcess As Long, _
    ByVal uExitCode As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" ( _
    ByVal hHandle As Long, _
    ByVal dwMilliseconds As Long) As Long

Private Tasks() As String
Private Handles() As Long

Private Sub Form_Load()
    Dim I As Integer

    'We'll run 3 copies of the command shell as an example.
    ReDim Tasks(2)
    ReDim Handles(2)
    For I = 0 To 2
        Tasks(I) = Environ$("COMSPEC") & " /k ""@ECHO I am #" & CStr(I) & """"
        Handles(I) = INVALID_HANDLE
    Next
    Timer1.Interval = 100
    Timer1.Enabled = True
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim I As Integer

    Timer1.Enabled = False
    DoEvents
    For I = 0 To UBound(Tasks)
        If Handles(I) <> INVALID_HANDLE And Handles(I) <> DEAD_HANDLE Then
            TerminateProcess Handles(I), 666
            CloseHandle Handles(I)
            Handles(I) = DEAD_HANDLE
        End If
    Next
End Sub

Private Sub Timer1_Timer()
    Dim I As Integer
    Dim ExitCode As Long
    Dim Pid As Long

    Timer1.Enabled = False
    For I = 0 To UBound(Tasks)
        If Handles(I) <> INVALID_HANDLE Then
            If WaitForSingleObject(Handles(I), 0) = WAIT_OBJECT_0 Then
                If GetExitCodeProcess(Handles(I), ExitCode) <> 0 Then
                    Text1.SelText = "Task " & CStr(I) & " terminated, " _
                                  & "exit code: " & CStr(ExitCode) _
                                  & ", restarting task." _
                                  & vbNewLine
                Else
                    Text1.SelText = "Task " & CStr(I) & " terminated, " _
                                  & "failed to retrieve exit code, error " _
                                  & CStr(Err.LastDllError) _
                                  & ", restarting task." _
                                  & vbNewLine
                End If
                CloseHandle Handles(I)
                Handles(I) = INVALID_HANDLE
            End If
        End If
        If Handles(I) = INVALID_HANDLE Then
            Pid = Shell(Tasks(I), vbNormalFocus)
            If Pid <> 0 Then
                Handles(I) = OpenProcess(SYNCHRONIZE _
                                      Or PROCESS_QUERY_INFORMATION _
                                      Or PROCESS_TERMINATE, 0, Pid)
                If Handles(I) <> 0 Then
                    Text1.SelText = "Task " & CStr(I) & " started." _
                                  & vbNewLine
                Else
                    Text1.SelText = "Task " & CStr(I) _
                                  & ", failed to open child process." _
                                  & vbNewLine
                    Handles(I) = DEAD_HANDLE
                End If
            Else
                Text1.SelText = "Task " & CStr(I) _
                              & ", failed to Shell child process." _
                              & vbNewLine
                Handles(I) = DEAD_HANDLE
            End If
        End If
    Next
    Timer1.Enabled = True
End Sub

希望这有助于回答这个问题。

【讨论】:

所以 CreateProcess 创建了一个子进程,那么,不是一个独立的?如果监视器/调度程序一团糟,我希望这些进程能够继续运行。 Windows 中的进程族链接通常相当薄弱。即使父进程终止,子进程仍将继续运行。 呃,上面的评论是在谈论 CreateProcess() 或 VB 的 Shell() 的一般用途。我添加的代码示例在退出时明确地杀死了它的孩子。【参考方案3】:

更简单的东西会使用套接字。

启动您的应用服务器并在您的客户端上实现与您的服务器的通信。有了它,您将提供相互通信。

我说。因为我不是你尝试做的事

抱歉,仅当您的客户在内部完成时才适用,因为您可以选择添加更改

【讨论】:

【参考方案4】:

既然你说其他应用程序是**也是VB6**,那么将其他应用程序制作成ActiveX exe会更容易。然后,您可以直接从您的第一个应用程序获取对另一个应用程序中对象的引用。 COM 为您解决一切。

这里是Microsoft's tutorial,您也可以download the code。 或者这里是another answer where I've written about this

【讨论】:

这项技术当然有它的应用,我个人建议将它作为一种可能性,用于某些类型的新工作。但是,如果子程序不是您编写的,它也无济于事,即便如此,它也可能需要进行相当多的重写。它还需要进程外 COM 注册,这在许多情况下可能是一个缺点。

以上是关于VB6中如何获得指定进程名称的主要内容,如果未能解决你的问题,请参考以下文章

vb6 webbrowser 如何判断当前网页中获取焦点的是否一个文本框?

vb6中如何实现类似MDI子窗体的窗体

linux中如何根据PID获得进程?

C++ 如何获得当前电脑里运行的所有进程ID?并关闭指定的进程?

如何在 VB6 中访问 iTunes DB?

C#如何通过进程名称获取指定窗口的句柄,通过该句柄获取该窗口的标题?