powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Повторное открытие приложения
21 сообщений из 21, страница 1 из 1
Повторное открытие приложения
    #32933268
ksusha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем!
Подскажите, пожалуйста, как можно запретить повторное открытие приложения. То есть если оно уже открыто, чтобы при повторном открытии оно не открывалось. Многопользовательский доступ не нужен, прога только на оотдельном компе.
Спасибо.
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32933359
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код не мой - сразу говорю.. но у меня работает

DECLARE LONG FindWindow IN Win32API;
STRING lpClassName;
,STRING lpWindowName

lhWnd = FindWindow(NULL, "Моя программа")
IF lhWnd # 0
= MESSAGEBOX("Эй дружище!!! Моя программа уже запущена", "А не фиг не поискав на панели еще раз запускать!")
QUIT
Endif
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32933363
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если зайти в Поиск и набрать что то вроде "запрет повторног запуска", то думаю там читать не перечитать :)
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32933390
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже не мой. Доработан на поиск окна по постоянной части заголовка и активации приложения если оно уже запущено.

Код: 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.
*!*	Function IsWindowExist

parameters WindowName

if parameters() =  0 
	WindowName = ''
else
	WindowName = trim(WindowName)
endif

IsWindEx =  0 

set library to sys( 2004 ) + "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 WindowName $ Stuffer
			IsWindEx = hWndNext
			exit
		endif
	endif
	hWndNext = CallFn(mGetWindow,hWndNext, 2 )
enddo

set library to

return IsWindEx 
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32935171
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В поиске набери Mutex, найдешь обсуждение с 1000 и одним вариантом
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32935385
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi AleksMed!

Какой кошмар :( Видать ещё с FPW перетащено :(

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32935511
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi AleksMed!

Какой кошмар :( Видать ещё с FPW перетащено :(

Posted via ActualForum NNTP Server 1.1

Ну, "какой кошмар" - это не аргумент :)
Процедура работает и нареканий не было :)
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32935869
ksusha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32937506
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi AleksMed!

Дык оно 1001 способом сделать можно, причём половина из них будут иметь
существенные недостатки - например твой как обычно исходит из предположения
что заголовок приложения (пускай даже только первая его часть!) во-первых
неизменен, и во-вторых уникален в пределах системы.
Кроме того пользоваться 16-битным посредником RegFn + CallFn в более-менее
свежем VFP - где есть полноценное DECLARE DLL для этих целей - это большое
извращение однако :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #32937744
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi AleksMed!

Дык оно 1001 способом сделать можно, причём половина из них будут иметь
существенные недостатки - например твой как обычно исходит из предположения
что заголовок приложения (пускай даже только первая его часть!) во-первых
неизменен, и во-вторых уникален в пределах системы.
Кроме того пользоваться 16-битным посредником RegFn + CallFn в более-менее
свежем VFP - где есть полноценное DECLARE DLL для этих целей - это большое
извращение однако :)

Posted via ActualForum NNTP Server 1.1

:) Ну по поводу изменения заголовка можно дискутировать долго и каждый останеться при своем мнении. Думаю что неизменная постоянная составляющая в заголовке должна присутствовать всегда (например, название приложения), вот по ней то и будем ориентироваться и вести поиск вхождения в заголовок по $.

На счет RegFn и CallFn - прав, но пока переделывать лень :)
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33117952
Новоселов Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi ksusha!

Вставь в начало главного(стартового) файла проекта
обычно он называется ..._app.prg (например, что-то типа: my _app.prg)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#DEFINE SW_MAXIMIZE  3 
#DEFINE SW_RESTORE  9 
DECLARE LONG FindWindow IN WIN32API STRING @STR1,STRING @STR2
DECLARE INTEGER ShowWindow IN win32api INTEGER, INTEGER
DECLARE INTEGER SetForegroundWindow IN user32 INTEGER hWindow 

LOCAL hWindow
hWindow=FindWindow('my8c000000','Моя программа, ver.1.0 2005')
IF hWindow> 0   && уже запущена
   DECLARE INTEGER InvalidateRect IN User32.dll INTEGER, INTEGER, INTEGER

   ShowWindow(hWindow,SW_MAXIMIZE)  && развернуть минимизированное
   SetForegroundWindow(hWindow)  && сделать активным
   InvalidateRect( 0 ,  0 ,  1 )    && перисовать, важно если нет открытых форм

   RETURN 
ENDIF 

заменить:

'my 6 c000000' - в 6 VFP
'my 7 c000000' - в 7 VFP
'my 8 c000000' - в 8 VFP
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33117978
Новоселов Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При данном способе, запущенный ранее экземпляр приложения,
не только станет активным, но и развернется с панели задач.

Не нужно будет писать
MESSAGEBOX("Программа уже запущена", "Ткните мышкой по свернутому окну !"),
а пользователю искать нужное окно, если у него запущено много приложений
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33118513
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Олег!

