Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
2-1150214511
AlexanderMS
2006-06-13 20:01
2006.07.02
БД. Переход на строку с помощью колёсика мыши.


2-1148205577
mefodiy
2006-05-21 13:59
2006.07.02
Вывод знаков псевдографики в RichEdit


15-1149329379
DirectX
2006-06-03 14:09
2006.07.02
последний на сегодня directX


15-1147255423
Колдун
2006-05-10 14:03
2006.07.02
Написание многопотчной качалки


1-1148291576
Steplerr
2006-05-22 13:52
2006.07.02
Эффективный поиск в Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский