none
WPF + WinApi + инициализация RRS feed

  • Вопрос

  • Всем добрый вечер!

    Понадобилось мне написать маленькое приложение (Тыц).

    По ссылке описана только часть функционала.

    А если кратко, то пишу для себя небольшую программу для работы с буфером обмена. (Да,да таких много и я изобретаю велосипед. Но это просто желание узнать что-то новое)

    Так вот. Есть две главных функциональности:

    1) Хук на нажатие определенной комбинации клавиш

    2) Хук на изменение данных в буфере обмена.

    Чтобы реализовать данные вещи, нужно использовать WinApi. В принципе не так страшно. Кода, из которого можно понять как все работает - предостаточно. Но когда я начал писать свое приложение, то столкнулся с одной вещью, о которой и хотел рассказать.

    Как Вы поняли я использую WPF и все это работает в паре с SimpleMVVM

    Странность работы всех функций WinApi заключается в том, что мне их приходится инициализировать в методе Loadded главного окна, иначе функционал по перехвату изменений в буфере обмена, просто перестает работать. 

    Именно по этой причине, мне пришлось создать два singlton'а (HotKey и Clipboard), в которых и описана вся функциональность по перехвату. Почему Singletone? Да потому что мне пришлось разместить инициализацию в методе loaded, а вызов делегата, когда происходит событие в mvvm классе.

    Но это очень не удобно. Так как я хочу при запуске прятать окно присвоив ему hidden, а из-за этого не срабатывает событие loaded. В общем как-то бред.

    Я хотел у Вас узнать, кто писал что-то подобное?

    Как правильно организовать приложение?

    Что делать с инициализацией?

    Ну и вот три ссылки на файлы проекта:

    WinApi

    HotKey

    Clipboard

    Если не сложно, подскажите. Возможно где-то, что-то неправильно.

    Заранее спасибо

    12 ноября 2013 г. 15:05

Ответы

  • Отвечу сам на свой вопрос.

    Для того чтобы все это заработало, handle нужно получать через EventDispatchingNativeWindow.

    Прямой ссылке на это нет, но есть библиотека, которую я нашел на просторах интернета. 

    Managed Windows API

    Скачав исходники, я откомпилировал их под .net 4.0.

    Эта библиотека оказалась для меня просто находкой.

    В ней много чего есть, но так же есть возможность ставить hook'и и на клавиатуру, и на буфер обмена.

    Причем инициализировать можно даже в классе App, в событии OnStartup.

    Круть!





    • Изменено vikaz 13 ноября 2013 г. 9:05
    • Помечено в качестве ответа vikaz 13 ноября 2013 г. 9:06
    13 ноября 2013 г. 9:03

Все ответы

  • Попробуйте класс WinApi целиком объявить статичным, а если не поможет, также создайте в нём статичное поле - тот же bool/byte - и после старта приложения и загрузки всех ресурсов один раз к нему обратиться - обычно это помогает.


    • Изменено Arman x64 12 ноября 2013 г. 22:40
    12 ноября 2013 г. 22:40
  • Попробуйте класс WinApi целиком объявить статичным, а если не поможет, также создайте в нём статичное поле - тот же bool/byte - и после старта приложения и загрузки всех ресурсов один раз к нему обратиться - обычно это помогает.


    Какое событие Вы имеете в виду под словами: "после старта приложения и загрузки всех ресурсов"? Это случайно не Loaded главного окна? Если да, то по сути, это не меняет дело!

    Я не настаиваю, чтобы кто-то смотрел код, но я создал очень простой пример работы с буфером обмена. Clipboard

    Если у Вас получиться заставить этот код, работать  вне Loaded и Вы поделитесь знаниями, как это сделать, то я буду Вам очень благодарен! :)

    13 ноября 2013 г. 4:45
  • Отвечу сам на свой вопрос.

    Для того чтобы все это заработало, handle нужно получать через EventDispatchingNativeWindow.

    Прямой ссылке на это нет, но есть библиотека, которую я нашел на просторах интернета. 

    Managed Windows API

    Скачав исходники, я откомпилировал их под .net 4.0.

    Эта библиотека оказалась для меня просто находкой.

    В ней много чего есть, но так же есть возможность ставить hook'и и на клавиатуру, и на буфер обмена.

    Причем инициализировать можно даже в классе App, в событии OnStartup.

    Круть!





    • Изменено vikaz 13 ноября 2013 г. 9:05
    • Помечено в качестве ответа vikaz 13 ноября 2013 г. 9:06
    13 ноября 2013 г. 9:03