2008-09-30 4 views
1

У меня есть диалоговое окно, которое позволяет пользователям устанавливать горячие клавиши для использования в 3d-программе на окнах. Я использую CHotKeyCtrl, что довольно хорошо, но не обрабатывает некоторые ключи, которые пользователи хотели бы использовать - в частности, вкладки и пробелы.Управление для получения горячих клавиш, таких как вкладка и пространство

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

ответ

1

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

Это позволит вам уловить клавиатуру WM_KEYDOWN сообщений, отправленных этому элементу управления.

Функция крючка будет выглядеть примерно так:

LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPMSG lpMsg) 
    { 
     LRESULT lResult = 0; 

     if ((code >= 0) && (code == MSGF_DIALOGBOX)) 
     { 
     if (lpMsg->message == WM_KEYDOWN) 
     { 
      //-- process the key down message 
      lResult = 1; 
     } 
     } 

     // do default processing if required 
     if (lResult == 0) 
     { 
     lResult = CallNextHookEx(MessageFilterHook, code, wParam, (LPARAM)lpMsg); 
     } 

     return lResult; 
    } 

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

//-- create an instance thunk for our hook callback 
    FARPROC FilterProc = (FARPROC) MakeProcInstance((HOOKPROC)(MessageHook), 
                hInstance); 
    //-- attach the message hook 
    FilterHook = SetWindowsHookEx(WH_MSGFILTER, 
           (HOOKPROC)FilterProc, 
            hInstance, GetCurrentThreadId()); 

и удаляются при правке когда происходит потеря фокуса следующим образом:

//-- remove a message hook 
    UnhookWindowsHookEx(MessageFilterHook); 

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

+0

Это выглядит довольно хорошо. Я посмотрю, смогу ли я реализовать это и опубликовать его, когда у меня появится шанс. – tfinniga 2009-02-13 23:34:54