powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / УТОЧНЕНИЕ по "повторному запуску приложения"
10 сообщений из 10, страница 1 из 1
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33013636
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь использовать MUTEX функцию, чтобы избежать повторного запуска программы... Все работает... но такой недостаток... : свернутая в кнопку на панель программа не разворачивается, если уже запущена... а хотелось бы...

в начале главного файла:
Код: plaintext
1.
2.
IF !FirstInstance()
   CANCEL
ENDIF
сама функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
FUNCTION FirstInstance()
   LPARAMETERS lcStarBase

   #DEFINE SW_RESTORE                9 
   #DEFINE ERROR_ALREADY_EXISTS    183 
   #DEFINE GW_HWNDNEXT               2 
   #DEFINE GW_CHILD                  5 

   DECLARE INTEGER CreateMutex IN win32api INTEGER, INTEGER, STRING @
   DECLARE INTEGER CloseHandle IN win32api INTEGER
   DECLARE INTEGER GetLastError IN win32api
   DECLARE INTEGER SetProp IN win32api INTEGER, STRING @, INTEGER
   DECLARE INTEGER GetProp IN win32api INTEGER, STRING @
   DECLARE INTEGER RemoveProp IN win32api INTEGER, STRING @
   DECLARE INTEGER IsIconic IN win32api INTEGER
   DECLARE INTEGER SetForegroundWindow IN USER32 INTEGER
   DECLARE INTEGER GetWindow IN USER32 INTEGER, INTEGER
   DECLARE INTEGER ShowWindow IN WIN32API INTEGER, INTEGER
   DECLARE INTEGER GetDesktopWindow IN WIN32API

   *-- We need a function from Foxtools. I know I could get this from the API, but I'm lazy.
   IF !("FOXTOOLS" $ UPPER(SET("LIBRARY")))
      SET LIBRARY TO FOXTOOLS.fll ADDI
   ENDIF
   
   LOCAL cExeFlag  && Name of the MUTEX
   LOCAL nExeHwnd  && MUTEX handle
   LOCAL hWnd      && Window handle
   LOCAL lRetVal   && Return value of this function

   *-- Try and create a new MUTEX with this name.
   IF EMPTY(lcStarBase)
	   cExeFlag = "STARBASE"+CHR(0)
   ELSE
   	   cExeFlag = lcStarBase+CHR(0)
   ENDIF
  
   nExeHwnd = CreateMutex(0,1,@cExeFlag)

   *-- If the named MUTEX creation fails because it exists already, try to display
   *-- the existing application and have this function return .F., presumably
   *-- to a calling routine that is deciding whether to continue instantiation.
   IF GetLastError() = ERROR_ALREADY_EXISTS
      *-- Get the hWnd of the first top level window on the Windows Desktop.
      HWND = GetWindow(GetDesktopWindow(), GW_CHILD)
      *-- Loop through the windows. If the application has no top level window, 
      *-- the loop will quickly run out of desktop windows and simply exit.
      DO WHILE HWND > 0
         *-- Is this the proper window? GetProp looks() for a property we added
         *-- the first time, not a caption.
         IF GetProp(HWND, @cExeFlag) = 1
            *-- If the application window is minimized, open 'er up to the 
            *-- previous state.
            IF IsIconic(HWND) >  0 
               ShowWindow(HWND,SW_RESTORE)
            ENDIF
            *-- Show me the money, oops, I meant the window, Show Me The Window!
            SetForegroundWindow(HWND)
            *-- Our work here is done, ride off into the sunset.
            EXIT
         ENDIF
         *-- Get the next window handle.
         HWND = GetWindow(HWND,GW_HWNDNEXT)
      ENDDO
      *-- Close the 'failed to open' MUTEX handle, we don't need it any more.
      CloseHandle(nExeHwnd)
      lRetVal = .F.
   ELSE
      *-- Add a property to the FoxPro main frame so we can identify this 
      *-- window again regardless of caption changes.
      SetProp(_vfp.hWnd, @cExeFlag,  1 )
      lRetVal = .T.
   ENDIF
   RETURN lRetVal
ENDFUNC
PS: главное окно изначально максимизировано...
использую Visual FoxPro 8.0 SP1 + WIN XP SP1
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33013681
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я пользуюсь такой вот штучкой: (как-то добрые люди показали, извиняюсь, сразу не вспомню кто, но работает - идеально!)

