Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Передать фокус своему приложению - просветите как!


Автор: Evgen_F 29.7.2008, 15:11
У меня приложение, которое работает в фоновом режиме, то есть сидит себе в трее и делает что-то, в то время как пользователь работает с другими программами.

В определённый момент это приложение должно выдать сообщение пользователю, что произошло какое-то событие. В этот момент соответственно оно должно перевести фокус на себя и оказаться на виду у пользователя, независимо от того с каким приложением он до этого работал. (Хотя может можно выдать окошко с текстом сообщения на вид пользователю и не активировав само приложение? Незнаю)

Так, когда программулина свёрнута в трей, её легко удаётся активировать
Код

MainForm.Show ;
MainForm.Activate;


Однако возникла проблема с тем, когда программа не свёрнута в трей, а просто висит на рабочем столе не активная (например пользователь попользовался а потом не свернул, а так и оставил как есть и перешёл работать с другим приложением).
Мне никак не удаётся в этом случае передать ей фокус (сделать окно приложения активным) и выкинуть на передний план перед пользователю.
Пробовал следующие весчи:
Код

            SetForegroundWindow(MainForm.Handle);
            ShowWindow(MainForm.Handle, SW_SHOWNORMAL);            
            MainForm.FormStyle:=fsStayOnTop;
            MainForm.Show;
            MainForm.Activate;  

Но мне так и не удалось заставить её остаться на виду у пользователя  smile   Она всегда оказывается скрыта окнами других приложений, хотя её кнопка на панели задачь и мигает (мне толка никакого от того, что она мигает).

Не подскажет кто нибудь, что делают приведенные мной функции и где про них можно посмотреть?
Как вобще передаёюся фокус между приложениями в винде и всегда ли они при этом переходят на передний план??
Подскажите, как лучше сделать-то?

Автор: CodeMonkey 29.7.2008, 15:22
А вы знаете, что мигание кнопки на панели задач вместо активации и фокусирования формы было введено Microsoft специально для защиты пользователя от программ, которые считают, что уж их-то сообщение пользователь просто обязан прочитать?

Автор: Evgen_F 29.7.2008, 15:33
Я об этом догадывался.

Но что мне делать-то? Мне это мигание ни к селу, ни к городу. Мне нужно чтоб пользователь видел СООБЩЕНИЕ!!
Как быть-то

Автор: CodeMonkey 29.7.2008, 16:58
Пользователь увидит мигающую кнопку вашего приложения в трее и поймёт, что вы хотите показать сообщение.
Так и должно быть. Нехорошо воровать фокус у других приложений. 
Вы поймите, вот вы хотите всенепременно показывать своё сообщение. А конечный пользователь хочет, чтобы ничто его не отвлекало от работы. 
А как насчёт такого сценария: я выбираю пункт из большого меню с кучей пунктов. Или: я пишу текст, не глядя в монитор. И тут появляется ваше окно. Моё меню пропадает, текст тоже (я пытаюсь ввести его в ваше окно). Ну. Будете вы в аду гореть за такие неприятности или нет? smile

Если же вы хотите сделать что-то вроде фоновых всплывающих сообщений - можно посмотреть в сторону Balloon hints (взял первые попавшиеся ссылки):
http://www.swissdelphicenter.ch/torry/showcode.php?id=1164
http://www.delphi.int.ru/articles/8/ 
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=59132

или поискать готовое решение в виде компонента (кстати, нет ли его у компонента, который вы используете для иконки в трее?).

Или же можно показывать форму, но не тырить фокус:
http://www.delphimaster.ru/cgi-bin/forum.pl?n=5&id=1213084981
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=26130
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=23604
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=56717

Автор: Evgen_F 29.7.2008, 21:09
Цитата

Вы поймите, вот вы хотите всенепременно показывать своё сообщение. А конечный пользователь хочет, чтобы ничто его не отвлекало от работы. 
А как насчёт такого сценария: я выбираю пункт из большого меню с кучей пунктов. Или: я пишу текст, не глядя в монитор. И тут появляется ваше окно. Моё меню пропадает, текст тоже (я пытаюсь ввести его в ваше окно). Ну. Будете вы в аду гореть за такие неприятности или нет?


Я всё же не соглашусь с вами, несмотртя даже на весомые приведённые примеры.
Дело в том, что пользователь сознательно запустил и использует мою программу, а значит готов мириться с неожиданной передачей фокуса моему приложению. И даже наоборот - значит ему именно это и необходимо!
Если же он выполняет работу с другими приложениями, при которой ему ничто не должно мешать - он может просто выключить (не включать) мою программу, или просто выключить в ней функцию выдачи окошка с сообщением, оставив допустим только звуковой сигнал. 

Так что уж пускай конечный пользователь сам выбирает что ему надо - спокойная работа без отвлечений или стопроцентное оповещение о наступившем событии. А тут получается я средсвами виндовс уже на этапе программирования ограничен. Лажа, ничего не скажешь   smile 

За советы спасибо, всё посмотрю, проанализирую

Автор: Poseidon 30.7.2008, 10:28
А что за сообщение-то? Можно, как вариант, использовать MessageBox с параметром MB_SYSTEMMODAL

Автор: CodeMonkey 30.7.2008, 11:46
P.S. 
Для желающих дальнейшего развития темы, я бы порекомендовал почитать:
http://blogs.msdn.com/oldnewthing/archive/2006/11/01/922449.aspx (в основном о всплывающих сообщениях)
http://blogs.msdn.com/oldnewthing/archive/2006/12/19/1325024.aspx
http://blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx
http://blogs.msdn.com/oldnewthing/archive/2003/10/14/55287.aspx
http://blogs.msdn.com/oldnewthing/archive/2006/02/16/533250.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)