回 帖 发 新 帖 刷新版面

主题:怎么判断程序的运行状况

为了不让一个程序过多运行!
当一个程序运行时怎么判断是否有一个同样的程序也在运行?若有则关闭第一个程序!这个我感觉好难呀!哪位好心人来帮帮我!

回复列表 (共9个回复)

沙发

方法1:
If App.PrevInstance Then
    MsgBox "已经有一个同样的程序在进行."
    End
End If

不过,如果把exe文件移到另一路径,或改名,也能运行多个.
方法2:
可以考虑在运行时在注册表或某文件里写一个值,表示已有一个程序在运行,退出时再清除这个值.在程序启动时判断这个值是否存在即可.但如果上一个程序发生错误意外退出,以致于这个值没有正常地清除,下一次启动时就可能启动不了了.
方法3:
用findwindow等函数查找当前运行的所有进程中有没有你要找的程序窗口.

板凳

天天学习:谢谢

3 楼

1楼的代码是关闭后启动的同名实例,如果要关闭先启动的同名实例(例如播放器就要关闭先启动的),那么就要用下面的代码:

Private Sub Form_Initialize()
If App.PrevInstance Then SendMessage FindWindow("ThunderRT6FormDC", "VCD播放器"), 16&, 0, 0
End Sub

代码中用到了2个API函数。
"VCD播放器"这几个字符要改为你的窗体标题

4 楼


那两个API函数怎么定义呀?我总是报错说函数未定义!可能定义里有错误

5 楼

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

如果是在窗体中定义,Public 要改为 Private

6 楼

1楼的方法2不实用,不过可以改进成:锁定文件

7 楼

Option Explicit
'****************** 禁止重复运行 ********************************************************************************************************************
Private Declare Function OpenEvent Lib "kernel32" Alias "OpenEventA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (lpEventAttributes As SECURITY_ATTRIBUTES, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Sub Form_Load()
    Dim Attrib As SECURITY_ATTRIBUTES
    Dim ExeName As String
    
    ExeName = "myappname"
    If OpenEvent(2031619, False, ExeName) <> 0 Then End ' "myappname"可以是任何文本,但是最好要长一点以保证和系统中已有其他事件对象的名称不相冲突。
    Call CreateEvent(Attrib, False, False, ExeName)
End Sub

8 楼


完全通过!thanks。 但是这不是我要的结果!前面差不多了,后面就。。。。。!我不是想结束还是想关闭前一个程序运行后面的这个程序!

9 楼

路过

我来回复

您尚未登录,请登录后再回复。点此登录或注册