Главная страница
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.032 c
2-1150270626
Olleg_ator
2006-06-14 11:37
2006.07.02
Исправить структуру dbf таблицы


15-1149672449
Карелин Артем
2006-06-07 13:27
2006.07.02
Полный перенос дельфи 7 с одного компа на другой.Что посоветуете?


15-1149587106
tButton
2006-06-06 13:45
2006.07.02
странно... не смог найти ветку про то чья луна


1-1147812521
ychenick
2006-05-17 00:48
2006.07.02
Папки как файлы ( отображение как zip архив)


15-1149657032
Ega23
2006-06-07 09:10
2006.07.02
С Днём рождения! 7 июня