Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как показать окно первого экземпляра из второго? [D7, WinXP]


Svetlika ©   (2006-03-29 12:41:00) 

Я, может, чего-то недопонимаю..
Нужно: запущенным может быть только один экземпляр программы; если запускается второй, то он просто открывает (распахивает, показывает) на экране форму первого экзмепляра и уничтожается.
Ограничение на запуск сделала (copy-paste :-)), как вот в этой статье: http://www.politics.delphimaster.ru/articles/limit.html(способ с OneHinst модулем).
Поменяла только процедуру вывода сообщения об ошибке на вот такую:

procedure ShowErrMsg;
var
 FHWND : HWND;
begin
 FHWND := FindWindow(nil,'my program');
 SendMessage(FHWND,WM_SETTEXT,0,lParam(LPCTSTR('anything')));
 ShowWindow(FHWND,SW_SHOWNA);
end;


Заголовок первого экземпляра меняется, а форма на экране не показывается. Пробовала разные константы в ShowWindow, когда я разворачиваю после попытки запуски второго экзмепляра первый, видно, что что-то с ним происходило, но, по какой-то причине не отрисовывается.

Я вообще с API крайне плохо знакома, может, я чего-то не дописала?


Svetlika   (2006-03-30 14:24:00) [1]

Подсказали верный способ :-)

SetForegroundWindow(FHWND);
ShowWindow(getWindow(FHWND, GW_OWNER),SW_SHOW);


Все работает нормально, и свернуть окно потом можно (проблема в [8]), и окно выскакивает поверх всех окон. :-)


IceBeerg   (2006-03-29 18:35:00) [2]

Как вариант отправлять первому экземпляру сообщение типа wm_user+xx и пусть этот экзампляр перехватывает соббщения и когда получит его сам себя разворачивает  и т.п. ( Application.RestoreTopMosts;<- кусок примера)


Svetlika   (2006-03-29 18:18:00) [3]

ANB, ага, не работает :-)

Теперь у меня другая проблема. Если я первый экземпляр сверну, то после запуска второго я его свернуть просто так не могу (нажав на "_" в заголовке окна, где три известные кнопки). Потому что он (1-й экземпляр) находится в заблуждении, что свернут. А на самом деле открыт.
Если правой кнопкой щелкнуть по этому окну на панели задач, и выбрать "Восстановить", то потом его свернуть можно.
Теперь вот ищу, как бы это восстановление провернуть программно...


ANB   (2006-03-29 17:33:00) [4]


> BringWindowToTop

Не работает в WinXP.


Svetlika   (2006-03-29 17:33:00) [5]

fellix, я кажется писала, что чайник в WinAPI? :-) Алгоритм-то у меня работает, не хватает только одной штуки... вот такой:

SetForegroundWindow(FHWND);

после

ShowWindow(FHWND,SW_SHOWNA);

:-)

Про вариант - подумала, что это относилось к [1]. Поэтому и удивилась, вдруг чего не заметила...

Большое спасибо за попытку помочь.


fellix   (2006-03-29 17:09:00) [6]

А что же еще надо видеть? В [3] приведен алгоритм.
--------------
BringWindowToTop


Svetlika   (2006-03-29 17:03:00) [7]

fellix, чтобы искать разницу, надо хотя бы видеть ваш вариант. Это во-первых.
Во-вторых, я, кажется, поняла что не так.
Форма показывается, просто она перекрывается другими окнами, которые открыты на экране. Соответственно, нужно послать сообщение, чтобы она показалась поверх всех окон. Буду теперь искать, как называется это сообщение.


fellix   (2006-03-29 13:58:00) [8]

Просто предлагаю вариант. Мой работает - Ваш нет. Ищите разницу. :-)

Первый экземпляр стартует. Заголовок окна "ххх". Ищет окно с заголовком "ууу", не находит и меняет свой заголовок на "ууу".
Второй экземпляр стартует. Заголовок окна "ххх". Ищет окно с заголовком "ууу", находит, посылает ему сообщение "WM_zzz" и завершает свою работу.
Первый экземпляр получает сообщение "WM_zzz" и делает, что нужно (например, открывает своё окно).


Svetlika   (2006-03-29 13:29:00) [9]

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


fellix   (2006-03-29 13:22:00) [10]


> Svetlika ©   (29.03.06 12:41)  
> Нужно: ...  если запускается второй, то он просто открывает ... форму первого экзмепляра и уничтожается.


Один из возможных вариантов.
Второй экземпляр находит окно первого, посылает ему "юзеровское" сообщение и закрывается. Первый экземпляр, получив сообщение, "раскрывается".


Наверх

Титульная страница Поиск, карта сайта Написать письмо