回 帖 发 新 帖 刷新版面

主题:如何阻止用户两次启动我的应用程序?

请教:
      如何阻止用户两次启动我的应用程序?

回复列表 (共30个回复)

沙发

cTitle="你程序的标题"  &&就是你主窗口的caption值
DECLARE integer FindWindow IN user32 string,string
IF FindWindow(0,cTitle)<>0
    =MESSAGEBOX("该系统已运行,无需重复!",48,"杨志鸿")
    QUIT
ENDIF
_screen.caption = cTitle

板凳

*在主文件加入"互斥体"代码:

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 楼

谢谢1楼先生热心回贴。
我已试过,好了。问题还有:如何在再次启动弹出对话框时,不让显示出VFP的界面,只显示对话框。?

2楼先生的代码我不是太理解。既然已好,我就没再试。但一并表示感谢。

4 楼

还有问题:

在程序运行过程中,窗口的名称是可以修改的。如果修改了,刚才的方法无效。应如何改进?

5 楼

在主程序里的最前面, 最少应该放在
messagebox()前面
放一个
_screen.visible = .f.
把主窗口隐藏了

6 楼

[quote]还有问题:

在程序运行过程中,窗口的名称是可以修改的。如果修改了,刚才的方法无效。应如何改进?[/quote]

用创建互斥体,就不存在你说的问题!

7 楼

[quote]谢谢1楼先生热心回贴。
我已试过,好了。问题还有:如何在再次启动弹出对话框时,不让显示出VFP的界面,只显示对话框。?

2楼先生的代码我不是太理解。既然已好,我就没再试。但一并表示感谢。[/quote]

*在config.fpw 加入:

screen=off
title=XXX软件
resource=off

*就可在再次启动弹出对话框时,不显示出VFP的界面.

8 楼

如果 你的程序 标题是不停变化的,
你可以在主程序里先得到程序名如:‘main.exe’
用API得到所有有进程文件,看有没有main.exe如果有说明程序已运行

9 楼

我想,也许还是需要用到“互斥体”。以下是我的主程序代码,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 楼

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

我来回复

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