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

how to identify application instance name along with its user in vb.net 3.5?

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

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

我的要求是,如果同一个用户试图打开应用程序,那么它应该显示 "application already opened".

之类的弹出消息

请指教... 阿拜

上一个实例属性

Returns 一个值,指示应用程序的先前实例是否已经 运行。

语法

object.PrevInstance

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

备注

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

注意由于计算机 运行 Windows NT 可以支持多个桌面,如果您使用设计用于分布式 COM 的组件,可能会导致以下情况:

用户桌面中的客户端程序请求组件提供的对象之一。因为该组件物理上位于同一台机器上,所以该组件在用户桌面启动。

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

除非组件的作者在组件的启动代码中对 App.PrevInstance 进行了测试,以防止组件的多个副本来自 运行电脑。在这种情况下,远程组件创建将失败。


在此处将反馈发送至 MSDN.Look 以获取 MSDN 在线资源。


会话

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

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

单实例程序的规则是在退出之前切换windows到前一个实例。

PPS

由于 32 位计算优势(Win32 的优势而不是 VB 的优势)带来的问题变得不那么有意义了。现在执行此操作的常用方法是在启动时打开和锁定文件(Windows 也有您可以使用的内存结构,例如邮槽、管道等)。如果一个程序无法锁定,那么另一个程序已经 运行.

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

> 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(),它运行良好。