Одним из вариантов обхода может быть использование стандартного элемента управления запасом с функцией перехвата сообщения.
Это позволит вам уловить клавиатуру 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 нажатие будет отправлено на крючок, если у элемента управления редактирования есть фокус.
Это выглядит довольно хорошо. Я посмотрю, смогу ли я реализовать это и опубликовать его, когда у меня появится шанс. – tfinniga 2009-02-13 23:34:54