| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > WPF и Silverlight > WPF + WinApi + инициализация |
| Автор: vikaz 13.11.2013, 10:17 |
| Всем привет! Пишу для себя небольшую программу для работы с буфером обмена. (Да,да таких много и я изобретаю велосипед. Но это просто желание узнать что-то новое) Так вот. Есть две главных функциональности: 1) Хук на нажатие определенной комбинации клавиш 2) Хук на изменение данных в буфере обмена. Чтобы реализовать данные вещи, нужно использовать WinApi. В принципе не так страшно. Кода, из которого можно понять как все работает - предостаточно. Но когда я начал писать свое приложение, то столкнулся с одной вещью, о которой и хотел рассказать. Как Вы поняли я использую WPF и все это работает в паре с SimpleMVVM. Странность работы всех функций WinApi заключается в том, что мне их приходится инициализировать в методе Loadded главного окна, иначе функционал по перехвату изменений в буфере обмена, просто перестает работать. Именно по этой причине, мне пришлось создать два singlton'а (HotKey и Clipboard), в которых и описана вся функциональность по перехвату. Почему Singletone? Да потому что мне пришлось разместить инициализацию в методе loaded (передачу Window), а вызов делегата, когда происходит событие в mvvm классе. Но это очень не удобно. Так как я хочу при запуске прятать окно присвоив ему hidden, а из-за этого не срабатывает событие loaded. В общем как-то бред. Я хотел у Вас узнать, кто писал что-то подобное? Как правильно организовать приложение? Что делать с инициализацией? Я создал маленько приложение по перехвату изменений в буфере обмена. http://sdrv.ms/HLVoIT Из этого приложения как раз и видно, в чем проблема. Заранее спасибо. |
| Автор: vikaz 13.11.2013, 12:06 |
| Отвечу сам на свой вопрос. Для того чтобы все это заработало, handle нужно получать через EventDispatchingNativeWindow. Прямой ссылке на это нет, но есть библиотека, которую я нашел на просторах интернета. http://mwinapi.sourceforge.net/ Скачав исходники, я откомпилировал их под .net 4.0. Эта библиотека оказалась для меня просто находкой. В ней много чего есть, но так же есть возможность ставить hook'и и на клавиатуру, и на буфер обмена. Причем инициализировать можно даже в классе App, в событии OnStartup. Круть! |