Dilan Shaminda Ответов: 2

Как захватить событие вставки в windows?


Привет,

Я занимаюсь исследовательским проектом и использую Windows API для обнаружения изменений в буфере обмена. Я переопределяю WndProc и до сих пор он работает нормально, и я могу обнаружить, когда происходит событие копирования. Но теперь проблема заключается в том, как обнаружить событие вставки. Сообщение WM_PASTE работает не во всех сценариях. То, что я думаю сделать, это :

Глобальный крюк Ctrl + v , Ctrl + Shift + v
Hook shell контекстное меню и обнаружение, когда пользователь нажимает на кнопку Вставить
Крюк приложения редактировать &ГТ; паста

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

Что я уже пробовал:

Я попытался подключить горячую клавишу реестра Ctrl + v, и она отлично работает. Но как указано в здесь

Цитата:
Крючки, как правило, замедляют работу системы, поскольку они увеличивают объем обработки, которую система должна выполнять для каждого сообщения. Вы должны устанавливать крючок только тогда, когда это необходимо, и снимать его как можно скорее.


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

Richard MacCutchan

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

Dilan Shaminda

да, это проблема события вставки. Спасибо за комментарий

Jochen Arndt

Надежного способа обнаружения событий вставки не существует, поскольку они обрабатываются целевыми приложениями (как вы уже знаете).

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

Dilan Shaminda

"есть приложения, которые реализуют свое собственное контекстное меню", - я не думал об этом сценарии. Спасибо

2 Ответов

Рейтинг:
8

OriginalGriff

Как говорит Дейв, такого события не существует, WM_PASTE - это инструкция, а не уведомление, и приложениям даже не нужно ждать ввода пользователя для вставки-в .NET есть объект буфера обмена, который позволяет приложениям напрямую манипулировать содержимым буфера обмена, поэтому вы никогда не сможете обнаружить все операции вставки независимо от того, как вы это делаете.

И ваш список операций с клавиатурой также неполон: SHIFT+INSERT будет вставляться в большинстве приложений; но я знаю пару приложений, которые используют CTRL+V для операций без вставки.


Dilan Shaminda

Спасибо. Я думаю, что мне нужно провести больше исследований по этому поводу и найти способ обнаружить большинство случаев.

OriginalGriff

Почему ты пытаешься это сделать? Вставка не имеет ничего общего с изменением буфера обмена, совсем наоборот!

Dilan Shaminda

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

OriginalGriff

Я думаю, что вам нужно больше думать об этой целой нагрузке, защищая вещи от "ухода" с ПК, это будет целая нагрузка, более эффективная, чем предотвращение копирования и вставки. Например, как насчет перетаскивания? Это вообще не использует буфер обмена, равно как и командную оболочку CMD и команду "копировать". И есть также "открыть файл, сохранить в новом месте", чтобы беспокоиться о нем.

Даже если бы было "событие вставки", оно ничего не сделало бы против них!

Dilan Shaminda

Да, не только копировать пасту, но и перетаскивать и другие возможности. Поскольку это исследовательский проект, я ищу варианты, которые мы должны предотвратить в среде windows, и каковы возможности windows api. Спасибо за ценный комментарий :-)

OriginalGriff

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

Dave Kreskowiak

Да, отслеживание копирования и вставки не практично и не добавляет никакой безопасности в этом контексте. Вы не можете знать, что "защищено", когда данные находятся в буфере обмена, а что нет и может быть пропущено.

Копирование файла на USB-накопитель легко предотвратить с помощью "групповой политики"Active Directory. Там, где я работаю, мы не можем использовать внешние накопители вообще, любого типа.


О, и нет никакого способа помешать кому-то использовать мобильный телефон, чтобы сфотографировать то, что находится на мониторе.

Рейтинг:
18

Dave Kreskowiak

Нет такой вещи, как "глобальное событие вставки", на которое можно подписаться.

То, что вы предложили, - это лучший способ, которым вы собираетесь это сделать.

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


Dilan Shaminda

Чтобы подключить контекстное меню оболочки, я не смог найти ни одной подходящей функции windows api. Было бы здорово, если бы вы помогли мне найти ссылку, может быть, с чего начать.

Dave Kreskowiak

Вы не "зацепляете" контекстное меню. Вы пишете расширение оболочки.
https://www.codeproject.com/Articles/441/The-Complete-Idiot-s-Guide-to-Writing-Shell-Extens

BillWoodruff

Привет, Дэйв, похоже, что GlobalHooks может повлиять на отладку в VS:

https://www.codeproject.com/Messages/5522581/What-is-going-on-with-VS-solved.aspx