Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2012, 16:05
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию Отобразить скрытое окно при запуске копии программы

Здрасвтуйте. Подскажите пожалуйста как сделать фичу по сабжу?
написал прогу которая скрыта,то есть ни в трее ни внизу на панели задач,ни формы не видно.
и нужно сделать так,чтоб при втором нажатии на ехе файл не вторая копия запускалась, а старая видимой стала.
проблема в том что поиском гугла нахожу тока варианты как найти по заголовку окна,но так как окно скрыто то всякие функции возвращают нулевой результат.
може можно както поиск хендла скрытого окна сделать?
Часть заголовка окна извесна.часть меняется,цифры там.
Существование копии проверяю таким кодом в файле проекта 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  
Старый 22.05.2012, 16:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

не важно скрыто окно или нет, FindWindow/EnumWindows найдет его.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 23.05.2012, 02:02
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

насколько я понял, 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  
Старый 23.05.2012, 02:08
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Кто мешает искать по классу?
Код:
  if FindWindow('Notepad', NIL) <> 0 then
...
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Snake22 (23.05.2012)
  #5  
Старый 23.05.2012, 02:11
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

а можно тогда вопрос не по теме,
как мне изменить класс своего проекта? а то там по дефольту TForm1 получается, и вдруг будет несколько прог запущенных,написанных на дельфи
Ответить с цитированием
  #6  
Старый 23.05.2012, 02:17
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Измени с Form1, на любое понравившееся.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Snake22 (23.05.2012)
  #7  
Старый 23.05.2012, 02:19
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

ой,извиняюсь за нубство) действительно тупо сменить Name формы.
Ответить с цитированием
  #8  
Старый 23.05.2012, 02:45
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

еще такой вопрос.
нахожу вот я окно и посылаю ему команду
ShowWindow(h,SW_RESTORE);
окно восстанавливается,а как теперь в этой проге сделать обработку сообщения SW_RESTORE ,мне там после восстановления окна кое что нужно сделать
Ответить с цитированием
  #9  
Старый 23.05.2012, 03:13
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Нужно добавить обработчик :
Код:
  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  
Старый 23.05.2012, 03:33
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

чтото ругалось на код,подправил немного на это
procedure TfrmMiniServ.WndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_SYSCOMMAND) and (Msg.wParam = SC_RESTORE) then
ShowMessage('бля');
inherited;
end;
но не работает,компилится,но ничего не происходит при восстановлении окна
Ответить с цитированием
  #11  
Старый 23.05.2012, 08:36
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

компонент TApplicationEvents, вкладка Additional, событие OnRestore.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #12  
Старый 23.05.2012, 10:25
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

чтото всё равно не работает! =(
и еще изменил команду на ShowWindow(h,SW_SHOW); ( а то при RESTOR'e окно на задний фон уходило)
но в Applicationevent'e,на событии Message обработка такой команды всё равно ничего не приносит
if Msg.wParam=sw_show then Caption:=TimeToStr(Now);
(указал время,так как статичный кепшн не получится заметить)
так вот при запуске проги происходит событие показа формы и кепшн меняется, но когда запускаю вторую копию проги,она посылает первой копии команду ShowWindow(h,SW_SHOW);, окно отображается,но обработка евента при этом молчит...
может когда команда посылается от другой программы то мессадж другой будет?
Ответить с цитированием
  #13  
Старый 23.05.2012, 11:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

http://zalil.ru/33291262
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 23.05.2012, 16:42
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

во спасибо,кажется то что надо.
ща проверю на своём проекте
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025