Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.02;
Скачать: CL | DM;

Вниз

Как показать окно первого экземпляра из второго?   Найти похожие ветки 

 
Svetlika ©   (2006-03-29 12:41) [0]

Я, может, чего-то недопонимаю..
Нужно: запущенным может быть только один экземпляр программы; если запускается второй, то он просто открывает (распахивает, показывает) на экране форму первого экзмепляра и уничтожается.
Ограничение на запуск сделала (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 крайне плохо знакома, может, я чего-то не дописала?


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


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


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


 
Svetlika ©   (2006-03-29 13:29) [2]

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


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

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

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


 
Svetlika ©   (2006-03-29 17:03) [4]

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


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

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


 
ANB ©   (2006-03-29 17:33) [6]


> BringWindowToTop

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


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

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

SetForegroundWindow(FHWND);

после

ShowWindow(FHWND,SW_SHOWNA);

:-)

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

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


 
Svetlika ©   (2006-03-29 18:18) [8]

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

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


 
IceBeerg ©   (2006-03-29 18:35) [9]

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


 
Svetlika ©   (2006-03-30 14:24) [10]

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

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


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



Страницы: 1 вся ветка

Текущий архив: 2006.07.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
2-1150207607
Тимофей Юрьевич
2006-06-13 18:06
2006.07.02
ошибка


15-1149356382
lookin
2006-06-03 21:39
2006.07.02
В Скайп поговорить никто не желает?


2-1149952843
ArchValentin
2006-06-10 19:20
2006.07.02
Иконки в ЕХЕшниках


2-1150386453
тт
2006-06-15 19:47
2006.07.02
Как запустить агента? ( Джина )


1-1148220536
Userrrr
2006-05-21 18:08
2006.07.02
Скачать файл...???