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

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

编程学习2007-10-2982220

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://apull.net/html/20071029966.html

分享给朋友:

相关文章

关于学习编程和C语言

关于学习编程和C语言

关于学习编程和C语言  转自 开复网 Q:该怎么学习编程?  A:首先问你一个问题:你们在学校都学些什么课程? 问这个问题的原因是,我认为学校的计算机科学基础课很重要。如果你所在学校的课程设置合理,那你应该先把主要精力花在这些基础课上。很多学生看到基础理论就茫然,不知道这些图表,符号,甚至硬件的知识对将来的软件开发有什么用。用处大得很哪。比如,操作系统课里讲到的多线程的东西在系统编程里很有用。又比如,尽管你将来不会去涉及电脑的...

VB.NET 用ShellExecuteEx 打开系统文件属性对话框 模块

VB.NET 用ShellExecuteEx 打开系统文件属性对话框 模块

' ' VB.NET 调用系统文件属性对话框模块 ' ' by: Apull ' QQ:374237545 ' http://www.apull.net ' 2007-6-9 ' ' Imports System.Runtime.InteropServices     Mod...

在ASP中访问和更新Cookies集合

在ASP中访问和更新Cookies集合

  Cookies的值比ASP其他集合(例如Form和ServerVariables)的值要复杂得多。Cookie是一小块由浏览器存贮在客户端系统上的文本,且随同每次请求发往它们应用于的域中的服务器。  ASP使得应用cookie较为容易,可以从Request对象的Cookies集合中获得所有随同请求发出的cookie值,并可创建或修改cookie,通过Response对象的Cookies集合发回给用户。  Cookie包含可用两种方式构造的信息,单值cookie提供其值给代...

ASP六大对象介绍

ASP六大对象介绍

Application对象 Application对象是个应用程序级的对象,用来在所有用户间共享信息,并可以在Web应用程序运行期间持久地保持数据。 Application的属性:  方法如下: Application对象没有内置的属性,但是我们可以自行创建其属性。 <% Application("属性名")=值 %>    其实大部分Application变量都 存放在Contents集合中,当你创建一个新的Application变量时,其实...