Ты серьёзно считаешь что у всех приложения называются My.exe :)
И кроме того с чего ты решил что заголовок приложения не изменяется в
процессе его работы :) Попробуй банально развернуть MDI окошко (если своего
такого вдруг не завёл, возьми Report Preview) на весь экран и посмотри что
стало с заголовком.
В общем это один из наиболее ограниченных способов - в смысле что
ограничений по его использованию тьма.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33118791
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня несколько специфичный случай. каждое приложение может открываться только в одном экземпляре(т.е. один клиент - одно приложение), БД на sql server
в main'e поставил такую штуку:
LOCAL IsReturn
TRY
OPEN DATABASE uz
IsReturn = .F.
CATCH
IsReturn = .T.
ENDTRY
IF IsReturn
RETURN
ENDIF

Т.е. при повторном открытие проекта возникает ошибка("Доступ к файлу запрещен"), и в этом случае я отсекаю повторный запуск
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33119220
Новоселов Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Igor!

1) Приложение может называться как угодно:
you.exe, my.exe, test1.exe, program2005.exe и т.д.

Следовательно FOX будет регистрировать следующие классы:
'you8c000000', 'my8c000000', 'test18c000000', 'program20058c000000' и т.д.

поэтому, в FindWindow нужно подставить, первым параметром, поиск соответствущего класса (каждый знает имя своего EXE-ника + '8c000000').

2) по Report Preview - не знал. БОЛЬШОЕ СПАСИБО за важное замечание.
Придется как-то решать эту проблему.


Вообще-то склоняюсь зделать запускалку на С++ (есть тому большое число плюсов)
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33119272
Новоселов Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FindWindow('имя класса', NULL ) не подходит, т.к. к этому моменту главное окно приложения уже создано,
поэтому такой поиск возможен только из другой программы.

И тогда, по барабану какой заголовок у окна, поиск работает как часы.
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33119297
Yura .
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совершенно верно. Я уже много лет использую стартер, причем последний вариант написан именно на CPP. Для контроля повторного запуска использую вариант с Mutex.
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33120737
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Олег!

Ну уже лучше :)
Но писать лоадер на C мне кажется совершенно не нужно. Лоадер замечательно пишется на фоксе - и работа с Mutex и поиск "предыдущего экземпляра" всё это сравнительно простые операции. Более того данный код неоднократно публиковался и тут и на forum.foxclub.ru - достаточно поискать скажем по слову "CreateMutex".

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33121176
Yura .
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, стартер можно написать на чем угодно. В свое время у меня были варианты на бейсике, на паскале, на турбо-паскале по виндовс, на делфи, последний на СРР, многофункциональный.
Первые бейсиковские варианты тогда умели различать среду DOS или Win95 (Win98). Это нужно было для того, что-бы если DOS, то загрузить сначала Win3.11, и сразу в нем на выполнение программу на FPW2.6.
Последний стартует не только фоксовую программу, но и еще ряд чего другого, смотря что лежит рядом, умеет перед запуском обновить екзешник приложения, кроме того он-же у меня работает на автозапуске с компашек, поэтому в данном случае СРР оправдан.
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33121682
Новоселов Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Igor, Yura !

Попробовал Mutex, действительно короче, проще и кажется быстрее.

Только для разворота свернутого окна пришлось

Код: 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.
TCHAR mybuf1[MAX_LOADSTRING];
TCHAR mybuf2[MAX_LOADSTRING];

HWND pWndFind;
if (pWndFind = FindWindow(myRegisterClass,NULL)) 
{	
   while (pWndFind=GetNextWindow(pWndFind, GW_HWNDNEXT) )
   {	
      GetClassName(pWndFind,mybuf1,MAX_LOADSTRING);
      if ( strcmp(mybuf1, myRegisterClass)== 0  )
      {
            GetWindowText(pWndFind, mybuf2, MAX_LOADSTRING);

            if ( strlen(mybuf2)> 0  )
                  break;
      }
   }

   GetLastActivePopup(pWndFind);
   if ( IsIconic(pWndFind) )
      ShowWindow(pWndFind,SW_RESTORE);

   SetForegroundWindow(pWndFind);

   InvalidateRect( 0 ,  0 , TRUE);

   return FALSE;
}
раскрывает свернутое приложение при любом изменении заголовка главного окна.

Заинтересовало: "умеет перед запуском обновить екзешник приложения"
(уже воплотил в жизнь :) через текстовый *.INI файл, чтобы работать с любой фоксовой прогой)

Спасибо всем за отличные идеи!
...
Рейтинг: 0 / 0
Повторное открытие приложения
    #33121979
Yura .
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для обновления экзешника приложения я использовал очень простой вариант:
Если рядом с MyProg.exe лежит MyProg.new, то это и есть сигнал для стартера, что-бы заменить старый екзешник на новый, в свою очередь само приложение так-же проверяет наличие стартера.new, и если есть, обновляет его.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Повторное открытие приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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