标题:顶层表单做软件主界面的exe如何防止软件重复运行
只看楼主
laibinhua
Rank: 2
等 级:论坛游民
威 望:1
帖 子:205
专家分:31
注 册:2010-12-23
结帖率:56.36%
已结贴  问题点数:20 回复次数:8 
顶层表单做软件主界面的exe如何防止软件重复运行
请教:顶层表单做软件主界面的exe如何防止软件重复运行,之前因为不是用顶层表单做主界面可以用下面的方法实现:
*-- 设置软件唯一运行模式
    SET LIBRARY TO mypath+"\ocx\foxtools.fll" ADDITIVE
    LOCAL getwind
    GetWind = RegFn("FindWindow", "CC", "I")
    wclass=0
    winname="『测试软件』"
    apphand=CallFn(GetWind,wclass ,winname)
    IF apphand<>0  &&如果找到窗口,停止运行
       =MESSAGEBOX("软件已在运行中,不能重复运行!"+CHR(13)+CHR(13)+"很有可能你已将程序最小化了!"+CHR(13);
       +"在最下面的状态栏点它下就可以了!",64,"提示信息")
       QUIT
    ENDIF
搜索更多相关主题的帖子: 重复运行 防止 软件 表单 界面 
2021-11-12 13:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:7 
程序代码:
DECLARE LONG CreateMutex  IN Kernel32 STRING@, LONG, STRING@
DECLARE LONG GetLastError IN Kernel32
DECLARE LONG CloseHandle  IN Kernel32 LONG

szPrg  = PROGRAM()
hMutex = CreateMutex(NULL, 0, @szPrg)

IF GetLastError() != 183    && ERROR_ALREADY_EXISTS
    MESSAGEBOX(szPrg + " 正常启动运行")
ELSE
    MESSAGEBOX(szPrg + " 不能重复运行")
ENDIF

CloseHandle(hMutex)
CLEAR DLLS
RETURN

2021-11-12 14:12
cjc1010
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:195
注 册:2006-4-16
得分:7 
重复运行时直接把界面正常化更好。
2021-11-12 15:46
laibinhua
Rank: 2
等 级:论坛游民
威 望:1
帖 子:205
专家分:31
注 册:2010-12-23
得分:0 
回复 2楼 吹水佬
大佬,用你的代码还是可以重复启动 ( 我的是win10系统
2021-11-12 22:55
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用laibinhua在2021-11-12 22:55:14的发言:

大佬,用你的代码还是可以重复启动 ( 我的是win10系统

编译成EXE
2021-11-13 04:31
laibinhua
Rank: 2
等 级:论坛游民
威 望:1
帖 子:205
专家分:31
注 册:2010-12-23
得分:0 
回复 5楼 吹水佬
是EXE文件
2021-11-13 13:45
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 6楼 laibinhua
那时看到有两个进程正常
一个是“正常启动运行”,另一个是“不能重复运行”
“不能重复运行”的进程下一步就是关闭退出了

2021-11-13 14:47
laibinhua
Rank: 2
等 级:论坛游民
威 望:1
帖 子:205
专家分:31
注 册:2010-12-23
得分:0 
回复 7楼 吹水佬
我用了这句 没有出来提示 MESSAGEBOX 直接同时打开两个来了,怪地,我再试试
*-- 设置软件唯一运行模式
DECLARE LONG CreateMutex  IN Kernel32 STRING@, LONG, STRING@
DECLARE LONG GetLastError IN Kernel32
DECLARE LONG CloseHandle  IN Kernel32 LONG

szPrg  = PROGRAM()
hMutex = CreateMutex(NULL, 0, @szPrg)

IF GetLastError() = 183    && ERROR_ALREADY_EXISTS
    MESSAGEBOX(szPrg + " 不能重复运行")
    QUIT
ENDIF

CloseHandle(hMutex)
2021-11-13 15:10
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:7 
你可以参考我这个代码:

DECLARE integer FindWindow IN WIN32API string lpclassname,string lpwindowname
lpwindowname='Ewave 跟单管理系统'
IF NOT findwindow(0,lpwindowname)==0
    =MESSAGEBOX('程序已经运行了!',48,'Ewave 跟单管理系统')
    QUIT
ENDIF
2021-11-13 15:21



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507488-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.281267 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved