Главная страница
    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.009 c
2-1150270186
novill
2006-06-14 11:29
2006.07.02
Надо написать прогу в виде службы Windows. С чего начать?


15-1149551726
Nevilon
2006-06-06 03:55
2006.07.02
Потестите, плиз, прогу


15-1149684949
Elen
2006-06-07 16:55
2006.07.02
pdf в doc


2-1149843241
VitV
2006-06-09 12:54
2006.07.02
Подсчёт количества строк в DBLookupListBox


2-1150395605
Naduev Aleksei
2006-06-15 22:20
2006.07.02
TDUMP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский