如何在vb.net 3.5中识别应用程序实例名称及其用户?

时间:2015-03-17 10:29:22

标签: vb.net process

如果我们需要检查哪个用户正在使用此应用程序,那么我将使用以下代码来识别应用程序的实例?它的代码是什么?

Function PrevInstance() As Boolean
    If Ubound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
        Return True
    Else
        Return False
    End If
End Function

我的要求是,如果同一个用户试图打开应用程序,那么它应该显示弹出消息,例如“应用程序已经打开”。

请建议...... 阿沛

2 个答案:

答案 0 :(得分:1)

非常感谢...解决我的问题如下:

> Function PrevInstance() As Boolean
>         If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName))
> > 0 Then
>                   Dim CurUser As Boolean = GetProcessOwner(Diagnostics.Process.GetCurrentProcess.ProcessName)
>             Return CurUser
>         Else
>             Return False
>         End If
>     End Function
Function GetProcessOwner(ByVal ProcessName As String) As Boolean
    Dim boolVal As Boolean
    Dim CurUserName As String
    Dim CountInstance As Integer
    CountInstance = 0
    CurUserName = System.Environment.UserName
    Dim selectQuery As SelectQuery = New SelectQuery("Select * from Win32_Process Where Name = '" + ProcessName + ".exe' ")
    Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher(selectQuery)
    Dim y As System.Management.ManagementObjectCollection
    y = searcher.Get
    For Each proc As ManagementObject In y
        Dim s(1) As String
        proc.InvokeMethod("GetOwner", CType(s, Object()))
        Dim n As String = proc("Name").ToString()
        If n = ProcessName & ".exe" Then
            If s(0) = CurUserName Then
                CountInstance = CountInstance + 1
                If CountInstance > 1 Then
                    boolVal = True
                End If
            End If
        End If
    Next
    Return boolVal
End Function

我在Form_Load()中调用了PrevInstance(),并且它完美运行。

答案 1 :(得分:0)

PrevInstance Property

返回一个值,该值指示应用程序的先前实例是否已在运行。

<强>语法

object.PrevInstance

对象占位符表示一个对象表达式,其值为“应用于”列表中的一个对象。

<强>说明

您可以在Load事件过程中使用此属性来指定用户是否已在运行应用程序的实例。根据应用程序的不同,您可能只希望一次在Microsoft Windows操作环境中运行一个实例。

注意由于运行Windows NT的计算机可以支持多个桌面,因此如果使用旨在使用分布式COM的组件,则可能导致以下情形:

用户桌面中的客户端程序请求组件提供的对象之一。由于组件在物理上位于同一台计算机上,因此该组件将在用户桌面中启动。

随后,另一台计算机上的客户端程序使用分布式COM来请求组件提供的对象之一。在系统桌面中启动组件的第二个实例。 现在有两个组件在同一个NT计算机上,在不同的桌面上运行。

除非组件的作者在组件的启动代码中放置了App.PrevInstance测试,以防止组件的多个副本在同一台计算机上运行,​​否则此方案不是问题。在这种情况下,远程组件创建将失败。


向MSDN发送反馈。请点击此处查看MSDN Online资源。


会话

上面告诉你它是否已经在运行。这告诉你什么会话。交互式用户在Vista及更高版本上始终是session1。对于XP及更早版本为0。

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")

For Each objItem in colItems
        msgbox objitem.name & " PID=" & objItem.ProcessID & " SessionID=" & objitem.sessionid
Next

<强> PS

单个实例程序的规则就在您退出切换窗口到上一个实例之前。

<强> PPS

由于32位计算preCNstance(Win32的一个而不是VB的)引入的问题变得没有意义。现在常见的方法是在启动时打开并锁定文件(Windows也有可以使用的内存结构,如邮件槽,管道等)。如果程序无法锁定,则另一个程序已在运行。