2016-02-22 1 views
0

Я хочу перехватить горячую клавишу (в частности, CTRL V), которая будет взаимодействовать с моим приложением определенным образом. Я могу глобально зарегистрировать горячую клавишу, используя метод RegisterHotKey. Когда я нажимаю CTRL V, я хочу, чтобы сфокусированное окно/управление также получало сообщение WM_PASTE. Я пробовал отправить его через SendMessage, но он, похоже, не работал. Я в конечном итоге закончил регистрацию HotKey, отправив ^v в текущее окно, а затем повторно зарегистрировав горячую клавишу.Отправка вставки сообщения в фокусное управление активного окна

private static void Hook_KeyPressed(object sender, KeyPressedEventArgs e) 
{ 
    _hook.KeyPressed -= Hook_KeyPressed; 
    _hook.Dispose(); 
    SendKeys.Send("^v"); 
    _hook = new KeyboardHook(); 
    _hook.RegisterHotKey(global::ClipMaster.ModifierKeys.Control, Keys.V); 
    _hook.KeyPressed += Hook_KeyPressed; 
} 

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

ответ

1

Я не уверен, чего вы пытаетесь достичь с помощью этого крючка, потому что это невозможно понять из примера кода.

Предполагая, что вы делаете это по причинам аудита (или по мониторингу сортировки), я бы предложил просмотреть возвращаемое значение сообщения WM_HOTKEY. Он может «сказать», что сообщение не обработано, что позволяет продолжить обработку Ctrl-V другой логикой (например, другими перехватами). Кроме того, я бы посоветовал использовать альтернативный способ переслать Ctrl-V, чем SendKeys класс, который знает проблемы с синхронизацией. Вы считали сообщение вместо сообщения?

Я также нашел альтернативный подход к самому подключению, используя lower level key pressing for hooking.

Дайте мне знать, если это поможет.

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^