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


Автор: Igor_thief 29.4.2007, 19:19
Hello.

Пишу программу в которой надо, чтобы одно окно было всегда активным (не только в приделах приложения, но и в приделах системы) и "летало" за курсором.

Добился этого выполняя следующие действия в таймере:

Код

  MX := Mouse.CursorPos.X;
  MY := Mouse.CursorPos.Y;
  // calculating preview window coord.
  MX1 := MX + 27;
  MY1 := MY - 20;
    SetForegroundWindow(Handle);
    SetWindowPos(Handle, HWND_TOP, MX1, MY1, 66, 102, SWP_SHOWWINDOW);


Вопрос состоит в том, оптимальный ли это способ? Надо ли добавить какие-то проверки для того чтобы не выполнять в каждой итерации операции SetForegroundWindow(Handle);? Есть ли предложения более оптимального подхода?

ПС: нет, я не пишу назойливый вирус; если сильно интерессно зачем это, то сразу скажу - лупа

Автор: anwe 29.4.2007, 20:06
Цитата(Igor_thief @  29.4.2007,  19:19 Найти цитируемый пост)
чтобы не выполнять в каждой итерации операции SetForegroundWindow(Handle);? 

Сделай свое окно HWND_TOPMOST

Автор: Igor_thief 29.4.2007, 20:23
Цитата(anwe @ 29.4.2007,  19:06)
Цитата(Igor_thief @  29.4.2007,  19:19 Найти цитируемый пост)
чтобы не выполнять в каждой итерации операции SetForegroundWindow(Handle);? 

Сделай свое окно HWND_TOPMOST

SetForegroundWindow также передает фокус окну, не просто держит его On TOP!

Автор: ama_kid 3.5.2007, 06:40
Цитата(Igor_thief @  29.4.2007,  19:19 Найти цитируемый пост)
Добился этого выполняя следующие действия в таймере
Такие вещи правильнее делать не в таймере, а отлавливать события мыши с помощью глобального хука http://msdn2.microsoft.com/en-us/library/ms644959.aspx#wh_mouse_llhook

Цитата(Igor_thief @  29.4.2007,  20:23 Найти цитируемый пост)
SetForegroundWindow также передает фокус окну, не просто держит его On TOP!
А зачем тебе передавать постоянно фокус твоему окну? Этим ты отбираешь его у других элементов системы... Имхо, неправильно и "пользователи могут быть недовольны"....

Автор: Yanis 3.5.2007, 06:46
Интересно как это выглядит на экране -- «летающее окно».

Автор: Igor_thief 3.5.2007, 17:03
Цитата(ama_kid @  3.5.2007,  05:40 Найти цитируемый пост)
Цитата(Igor_thief @  29.4.2007,  19:19 Найти цитируемый пост)
Добился этого выполняя следующие действия в таймере
Такие вещи правильнее делать не в таймере, а отлавливать события мыши с помощью глобального хука WH_MOUSE_LL

Дело в том, что была и такая идея. Может потом и переделаю под такой способ. 


Цитата(ama_kid @  3.5.2007,  05:40 Найти цитируемый пост)
Цитата(Igor_thief @  29.4.2007,  20:23 Найти цитируемый пост)
SetForegroundWindow также передает фокус окну, не просто держит его On TOP!
А зачем тебе передавать постоянно фокус твоему окну? Этим ты отбираешь его у других элементов системы... Имхо, неправильно и "пользователи могут быть недовольны".... 

Да, я понимаю. Просто для того чтобы отключить мое окошко достаточно нажать Esc. Вот для того чтобы поймать этот Esc мне и надо чтобы фокус принадлежал моему окну. Хотя, я уже чувствую, что скоро последует совет типа - добавь хук на перехват Esc.

Цитата(Yanis @  3.5.2007,  05:46 Найти цитируемый пост)
Интересно как это выглядит на экране -- «летающее окно».

Ну вы же эксперт! Напрягите воображение. Не верится мне чтобы человек с таким статусом никогда не видел экранную лупу smile .

Ну что ж, судя по ответам, я все сделал оптимально.

Автор: Yanis 3.5.2007, 18:48
Цитата(Igor_thief @  3.5.2007,  18:03 Найти цитируемый пост)
Ну вы же эксперт! Напрягите воображение. Не верится мне чтобы человек с таким статусом никогда не видел экранную лупу  .

Ну просто бысло интересно что за проект пишется smile Экранную лупу я видел)

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