VB/VB.net 只允许运行一个实例
VB/VB.net 只允许运行一个实例
by: Apull
VB中的实现方法
VB如何防止程序被重复加载,也就是只允许运行一个实例,一般有2种方法。
一,直接用VB提供的APP对象的PrevInstance方法。
PrevInstance的返回值为True则说明已经有一个实力在运行。
If App.PrevInstance Then Msgbox "已经有一个实例在运行" End if
这个方法是根据已经运行的程序名称来确定是否有实例运行。这有一个弊端,如果将程序复制一份后改个名字他就检测不到了。
比如有一个程序a.exe,当它运行后,再复制a.exe,并改名为b.exe然后再运行,这时就不会有提示,而是直接打开程序,因此还需要再完善。
二,用查找指定窗口的方法,这就要用到API函数了。
'定义API函数 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long '返回值 Long,找到窗口的句柄。如未找到相符窗口,则返回零。 '主启动函数 Public Sub Main() Dim hw& hw = FindWindow(vbNullString, "Title") If hw <> 0 Then Msgbox "已经有一个实例在运行" End End If ... 其他代码 End Sub
这个方法是通过窗口的标题返回窗口句柄,如果返回值不为零,则说明指定的窗口正在运行中。
再介绍2个API函数,这2个函数可以用来设置指定窗口的显示状态。
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
'说明 将窗口设为系统的前台窗口。这个函数可用于改变用户目前正在操作的应用程序
'返回值 Long,非零表示成功,零表示失败。会设置GetLastError
'参数 hwnd 带到前台的窗口句柄
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
'说明 控制窗口的可见性(在vb里使用:针对vb窗体及控件,请使用对应的vb属性)
'返回值 Long,如窗口之前是可见的,则返回TRUE(非零),否则返回FALSE(零)
Private Const SW_SHOWDEFAULT = 10
这2个函数跟前面的FindWindow配合起来用可以收到很好的效果。也就是,当你再打开一个程序的时候,如果这个程序已经有一个实例正在运行,那么他就会激活那个已经运行的实例。
代码如下
'主启动函数 Public Sub Main() Dim hw& hw = FindWindow(vbNullString, "Title") If hw <> 0 Then ShowWindow hw, SW_SHOWDEFAULT SetForegroundWindow hw End End If End Sub
下面说说VB.NET里的实现方法。
vb.net中实现也比较简单。上面写的api的方法也可以实现
' ======================== ' 检查是否有实例在运行 Private Function PrevInstance(ByVal sProName As String, Optional ByVal start As Boolean = False) As Boolean Dim i As Integer Try i = Diagnostics.Process.GetProcessesByName(sProName).Length Catch ex As Exception i = 0 End Try If start Then Return i > 1 Else Return i > 0 End If End Function '启动函数 Public Sub Main() Application.EnableVisualStyles() Application.DoEvents() ' ======================== ' 只允许一个实例运行 If PrevInstance(IO.Path.GetFileNameWithoutExtension(Application.ExecutablePath), True) Then MessageBox.Show("已经有一个实例在运行!", “错误”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Exit Sub End If ... 其他代码 End Sub