IF !IsWindEx('_тут имя окна_')
DO FORM ...
READ EVENTS
CLEAR EVENTS
ENDIF
QUIT
***************************
FUNCTION IsWindEx
PARAMETERS WindowName
IsWindEx = .F.
SET LIBRARY TO foxtools.fll
* Register the Windows API functions that will be called
mGetWinTxt = RegFn("GetWindowText", "I@CI", "I")
mGetWindow = RegFn("GetWindow", "II", "I")
mIsWinVis = RegFn("IsWindowVisible", "I", "I")
* Get the HWND (handle) to the main FoxPro window
foxhwnd = MAINHWND()
* Produce a list of all windows
hwndNext = CallFn(mGetWindow,foxhwnd,0)
DO WHILE hwndNext <> 0
IF (hwndnext <> foxhwnd) .AND. ;
CallFn(mGetWindow,hwndnext,4) = 0 .AND. ;
CallFn(mIsWinVis,hwndnext) <> 0
Stuffer = SPACE(64)
x = CallFn(mGetWinTxt,hwndnext,@Stuffer,64)
* If a window name was specified, check to
* see if this is the specified window. If a
* window name was not specified, display the
* name of the window.
IF LEN(TRIM(WindowName)) = 0
*? Stuffer
ELSE
IF WindowName $ Stuffer
IsWindEx = .T.
EXIT
ENDIF
ENDIF
ENDIF
hwndNext = CallFn(mGetWindow,hwndnext,2)
ENDDO
SET LIBRARY TO
IF LEN(TRIM(WindowName)) = 0
IsWindEx = .T.
ENDIF
RETURN IsWindEx
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33013729
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrispyА я пользуюсь такой вот штучкой: (как-то добрые люди показали, извиняюсь, сразу не вспомню кто, но работает - мне вот тоже добрые люди подсказали... но хотелось бы именно на основании MUTEX, а не поиск по названию окна...
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33013867
Кусакин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/topic/133602&pg=-1&hl=mutex
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33013983
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кусакин/topic/133602&pg=-1&hl=mutex по своему вопросу (указанной в моем вопросе функции)ничего там не нашел.... может плохо искал??!
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33014135
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне люди подсказали метод еще короче
Проверено на 98-ке и 2000-ке

DECLARE LONG FindWindow IN Win32API;
STRING lpClassName;
,STRING lpWindowName
** ПРоверка заголовка главной формы fMain
lhWnd = FindWindow(NULL, "Склад (вер. 1.0 [20/03/2005])")
IF lhWnd # 0
= MESSAGEBOX("Программа запущена!!! ", "Повторний запуск")
QUIT
Endif
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33014222
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да способы есть разные....
Но хотелось бы все таки с MUTEX-ом и Win32api - так как я не очень в этом шурупаю... то хотелось бы все таки относительно FirstInstance(). Она работает... хорошо работает... на окно свернутое не разворачивает...

PS: если достал своей настойчивостью.... не пинайте сильно....
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33014343
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как делаю я (списал где - не помню...)

Вначале запуска программы идет проверка

Код: plaintext
1.
2.
3.
4.
5.
* check that we have only one copy of the program in the memory
IF AppAlreadyRunning()
  =MESSAGEBOX("We are very sorry, but you can lunch only one copy of this program",  0  +  16  + 0 , "Error during start")
  QUIT
ENDIF

Далее сама функция:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
FUNCTION AppAlreadyRunning
LOCAL hsem, lpszSemName
#DEFINE ERROR_ALREADY_EXISTS  183 
DECLARE INTEGER GetLastError IN win32API
DECLARE INTEGER CreateSemaphore IN WIN32API ;
  STRING @ lpSemaphoreAttributes, ;
  LONG lInitialCount, ;
  LONG lMaximumCount, ;
  STRING @ lpName
lpszSemName = 'LTSREP'
hsem = CreateSemaphore( 0 , 0 , 1 ,lpszSemName)
RETURN (hsem #  0  AND GetLastError() == ERROR_ALREADY_EXISTS)
Все просто и надежно как в автомате Калашникова

P.S. 'LTSREP' - имя Вашей программы...
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33014479
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FindWindow все предлагают, потому что именно она может найти главное окно первого экземпляра и послать ему сообщение на распахивание. Поэтому ее нужно использовать вместе с мутантом или первый экземпляр где-то должен записать (в файл например) описатель главного окна, и тогда последующие экземпляры прочитают его и пошлют ему SetForegrown... чего-то там
...
Рейтинг: 0 / 0
УТОЧНЕНИЕ по "повторному запуску приложения"
    #33014716
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi help123!

В приведенном коде замени функцию ShowWindow на ShowWindowAsync (параметры аналогичны). У меня тоже почему-то с ShowWindow этот код не срабатывал...

P.S. Foxtools.fll тебе не нужен - ты же в 8-ке, а там _VFP.hWnd напрямую доступен :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / УТОЧНЕНИЕ по "повторному запуску приложения"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]