| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Передать фокус своему приложению - просветите как! |
| Автор: Evgen_F 29.7.2008, 15:11 | ||||
| У меня приложение, которое работает в фоновом режиме, то есть сидит себе в трее и делает что-то, в то время как пользователь работает с другими программами. В определённый момент это приложение должно выдать сообщение пользователю, что произошло какое-то событие. В этот момент соответственно оно должно перевести фокус на себя и оказаться на виду у пользователя, независимо от того с каким приложением он до этого работал. (Хотя может можно выдать окошко с текстом сообщения на вид пользователю и не активировав само приложение? Незнаю) Так, когда программулина свёрнута в трей, её легко удаётся активировать
Однако возникла проблема с тем, когда программа не свёрнута в трей, а просто висит на рабочем столе не активная (например пользователь попользовался а потом не свернул, а так и оставил как есть и перешёл работать с другим приложением). Мне никак не удаётся в этом случае передать ей фокус (сделать окно приложения активным) и выкинуть на передний план перед пользователю. Пробовал следующие весчи:
Но мне так и не удалось заставить её остаться на виду у пользователя Не подскажет кто нибудь, что делают приведенные мной функции и где про них можно посмотреть? Как вобще передаёюся фокус между приложениями в винде и всегда ли они при этом переходят на передний план?? Подскажите, как лучше сделать-то? |
| Автор: CodeMonkey 29.7.2008, 15:22 |
| А вы знаете, что мигание кнопки на панели задач вместо активации и фокусирования формы было введено Microsoft специально для защиты пользователя от программ, которые считают, что уж их-то сообщение пользователь просто обязан прочитать? |
| Автор: Evgen_F 29.7.2008, 15:33 |
| Я об этом догадывался. Но что мне делать-то? Мне это мигание ни к селу, ни к городу. Мне нужно чтоб пользователь видел СООБЩЕНИЕ!! Как быть-то |
| Автор: CodeMonkey 29.7.2008, 16:58 |
| Пользователь увидит мигающую кнопку вашего приложения в трее и поймёт, что вы хотите показать сообщение. Так и должно быть. Нехорошо воровать фокус у других приложений. Вы поймите, вот вы хотите всенепременно показывать своё сообщение. А конечный пользователь хочет, чтобы ничто его не отвлекало от работы. А как насчёт такого сценария: я выбираю пункт из большого меню с кучей пунктов. Или: я пишу текст, не глядя в монитор. И тут появляется ваше окно. Моё меню пропадает, текст тоже (я пытаюсь ввести его в ваше окно). Ну. Будете вы в аду гореть за такие неприятности или нет? Если же вы хотите сделать что-то вроде фоновых всплывающих сообщений - можно посмотреть в сторону 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 | ||
Я всё же не соглашусь с вами, несмотртя даже на весомые приведённые примеры. Дело в том, что пользователь сознательно запустил и использует мою программу, а значит готов мириться с неожиданной передачей фокуса моему приложению. И даже наоборот - значит ему именно это и необходимо! Если же он выполняет работу с другими приложениями, при которой ему ничто не должно мешать - он может просто выключить (не включать) мою программу, или просто выключить в ней функцию выдачи окошка с сообщением, оставив допустим только звуковой сигнал. Так что уж пускай конечный пользователь сам выбирает что ему надо - спокойная работа без отвлечений или стопроцентное оповещение о наступившем событии. А тут получается я средсвами виндовс уже на этапе программирования ограничен. Лажа, ничего не скажешь За советы спасибо, всё посмотрю, проанализирую |
| Автор: 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 |