当前位置:首页 > 编程学习 > VB/VB.net 只允许运行一个实例

VB/VB.net 只允许运行一个实例

编程学习2007-10-2965820

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



扫描二维码推送至手机访问。

版权声明:本文由海阔天空发布,如需转载请注明出处。

本文链接:https://www.apull.net/html/20071029966.html

分享给朋友:

相关文章

VB连接SQLServer数据库操作代码

VB连接SQLServer数据库操作代码

第一步,在ModConString模块中定义一系列变量'定义一个属性过程反映连接字符串Public Property Get conString() As Variant conString = "data source=.;initial catalog=Sims_four;user End Property'定义一个提供者反映数据库类型Public Property Get conProvide() As Variant co...

计算机蓝屏代码的含义

计算机蓝屏代码的含义

0 0x0000 作业完成。1 0x0001 不正确的函数。2 0x0002 系统找不到指定的档案。3 0x0003 系统找不到指定的路径。4 0x0004 系统无法开启档案。5 0x0005 拒绝存取。6 0x0006 无效的代码。7 0x0007 储存体控制区块已毁。8 0x0008 储存体空间不足,无法处理这个指令。9 0x0009 储存体控制区块地址无效。10 0x000A 环境不正确。11 0x000B 尝试加载一个格式错误的程序。12 0x000C 存取码错误。1...

VB.NET关于加密算法

VB.NET关于加密算法

加密将防止数据被查看或修改,并在原本不安全的信道上提供安全的通信信道,它达到以下目的:  保密性:防止用户的标识或数据被读取。  数据完整性:防止数据被更改。  身份验证:确保数据发自特定的一方。  基本概念  1、散列(HASH)函数  散列(HASH)函数H也称哈希函数或杂凑函数等,是典型的多到一的函数,其输入为一可变长x(可以足够的长),输出一固定长的串h(一般为128位、160位,比输入的串短),该串h被称为输入x的Hash值(或称消息摘要Message  ...

ASP错误提示大全

ASP错误提示大全

Microsoft VBScript 语法错误(0×800A03E9)–>内存不足Microsoft VBScript 语法错误(0×800A03EA)–>语法错误Microsoft VBScript 语法错误(0×800A03EB)–>缺少’:’Microsoft VBScript 语法错误(0×800A03ED)–>缺少’(’Mi...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。