C # Прикрепление к краю рабочего стола, всплывающая проблема - PullRequest
1 голос
/ 21 января 2011

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

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

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

Ответы [ 2 ]

0 голосов
/ 29 января 2011

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

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

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

0 голосов
/ 21 января 2011

Я пытался сделать похожий проект, используя класс 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        

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

...