Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Only open application once
Message
General information
Forum:
Visual FoxPro
Category:
Other
Miscellaneous
Thread ID:
00585701
Message ID:
00585856
Views:
69
Sergey,

FWIW, here's my code
DEFINE CLASS OnlyOne AS CUSTOM
  hMutex = 0
  nMutexError = 0
  cFormCaption = ""
  
  PROCEDURE Init
    
    LPARAMETER pcformcaption, pcsdiname, pcmutexname
    
    DECLARE INTEGER CreateMutex IN Win32API;
      STRING @lpMutexAttributes,;
      INTEGER bInitialOwner,;
      STRING @lpName
    DECLARE INTEGER GetLastError IN Win32API
    DECLARE INTEGER FindWindow IN Win32API;
      STRING @lpClassName, STRING @lpWindowName
    DECLARE INTEGER ShowWindow IN Win32API;
      INTEGER hwnd, INTEGER nCmdShow
    DECLARE SHORT IsIconic IN Win32API;
      INTEGER hwnd
    DECLARE SHORT SetForegroundWindow IN Win32API;
      INTEGER hWnd
    LOCAL lnInitOwner, lcname, lnargs, lcformcaption
    lnargs = PARAMETERS()
    DO CASE
      CASE lnargs = 1
        * So that the mutex name is different
        * from the caption
        lcname = CHRTRAN(pcformcaption, SPACE(1), "")
        lcformcaption = pcformcaption
      CASE lnargs = 2
        * This is an SDI Form
        * The form's caption must be different
        * from the _SCREEN's for restoring the
        * screen if necessary
        lcname = CHRTRAN(pcsdiname, SPACE(1), "")
        lcformcaption = pcsdiname
      CASE lnargs = 3
        * If a mutex name is to be passed
        * pcsdiname should be passed as empty
        * If not and SDI form
        IF NOT EMPTY(pcsdiname)
          lcformcaption = pcformcaption
        ELSE
          lcformcaption = pcsdiname
        ENDIF
        lcname = pcmutexname
    ENDCASE
    * Simulate a BOOL = TRUE
    lnInitOwner = 1
    This.cFormCaption = lcformcaption
    This.hMutex = CreateMutex(0, lnInitOwner, @lcname)
    This.nMutexError = GetLastError()
    RETURN
  ENDPROC
  
  PROCEDURE DisplayOtherInst
    * This procedure is used to display
    * the initial instance of the application
    
    LOCAL lcformcaption, llvisible, lnhWnd,;
      llicon
    lcformcaption = This.cFormCaption
    lnhWnd = FindWindow(0, @lcformcaption)
    IF NOT EMPTY(lnhWnd)
      * Just Restore it if necessary
      llicon = (IsIconic(lnhWnd) # 0)
      = SetForegroundWindow(lnhWnd)
      IF llicon
        * It's an icon, so restore it
        = ShowWindow(lnhWnd, 9)
      ENDIF
    ELSE
      = MESSAGEBOX("Only one instance of this application allow! Please check your taskbar.", 64, "Single Instance Application")
    ENDIF
    RETURN 
  ENDFUNC
  
  PROCEDURE Destroy
    DECLARE INTEGER WaitForSingleObject IN Win32API;
      INTEGER hObject, INTEGER dwTimeOut
    DECLARE SHORT ReleaseMutex IN Win32API;
      INTEGER hMutex
    DECLARE SHORT CloseHandle IN Win32API;
      INTEGER hObject
    LOCAL lnresult
    IF This.hMutex # 0
      lnresult = WaitForSingleObject(This.hMutex, 50)
      * 258 = STATUS_TIMEOUT
      IF lnresult # 258
        lnresult = ReleaseMutex(This.hMutex)
        * 1 equals Boolean TRUE
        IF lnresult = 1
          lnresult = CloseHandle(This.hMutex)
        ENDIF
      ENDIF
    ENDIF
    CLEAR DLLS
  ENDPROC
ENDDEFINE
George

Ubi caritas et amor, deus ibi est
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform