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

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

编程学习2007-10-2963330

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语言 每个程序员在他们的编程生涯中都应该学习C语言,因为它有太多难以忽视的好处了。除了它会给你提供更多的工作机会之外,C语言还会教给你更多的关于计算机的知识。它能给我们提供的裨益,简单列举如下:   1)相比较其他的编程语言(像C++,JAVA),C语言是个低级语言。从总体上来说,低级的编程语言可以让你更好的了解计算机。   2)设备驱动程序和操作系统只能用C语言来编写。现在,你...

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

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

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

 C++ string类常用函数

C++ string类常用函数

string类的构造函数:string(const char *s);    //用c字符串s初始化 string(int n,char  c);     //用n个字符c初始化此外,string类还支持默认构造函数和复制构造函数,如string s1;string  s2="hello";都是正确的写法。...

ASP六大对象介绍

ASP六大对象介绍

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

发表评论

访客

看不清,换一张

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