主题:如何阻止用户两次启动我的应用程序?
sheyycy
[专家分:30] 发布于 2009-10-23 02:18:00
请教:
如何阻止用户两次启动我的应用程序?
回复列表 (共30个回复)
沙发
homayzh [专家分:7040] 发布于 2009-10-23 03:44:00
cTitle="你程序的标题" &&就是你主窗口的caption值
DECLARE integer FindWindow IN user32 string,string
IF FindWindow(0,cTitle)<>0
=MESSAGEBOX("该系统已运行,无需重复!",48,"杨志鸿")
QUIT
ENDIF
_screen.caption = cTitle
板凳
foxdb [专家分:1830] 发布于 2009-10-23 04:39:00
*在主文件加入"互斥体"代码:
DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND,STRING,STRING lpszFile,STRING,STRING,INTEGER
DECLARE INTEGER CreateMutex IN kernel32.DLL INTEGER,INTEGER,String
DECLARE INTEGER GetLastError IN kernel32.DLL
DECLARE INTEGER CloseHandle IN kernel32.DLL
handle=CreateMutex(0,0,"<<XXX软件 V1.0>> ")
IF handle=0
_screen.windowstate=2
MESSAGEBOX("创建互斥体失败!",0,"信息提示!")
RETURN .f.
ELSE
IF GetLastError()=183
_screen.windowstate=2
=MESSAGEBOX("程序不能重复同时启动!",48," 信息提示!")
CLOSE all
Clear dlls
QUIT
ENDIF
ENDIF
3 楼
sheyycy [专家分:30] 发布于 2009-10-24 07:58:00
谢谢1楼先生热心回贴。
我已试过,好了。问题还有:如何在再次启动弹出对话框时,不让显示出VFP的界面,只显示对话框。?
2楼先生的代码我不是太理解。既然已好,我就没再试。但一并表示感谢。
4 楼
sheyycy [专家分:30] 发布于 2009-10-24 08:03:00
还有问题:
在程序运行过程中,窗口的名称是可以修改的。如果修改了,刚才的方法无效。应如何改进?
5 楼
homayzh [专家分:7040] 发布于 2009-10-24 14:15:00
在主程序里的最前面, 最少应该放在
messagebox()前面
放一个
_screen.visible = .f.
把主窗口隐藏了
6 楼
foxdb [专家分:1830] 发布于 2009-10-24 15:29:00
[quote]还有问题:
在程序运行过程中,窗口的名称是可以修改的。如果修改了,刚才的方法无效。应如何改进?[/quote]
用创建互斥体,就不存在你说的问题!
7 楼
foxdb [专家分:1830] 发布于 2009-10-24 15:32:00
[quote]谢谢1楼先生热心回贴。
我已试过,好了。问题还有:如何在再次启动弹出对话框时,不让显示出VFP的界面,只显示对话框。?
2楼先生的代码我不是太理解。既然已好,我就没再试。但一并表示感谢。[/quote]
*在config.fpw 加入:
screen=off
title=XXX软件
resource=off
*就可在再次启动弹出对话框时,不显示出VFP的界面.
8 楼
homayzh [专家分:7040] 发布于 2009-10-24 15:44:00
如果 你的程序 标题是不停变化的,
你可以在主程序里先得到程序名如:‘main.exe’
用API得到所有有进程文件,看有没有main.exe如果有说明程序已运行
9 楼
sheyycy [专家分:30] 发布于 2009-10-24 22:02:00
我想,也许还是需要用到“互斥体”。以下是我的主程序代码,2楼先生能帮我修改一下吗?谢谢。
SET TALK OFF
SET SAFETY OFF
SET DELETED OFF
SET CENTURY ON
SET DATE TO ANSI
PUBLIC xtPth,xtDm,xtCapt
xtPth = left(sys(16,1),rat("\",sys(16,1)))
CD &xtPth
xtDm = "0000" &&用户调用不同项目时,其值会被更改。
xtCapt = "送电线路工程施工管理系统"
_screen.Caption=xtCapt+" 当前工程项目: ["+xtDm+"]" && 随着更改
_screen.Icon = "sd_ico.ico"
_screen.Height=600
_screen.Width=900
ON SHUTDOWN Shutdown()
ON ERROR ErrorHandler(ERROR(),PROGRAM(),LINENO())
PUBLIC xtMenu as menu,xtToolbar as Toolbar
xtMenu="sd_menu.mpr"
DO &xtMenu
set classlib to bar1 additive
xtToolbar=createobject('sd_toolbar')
xtToolbar.show
xtToolbar.dock(0)
SET MARK of BAR 1 of _mwindow to .T.
SET MARK of BAR 2 of _mwindow to .T.
READ events
SET PATH TO
CLEAR ALL
CLOSE ALL
POP MENU _msysmenu
ON ERROR
ON SHUTDOWN
RETURN
10 楼
foxdb [专家分:1830] 发布于 2009-10-24 22:57:00
SET TALK OFF
SET SAFETY OFF
SET DELETED OFF
SET CENTURY ON
SET DATE TO ANSI
DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND,STRING,STRING lpszFile,STRING,STRING,INTEGER
DECLARE INTEGER CreateMutex IN kernel32.DLL INTEGER,INTEGER,String
DECLARE INTEGER GetLastError IN kernel32.DLL
DECLARE INTEGER CloseHandle IN kernel32.DLL
handle=CreateMutex(0,0,"送电线路工程施工管理系统")
IF handle=0
_screen.windowstate=2
MESSAGEBOX("创建互斥体失败!",0,"信息提示!")
RETURN .f.
ELSE
IF GetLastError()=183
_screen.windowstate=2
=MESSAGEBOX("程序不能重复同时启动!",48," 信息提示!")
CLOSE all
Clear dlls
QUIT
ENDIF
ENDIF
PUBLIC xtPth,xtDm,xtCapt
xtPth = left(sys(16,1),rat("\",sys(16,1)))
CD &xtPth
xtDm = "0000" &&用户调用不同项目时,其值会被更改。
xtCapt = "送电线路工程施工管理系统"
_screen.Caption=xtCapt+" 当前工程项目: ["+xtDm+"]" && 随着更改
_screen.Icon = "sd_ico.ico"
_screen.Height=600
_screen.Width=900
ON SHUTDOWN Shutdown()
ON ERROR ErrorHandler(ERROR(),PROGRAM(),LINENO())
PUBLIC xtMenu as menu,xtToolbar as Toolbar
xtMenu="sd_menu.mpr"
DO &xtMenu
set classlib to bar1 additive
xtToolbar=createobject('sd_toolbar')
xtToolbar.show
xtToolbar.dock(0)
SET MARK of BAR 1 of _mwindow to .T.
SET MARK of BAR 2 of _mwindow to .T.
READ events
SET PATH TO
CLEAR ALL
CLOSE ALL
POP MENU _msysmenu
ON ERROR
ON SHUTDOWN
RETURN
我来回复