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

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

编程学习2007-10-2990240

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

分享给朋友:

相关文章

VBScript 错误信息

VBScript 错误信息

错误代码 信息5 无效的过程调用或参数6 溢出7 内存不够9 下标越界10 数组长度固定或临时锁定11 被零除13 类型不匹配14 字符串空间溢出28 堆栈空间溢出35 Sub或Function未定义48 加载D...

VB.NET关于加密算法

VB.NET关于加密算法

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

BT雷人的程序语言

BT雷人的程序语言

这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样。编程语言方面,看过本站《6个变态的C语言Hello World程序》的朋友们一定对BT和另类不会陌生,但那都是些小儿科,真正的BT和另类要是从语言级上来完成。让我们来看看其中一个比较另类的语言BrainFuck。看到这个程序语言的名字,请不要以为这是一个搞笑的语言,这是一个“严肃事情”,请大家用“最虔诚的态度”来阅读本文。BF语言介绍Brainfuck,是一种极小化的计算机语言,它是由Urban Mülle...

Win7 64位系统下IIS无法使用ODBC驱动 解决办法

Win7 64位系统下IIS无法使用ODBC驱动 解决办法

Win7 64位系统控制面板里的数据源里没有Microsoft OLE DB Provider for Jet和Microsoft Access Driver (*.mdb),在IIS里使用Access等ODBC数据库的网页无法正常显示。解决办法:打开Internet 信息服务(IIS)管理器,进入应用程序池,在应用程序上点右键选择高级设置,将启用32位应用程序后面的值改成True,确定后重启下应用程序。如下图:Win7下32位的ODBC数据源:找到c:\windows\sy...