:: Visual Foxpro, Foxpro for DOS
Как из FoxPro развернуть приложение свернутое в системный трей
ZenTigra
Автор

Сообщений: 500
Дата регистрации: 03.12.2004
Задача била в необходимости предотвращения повторного запуск программы, которая висит в systray,
С ней я справился, все работает.

Но для пользователя не удобно, он жмет на ярлык, программа ругается и закрывается... и все, нужно еще нажать на значок в systray-е.

Вот теперь ломаю голову, как активировать свернутую программу?
Ratings: 0 negative/0 positive
Re: Как из FoxPro развернуть приложение свернутое в системный трей
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Выдрал, даже не помню что где)
GW_OWNER = 4
GW_HWNDFIRST = 0
GW_HWNDNEXT = 2
SW_RESTORE = 9
DECLARE INTEGER SetForegroundWindow IN win32api LONG lnhWnd
DECLARE INTEGER GetWindowText IN win32api INTEGER, STRING, INTEGER
DECLARE INTEGER GetWindow IN win32api INTEGER,INTEGER
DECLARE INTEGER GetActiveWindow IN win32api
DECLARE INTEGER IsIconic IN win32api INTEGER
DECLARE INTEGER ShowWindow IN WIN32API INTEGER, INTEGER
Declare Integer GetPrivateProfileString In Win32API As GetPrivStr ;
String cSection, ; && Имя раздела
String cKey, ; && Имя реквизита
String cDefault, ; && Значение по умолчанию, если нет указанного раздела или реквизита
String @cBuffer, ; && Собственно считанное значение реквизита
Integer nBufferSize, ; && Максимальное количество символов в считанном реквизите
String posfile && имя ini-файла с полным путем доступа
... всякий код, определяю запущено ли
*Окно свернуто в трей?
IF IsIconic(hwndn) > 0
ShowWindow(hwndn,SW_RESTORE)
ENDIF
=SetForegroundWindow(hwndn)
Ratings: 0 negative/0 positive
Re: Как из FoxPro развернуть приложение свернутое в системный трей
Alsim

Сообщений: 3627
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
ZenTigra
Вот теперь ломаю голову, как активировать свернутую программу?
Закрепить ярлык "на панели задач" + конечно отвергать повторный запуск.
На Win7 и Win10 работает.
Аспид
Выдрал, даже не помню что где)
спасибо, попробую
Ratings: 0 negative/0 positive
Re: Как из FoxPro развернуть приложение свернутое в системный трей
Ydin

Сообщений: 7639
Откуда: Киев
Дата регистрации: 16.12.2005
У меня это есть. Но написать тут не легко. Попытаюсь
Цитата:
FUNCTION FindInstance
LPARAMETERS lcMagicWord, llStayVisible
*:********************************************************************
* Поиск копии программы, и если она работает то переключаемся на нее
*:********************************************************************

IF _VFP.STARTMODE=0 OR (TYPE('glMultiple')='L' AND glMultiple)
RETURN .F.
ENDIF

#DEFINE GWL_USERDATA (-21)

DECLARE INTEGER CreateMutex IN Win32Api INTEGER, INTEGER, STRING
DECLARE INTEGER ReleaseMutex IN Win32Api INTEGER
DECLARE INTEGER CloseHandle IN Win32Api INTEGER

DECLARE LONG GetWindowLong IN Win32Api INTEGER, INTEGER
DECLARE LONG SetWindowLong IN Win32Api INTEGER, INTEGER, LONG
DECLARE INTEGER GetLastError IN Win32Api

DECLARE INTEGER GetTopWindow IN Win32Api INTEGER
DECLARE INTEGER GetWindow IN Win32Api INTEGER, INTEGER
DECLARE INTEGER SetForegroundWindow IN Win32Api INTEGER
DECLARE INTEGER ShowWindow IN Win32Api INTEGER, INTEGER

LOCAL lcMutex, hMutex, HWND, ret

m.ret=.F. && Вернем
m.lcMutex="My.Mutex.0001"
m.hMutex=CreateMutex(0,0,m.lcMutex)
* Если Mutex уже создан
IF GetLastError()=183 && Уже есть
IF m.llStayVisible
RETURN .T.
ENDIF
CloseHandle(m.hMutex) && Закроем Handle

