如果我们需要检查哪个用户正在使用此应用程序,那么我将使用以下代码来识别应用程序的实例?它的代码是什么?
Function PrevInstance() As Boolean
If Ubound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
Return True
Else
Return False
End If
End Function
我的要求是,如果同一个用户试图打开应用程序,那么它应该显示弹出消息,例如“应用程序已经打开”。
请建议...... 阿沛
答案 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也有可以使用的内存结构,如邮件槽,管道等)。如果程序无法锁定,则另一个程序已在运行。