| 作者 | 主题 |
|---|---|
|
shibin 新手 经验值:32 发帖数:27 精华帖:0 |
楼主
主题:ProgramExecute("c:\\office\\office\\excel.exe");
请教各位大侠:
有何方法检测某一运行程序已经启动,重复打开无效。
shibin
|
|
tonny_king 新手 经验值:40 发帖数:29 精华帖:1 |
楼
主题:回复:ProgramExecute(
如果你知道vb那么你应该知道如何检测程序的运行。
用内存映射判断应用程序是否运行多次 判断应用程序是否运行多次在 VB 中多种方法可以实现: 1、查找窗口法,利用 FindWindow 函数查找同名的窗口,如找到则说明运行了多个实例。 2、枚举窗口法,利用 EnumWindows 函数枚举屏幕中的所有窗口,再用 GetWindowText 函数取得标题,然后检查标题。 3、文件标识法,在第一次运行程序时在文件中、或注册表中写入判断的标识,程序退出时再把标识修改过来,然后根据标识判断程序是否运行。 但是上述方法都有这样那样的缺点,如: 1、2 查找窗口法、枚举窗口法 如果应用程序无窗口、窗口名动态变化或窗口名相同而程序不同,则判断会出现问题, 3、文件标识法 如果程序在运行时出现非常操作,或突然系统Down 了,则也会出现判断错误的问题。 那么,有没有一种方法可以解决上述的问题呢,当然是有得了,在 VB 中可以通过 CreateMutex 函数用互斥法、 CreateFileMapping 函数用内存映射法来判断,这里由于篇幅问题,只介绍内存映射法: 内存映射文件是在内存中建立的可供所有进程共享的文件。当程序的每个实例运行时都将判断指定的内存映射文件是否存在,如果已经存在,则说明已经运行有应用程序运行了;如果不存在指定的内存映射文件,则证明当前的应用程序是第一个应用程序,同时建立一个指定的内存映射文件,直到这个实例关闭时才关闭这个内存映射文件。这样,即使发生停电、死机等意外,机器重新启动以后,内存全部刷新,指定的内存文件自然消失,对程序判断无任何影响。 程序代码如下 : Form1.frm 文件 Option Explicit Private Sub Form_Load() Main End Sub Module.bas 文件 Option Explicit `声明相关函数 Private Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" _ (ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect _ As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName _ As String) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDes criptor As Long bInheritHandle As Long End Type Const PAGE_READWRITE = 1 Const ERROR_ALREADY_EXISTS = 183& Public Sub Main() Dim ynRun As Long Dim sa As SECURITY_ATTRIBUTES sa.bInheritHandle = 1 sa.lpSecurityDes criptor = 0 sa.nLength = Len(sa) ynRun = CreateFileMapping(&HFFFFFFFF, sa, PAGE_READWRITE, 0, 128, App.Title) `创建内存映射文件 If ynRun = 0 Then MsgBox "创建内存映射文件失败", vbQuestion, "错误" If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then `如果指定内存文件已存在,则提示并退出 MsgBox "程序已运行!", vbQuestion, "错误" CloseHandle ynRun `退出程序前关闭内存映射文件 End End If End Sub 你可以参考以上的方法调用相关的windows函数实现,别告诉我你部知道在wincc中如何调用API |