m.HWND=GetTopWindow(0) && Верхнее окно
DO WHILE m.HWND # 0
m.HWND=GetWindow(m.HWND,2) && Следующее окно
IF m.HWND # 0 && Есть m.hWnd
IF GetWindowLong(m.HWND,GWL_USERDATA)=m.lcMagicWord && Это имя моего директория
SetForegroundWindow(m.HWND) && Переместим его под граза юзера
SHOWWINDOW(m.HWND,3) && И распахнем пошире
RETURN .T.
ENDIF
ENDIF
ENDDO
ENDIF
SetWindowLong(_VFP.HWND,GWL_USERDATA,m.lcMagicWord) && Пишем в окно имя директория
ReleaseMutex(m.hMutex) && Mutex умрет с процессом
RETURN m.ret

Это ключевая ф-я, она работает. Но лет 20 назад написана и не помню деталей

Теперь, где она вызывается. На старте запуска
lcMagicWord=CURDIR()
IF RIGHT(lcMagicWord,1)='\'
lcMagicWord = LEFT(lcMagicWord,LEN(lcMagicWord)-1)
ENDIF
...

lnPos=RAT('\',lcMagicWord)
IF lnPos>0
lcMagicWord=SUBSTR(lcMagicWord,lnPos+1)
ENDIF
lcMagicWord=StrToLong(CHRTRAN(lcMagicWord,'\',''))


llQuit=.F.

DO CASE
CASE lnInstances='0'
llQuit= FindInstance(lcMagicWord)
CASE lnInstances='1' AND FindInstance(lcMagicWord,.T.)
lcMess = 'Запустить еще один экземпляр приложения?'
llQuit = warn(lcMess,,30,2,2)=2 && Это вопрос 1-да, 2-нет
IF llQuit = .T.
=FindInstance(lcMagicWord)
ENDIF
ENDCASE

Чувствую, что может не понятно...
У меня на запуске приложения (Exe) может передаваться параметр (или не передаваться и тогда он "0")
Это сколько экземпляров допустимо

Сейчас устал. Попробуйте, но это у меня работает лет 20.
Сложно тут, я кусками вытаскивал
Ratings: 0 negative/0 positive
Re: Как из FoxPro развернуть приложение свернутое в системный трей
Каратаев

Сообщений: 3914
Откуда: Алматы
Дата регистрации: 04.12.2001
На уровне класса реализовано так:
*********** Определение запущена ли программа
#Define SW_RESTORE 9
Declare integer ShowWindow in user32 integer hWnd, integer nCmdShow
*HWnd=Is_run32(tcAppName)
HWnd = This.Isrun(tcAppName)
If hwnd != 0
_screen.Visible = .T.
_screen.FontName = "Arial"
_screen.FontSize = 10
_screen.Windowstate = 2
_screen.Icon = 'prod.ico'
_screen.BackColor = RGB(34,139,34)
_screen.Caption='Продажи - повторный запуск'
hide menu _msysmenu
LOCAL lcMsg, lnPictBtn, lcPict, lnOtvet
m.lcMsg = "Программа {Bold,Color=Red Size=+3} УЖЕ ЗАПУЩЕНА {} на этом компьютере." + CHR(13);
+ "В некоторых случаях бывает удобно работать одновременно с несколькими копиями..." + CHR(13) ;
+ "{Color=Red,Size=+3} ВАЖНО!{} " + CHR(13) ;
+ "{Color=Blue,Italic,Size=+3} Потом не забыть закрыть все работающие копии программы!{} " + CHR(13) ;
+ "{Bold}Открыть ранее запущенный экземпляр программы? {} " + CHR(13);
+ "При выборе [Нет] запустится новый экземпляр программы..."
m.lnPictBtn = 128+4 && Своя картинка + кнопки Да, Нет
m.lcPict = "error_3043.png"
lnOtvet = Msgbox(m.lcMsg, m.lnPictBtn, "ВНИМАНИЕ!", 0, m.lcPict)
_screen.Visible = .F.
IF lnOtvet <> 7
= ShowWindow(hwnd, SW_RESTORE) && Разворачиваем, активизируем ранее запущеную instance приложения
CLEAR DLLS
This.netcomp = SYS(2015)
RETURN .F. && Новое instance завершаем
ENDIF
Endif
CLEAR DLLS
RELEASE hwnd
RETURN .T.

Метод класса Isrun
LPARAMETER tcTitleApplication
LOCAL lnhwnd,nhwnd
DECLARE INTEGER GetWindowText IN Win32API ;
INTEGER hwnd, STRING @lptstr, INTEGER
m.tcTitleApplication=UPPER(m.tcTitleApplication)
lnhwnd = 0
FOR nhwnd=1 TO 9000
lptstr=SPAC(200)+CHR(0)
=GetWindowText(nhwnd,@lptstr,LEN(lptstr))
IF m.tcTitleApplication $ upper(lptstr)
lnhwnd = nhwnd
EXIT
ENDIF
NEXT
RETURN lnhwnd


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Как из FoxPro развернуть приложение свернутое в системный трей
ZenTigra
Автор

Сообщений: 500
Дата регистрации: 03.12.2004
Этой теме уже больше 4 лети, тогда я не смог решить эту проблему,
я вновь к ней вернулся, помогите, пожалуйста, никак не могу ее решить.

Уже реализовано, запрет на повторный запуск программы, и активация уже запущенной программы, которая висит в системной трее,
Окно активируеться, но оно прозрачное, контролы прорисовываються только при попадании в них курсора.
Когда окно свернутое, все окей, програма активирується, из системного трея - нет, возможно из-за того, что при сворачивании я ставлю _Screen.Visible=.F.

S_caption="Наименование моей программы в заголовке"
*****************************************************************************************************************************************************
*****************************************************************************************************************************************************
*****************************************************************************************************************************************************
lcProcName='e-mail.exe' &&имя exe-шника
&&Ищу, его в запущенных программах
Declare Integer CreateToolhelp32Snapshot In Win32api Integer dwFlags, Integer th32ProcessID
Declare Integer Process32First In Win32api Integer lhSnapshot, String lppe
Declare Integer Process32Next In Win32api Integer lhSnapshot, String lppe
Declare Integer CloseHandle In kernel32 Integer hObject
Local lnRetCode, lppe, lhSnapshot, lnInstanceCnt
lnInstanceCnt = 0
lcProcName = Upper(lcProcName)
lppe = Chr(44) + Chr(1) + Replicate(Chr(0), 298)
lhSnapshot = CreateToolhelp32Snapshot(2, 0)
lnRetCode = Process32First(lhSnapshot, @lppe)
DO WHILE lnRetCode <> 0
IF lcProcName $ Upper(Substr(lppe, 37, 256))
lnInstanceCnt = lnInstanceCnt + 1
ENDIF
lnRetCode = Process32Next(lhSnapshot, @lppe)
ENDDO
IF lnInstanceCnt>1 &&Программа обнаружена
DECLARE INTEGER FindWindow IN Win32Api STRING lpClassName, STRING lpWindowName
lnHWnd = FindWindow(NULL, S_caption)
IF lnHWnd>0
DECLARE INTEGER ShowWindow IN WIN32API INTEGER, INTEGER
ShowWindow(lnHWnd,9)
QUIT
ELSE
WAIT WINDOWS 'Программа уже запущена' TIMEOUT 1
QUIT
ENDIF
ENDIF
Ratings: 0 negative/1 positive
Re: Как из FoxPro развернуть приложение свернутое в системный трей
ZenTigra
Автор

Сообщений: 500
Дата регистрации: 03.12.2004
Понял в чем проблема, необходимо в приложении запустить
THISFORM.Paint
- но вот как это сделать...



Исправлено 1 раз(а). Последнее : ZenTigra, 01.03.23 17:07
Ratings: 0 negative/0 positive
Re: Как из FoxPro развернуть приложение свернутое в системный трей
_vit

Сообщений: 5116
Дата регистрации: 29.07.2002
ZenTigra
Окно активируеться, но оно прозрачное, контролы прорисовываються только при попадании в них курсора.
Когда окно свернутое, все окей, програма активирується, из системного трея - нет, возможно из-за того, что при сворачивании я ставлю _Screen.Visible=.F.


Попробуй послать окну WM_SYSCOMMAND, SC_RESTORE

DECLARE Long SendMessage IN WIN32API Long HWND, Long wMsg, Long wParam, Long Lparam
#define WM_SYSCOMMAND 0x0112
#DEFINE SC_RESTORE 0xF120
#DEFINE SC_MAXIMIZE 0xF030
#DEFINE SC_MINIMIZE 0xF020
...
IF lnInstanceCnt>1 &&Программа обнаружена
DECLARE INTEGER FindWindow IN Win32Api STRING lpClassName, STRING lpWindowName
lnHWnd = FindWindow(NULL, S_caption)
IF lnHWnd>0
DECLARE INTEGER ShowWindow IN WIN32API INTEGER, INTEGER
ShowWindow(lnHWnd,9)
= SendMessage(lnHWnd, WM_SYSCOMMAND, SC_RESTORE, 0x0) && или SC_MAXIMIZE
QUIT
ELSE
WAIT WINDOWS 'Программа уже запущена' TIMEOUT 1
QUIT
ENDIF
ENDIF



Исправлено 1 раз(а). Последнее : _vit, 05.03.23 11:17
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 19 DmitryKn  (Гостей: 18)

© 2000-2023 Fox Club 
Яндекс.Метрика