Невозможно использовать SendKeys или SendMessage для программного вставки нетекстовых объектов - PullRequest
2 голосов
/ 25 февраля 2010

Я использую RegisterHotKey Win32 API для прослушивания комбинации клавиш Ctrl_V и использую метод WndProc для обработки этого уведомления о горячих клавишах. Теперь, даже если я не выполняю никаких операций в этом методе, кроме вызова base.WndProc (ref mesg), операция Paste, похоже, не передается в Windows, и, следовательно, вставка не работает. Мне удалось заставить текст работать, явно вызвав SendKeys ("^ V"), но он не работает для нетекстовых данных. Я также попробовал SendMessage Win32 API, как показано ниже

SendMessage(foregroundWindowHandle, 0x302, 0, 0);

но даже это не работает.

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

ОБНОВЛЕНИЕ: Я обнаружил, что проблема в том, что окно, в котором генерировалась команда Вставить, не возвращало фокус. После исправления, Paste работает нормально для Notepad. Кроме того, теперь я использую Alt_Shift_V в качестве горячей клавиши, чтобы избежать конфликтов с командой вставки по умолчанию. Таким образом, вставка нетекстовых данных работает нормально. Однако вставка текста в приложения Visual Studio и Office не работает. SendKeys ("^ V"), по-видимому, интерпретируется по-другому в этих приложениях. Любая идея о том, как заставить это работать?

Ответы [ 3 ]

1 голос
/ 26 февраля 2010

Вместо регистрации горячей клавиши зарегистрируйте глобальный хук.

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

Код для простой и удобной реализации глобальной ловушки можно найти по адресу:

http://www.codeproject.com/KB/cs/globalhook.aspx

Это не помешает операции вставки:)

0 голосов
/ 25 февраля 2010

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

0 голосов
/ 25 февраля 2010

Я думаю, что вы должны перехватить сообщение Ctrl-V Key (через WndProc), сделать то, что вам нужно, и позволить base.WndProc обработать сообщение ключа. Вы также можете обработать событие OnKeyDown. В WinForms вы можете установить для Form.KeyPreview значение true, чтобы видеть сообщения перед дочерними элементами управления.

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