![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здрасвтуйте. Подскажите пожалуйста как сделать фичу по сабжу?
написал прогу которая скрыта,то есть ни в трее ни внизу на панели задач,ни формы не видно. и нужно сделать так,чтоб при втором нажатии на ехе файл не вторая копия запускалась, а старая видимой стала. проблема в том что поиском гугла нахожу тока варианты как найти по заголовку окна,но так как окно скрыто то всякие функции возвращают нулевой результат. може можно както поиск хендла скрытого окна сделать? Часть заголовка окна извесна.часть меняется,цифры там. Существование копии проверяю таким кодом в файле проекта dpr, но незнаю как ухватить хендл,чтоб послать ему команду ShowWindow(<хендл>,SW_SHOWNORMAL); Код:
begin CreateMutex(nil, True, PChar('MiniServ'));//проверяем запуск копии проги if GetLastError = ERROR_ALREADY_EXISTS then //если запущена if Application.MessageBox('Программа уже запущена!'#13'Продолжить запуск еще одного экземпляра программы?', 'Внимание!',1)=2 then begin /* здесь по идее надо узнать хендл уже запущенной копии,и послать команду ShowWindow(<хендл>,SW_SHOWNORMAL); */ Halt;//если нет - прибиваем данный процесс запуска end; Application.Initialize; Application.Title:='MiniServ'; if ParamCount>0 then if (ParamStr(1)='/s')or(ParamStr(1)='-s') then Application.ShowMainForm:= False; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm4, Form4); Application.HintHidePause:=10240; Application.Run; end. |
#2
|
||||
|
||||
![]() не важно скрыто окно или нет, FindWindow/EnumWindows найдет его.
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
![]() насколько я понял, findwindow ищет по точному имени окна
например Код:
if FindWindow(nil, 'Безымянный - Блокнот') <> 0 then ShowMessage('Окно найдено') else ShowMessage('Окно НЕнайдено'); EnumWindows взял отсюда. не работает даже на не скрытых окнах,незнаю почему http://www.delphisources.ru/pages/fa...tivate_it.html Последний раз редактировалось Snake22, 23.05.2012 в 02:08. |
#4
|
||||
|
||||
![]() Кто мешает искать по классу?
Код:
if FindWindow('Notepad', NIL) <> 0 then ... Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Snake22 (23.05.2012)
|
#5
|
|||
|
|||
![]() а можно тогда вопрос не по теме,
как мне изменить класс своего проекта? а то там по дефольту TForm1 получается, и вдруг будет несколько прог запущенных,написанных на дельфи |
#6
|
||||
|
||||
![]() Измени с Form1, на любое понравившееся.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Snake22 (23.05.2012)
|
#7
|
|||
|
|||
![]() ой,извиняюсь за нубство) действительно тупо сменить Name формы.
|
#8
|
|||
|
|||
![]() еще такой вопрос.
нахожу вот я окно и посылаю ему команду ShowWindow(h,SW_RESTORE); окно восстанавливается,а как теперь в этой проге сделать обработку сообщения SW_RESTORE ,мне там после восстановления окна кое что нужно сделать |
#9
|
||||
|
||||
![]() Нужно добавить обработчик :
Код:
private { Private declarations } procedure WndProc(var Msg: TMessage); ... procedure TForm1.WndProc(var Msg: TMessage); begin if (Message.Msg = WM_SYSCOMMAND) and (wParam = SC_RESTORE) then ... inherited; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#10
|
|||
|
|||
![]() чтото ругалось на код,подправил немного на это
procedure TfrmMiniServ.WndProc(var Msg: TMessage); begin if (Msg.Msg = WM_SYSCOMMAND) and (Msg.wParam = SC_RESTORE) then ShowMessage('бля'); inherited; end; но не работает,компилится,но ничего не происходит при восстановлении окна |
#11
|
||||
|
||||
![]() компонент TApplicationEvents, вкладка Additional, событие OnRestore.
Пишу программы за еду. __________________ |
#12
|
|||
|
|||
![]() чтото всё равно не работает! =(
и еще изменил команду на ShowWindow(h,SW_SHOW); ( а то при RESTOR'e окно на задний фон уходило) но в Applicationevent'e,на событии Message обработка такой команды всё равно ничего не приносит if Msg.wParam=sw_show then Caption:=TimeToStr(Now); (указал время,так как статичный кепшн не получится заметить) так вот при запуске проги происходит событие показа формы и кепшн меняется, но когда запускаю вторую копию проги,она посылает первой копии команду ShowWindow(h,SW_SHOW);, окно отображается,но обработка евента при этом молчит... может когда команда посылается от другой программы то мессадж другой будет? |
#13
|
||||
|
||||
![]() Пишу программы за еду. __________________ |
#14
|
|||
|
|||
![]() во спасибо,кажется то что надо.
ща проверю на своём проекте |