Обнаружение операций перетаскивания во внешнем приложении с использованием .Net - PullRequest
3 голосов
/ 17 ноября 2009

Мне нужно обнаружить операции перетаскивания во внешнем приложении , возможно ли это? Я думал написать хук для обнаружения этих операций. Кто-нибудь может указать мне правильное направление, насколько какие сообщения или API-функции я мог бы попытаться подключить, чтобы обнаружить события перетаскивания? Я хочу сделать это в C #.

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

Ответы [ 3 ]

2 голосов
/ 25 ноября 2009

Есть два очевидных пути, по которым вы можете пойти, чтобы попытаться это сделать.

Первое, это подключить функции OLE, участвующие в операциях перетаскивания. Это предполагает, что другое приложение использует реальное перетаскивание , а не какую-то внутреннюю версию. Определить, что это за пределами моих возможностей - без доступа к программе, - но если возможно перетащить из этого внешнего приложения в окно некоторых других приложений (включая рабочий стол), это хороший признак того, что приложение использует реальные вещи.

Функция, которую вам нужно подключить: RegisterDragDrop , хотя DoDragDrop также может представлять интерес. RegisterDragDrop вызывается для регистрации цели отбрасывания и дает вам возможность обернуть IDropTarget нужным вам способом (предположительно IPC в ваше реальное приложение), RevokeDragDrop, а затем передать регистрацию, но теперь с вашим объект обертки вместо. IDropTarget :: Drop , вероятно, там, где вы будете выполнять основную часть вашего IPC.

Во-вторых, добавив в приложение хук Windows. Это возможно только в том случае, если вы понимаете действия пользователя, которые вызывают перетаскивание, и можете обнаружить их , поскольку вам нужно будет различать операцию перетаскивания и обычные действия клавиатуры / мыши. Речь идет о WH_CALLWNDPROC хуке, зарегистрированном в SetWindowsHookEx . По сути, вы определяете WndProc, который получает все сообщения, которые делает окно приложений (включая движение мыши), и вы сами можете определить, когда начинается операция перетаскивания и когда она останавливается.

В любом случае, много кода может быть написано на C #. С p \ invoke вы можете получить SetWindowsHookEx , и вы можете реализовать COM-объекты (и, соответственно, обертки для этих COM-объектов) в C #. На самом деле, в .NET 2.0 уже есть класс IDropTarget ; который может быть уже видимым COM.

К сожалению, перехват API очень низок, и вам, как правило, придется работать на C или C ++, чтобы что-то сделать. Я слышал хорошие новости о Detours , а также от Microsoft.

1 голос
/ 17 ноября 2009

Лучшее, что вы можете сделать, это подключиться к внешнему приложению. По моему опыту (последний раз, когда я делал что-то подобное два года назад), единственный способ добиться точного хука - использовать смесь C / C ++ и C #.

Чтобы сделать все это, вы должны быть знакомы с вызовом платформы и Windows SDK. Некоторые люди могут сказать, что вам нужна только часть p / invoke, но в моих исследованиях я обнаружил, что доступ к заголовкам и файлам библиотеки в SDK неоценим. Кроме того, я обнаружил, что Spy ++ является отличным инструментом для помощи в разработке хуков.

Существует множество ресурсов о подключении приложений Windows и о том, как взаимодействовать с внешними процессами. Я мог бы перечислить любое их количество здесь, но я не уверен, что вы предпочитаете, когда речь идет о технических статьях и примерах проектов. Лично я обнаружил, что на codeproject.com есть множество проектов по подключению с некоторыми довольно хорошими объяснениями.

Удачи вам; Надеюсь, это поможет.

0 голосов
/ 23 ноября 2009

Как вы упомянули сами, вам нужно будет использовать Windows-API - поэтому я надеюсь, что у вас есть некоторый опыт использования небезопасного кода в C # или вы планируете использовать C ++.
Один способ описан здесь MS.
Я предполагаю, что вам нужно взглянуть на HCBT_ACTIVATE (окно активируется) и HCBT_CLICKSKIPPED (щелчок мыши) - но это всего лишь предположение.
Другой идеей было бы взглянуть на Auto It Window Info - в нем есть средства для анализа окон - может быть, вы можете использовать это в хорошем месте - так, чтобы вы могли сохранить некоторую работу в части анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...