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

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

编程学习2007-10-2983090

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

分享给朋友:

相关文章

SHFileOperation介绍

SHFileOperation介绍

SHFileOperation函数功能描述:文件操作,与 Shell 的动作相同.函数原型:#include<shellapi.h> WINSHELLAPI int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);参数:typedef struct _SHFILEOPSTRUCT { HWND hwnd; //父窗口句柄 UINT wFu...

关于学习编程和C语言

关于学习编程和C语言

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

密码的故事

密码的故事

密码的故事Billy Hollis 本文是由一个问题引出的。我需要一种将密码保存在加密文件中的方法,因为我需要记住许多密码,但记忆力却已大不如前。我知道有许多商用工具能够做到这一点,但我感到学习  .NET 中的一项新技术真的很有好处。 我用 Visual Basic® .NET  完成了一个简单而完整的程序,用于加密和解密文件,从中学到了许多知识。既然加密对于多种开发都是一个重要问题,本文就介绍一下如何构造这样的程序。 有各种低级别的技术可以用于加密,...

代码迷惑技术如何保护Java免遭逆向工程

代码迷惑技术如何保护Java免遭逆向工程

很少有问题比程序员遇到不访问无法利用的源代码就无法解决的漏洞更令人沮丧的了。你是否在通过一个在线开源库修补代码,或正在调用常用操作系统例行程序;你可能每周都要花时间处理不是由你编写,因而也无法访问其源代码的代码。因为Java字节码包含许多和原始代码相同的信息,所以很容易对Java类文件执行逆向工程。另外,Java程度以其“一旦编写,随处运行”特性而闻名。虽然并非Java语言的专利,但代码反编译从未在Java开发者之中得到如此公开或普遍地利用。反编译的对...