C # Пристыковка к краю рабочего стола, проблема с всплывающими окнами

Я делаю приложение WPF, которое можно прикрепить к одному из краев рабочего стола. Я делаю это с помощью «EdgeWindow», которое представляет собой прозрачное окно шириной 5 пикселей на том же краю экрана, всякий раз, когда мышь перемещается по нему, всплывает окно приложения.

Проблема в том, что хотя для EdgeWindow установлено значение «Самый верхний», другие приложения Windows также устанавливают свое окно на «Самое верхнее», что означает, что EdgeWindow может оказаться под некоторыми окнами. Насколько я могу судить, не существует гарантированного способа удержать EdgeWindow наверху.

Мое приложение уже является ApplicationDesktopToolbar (похоже на http://www.codeproject.com/KB/shell/csdoesshell3.aspx), поэтому я надеялся, что можно каким-то образом использовать эту инфраструктуру, чтобы определить, должно ли окно всплывать, и полностью избавиться от 'EdgeWindow', но я не видел там ничего, что могло бы помочь .


person John    schedule 20.01.2011    source источник


Ответы (2)


Некоторое время я пытался сделать аналогичный проект, используя класс ShAppBar; если вы используете класс ShAppBar, о котором вы говорите, нет необходимости в невидимом самом верхнем окне. Также ссылка на предоставленный вами код, похоже, содержит следующее:

GetAutoHideBar            = 0x00000007,    
// Registers or unregisters an autohide appbar for an edge of 

// the screen. 

SetAutoHideBar            = 0x00000008,    
// Notifies the system when an appbar's position has changed. 

WindowPosChanged          = 0x00000009,    
// Sets the state of the appbar's autohide and always-on-top 

// attributes.

SetState                  = 0x0000000a        

Это не работает?

person Bhavya    schedule 20.01.2011
comment
Нет по сути. Регистрация панели приложений на определенной стороне экрана не вызывает фактического всплывающего окна, она просто информирует Windows о том, что у вас есть приложение для автоматического скрытия на этой стороне экрана. - person John; 21.01.2011
comment
Вместо этого вы можете установить рабочую область экрана на несколько пикселей меньше, чем она есть, чтобы панель вашего приложения всегда была доступна для пользователя. Изменить рабочую область экрана довольно легко с помощью screen.Bounds.Width. - person Bhavya; 24.01.2011
comment
Мой плохой, я имел ввиду screen.WorkingArea. * - person Bhavya; 24.01.2011

Решение, которое я в итоге использовал, заключалось в том, чтобы отслеживать любые изменения положения мыши и открывать окно, если оно приближается к краю. Конечно, обычное прослушивание мыши WPF не будет работать, когда курсор выходит за пределы приложения.

Первоначально я планировал использовать WH_MOUSE_LL, но похоже, что эта функция не работает в Windows 7, поскольку в Windows 7 по какой-то причине время от времени отменяют регистрацию любых подключенных хуков.

В конечном итоге я использовал RawInput (http://www.codeproject.com/KB/system/rawinput.aspx), который работает очень хорошо. В примере показано только, как получить события ввода с клавиатуры, но было несложно изменить его, чтобы вместо этого прослушивать события перемещения мыши.

person John    schedule 29.01.2011
comment
Собираюсь сделать то же самое. Если вы готовы поделиться своим кодом, напишите мне. Сэкономил бы мне несколько часов. Спасибо - person Harry Mexican; 20.02.2012
comment
@HarryMexican Извините, я видел этот комментарий только сегодня. В StackOverflow нет личных сообщений, поэтому я не могу вам написать. Мой адрес электронной почты находится в моем профиле, если вам все еще нужен мой код. - person John; 27.02.2012