Как обрабатывать входные сообщения KeyBoard на неоконных объектах?
Я читал здесь о том, как создать дескриптор окна в неоконный контроллер. Я сделал так, как я читаю, но ничего не происходит. Так что я прихожу к вам, ребята.
Мой класс сейчас такой:
interface
type
TMyObject = class
private
fMsgHandlerHWND : HWND;
procedure WndMethod(var Msg: TMessage);
public
constructor Create;
destructor Destroy; Override;
end;
implementation
constructor TMyObject.Create;
begin
inherited;
fMsgHandlerHWND := AllocateHWnd(WndMethod);
end;
destructor TMyObject.Destroy;
begin
deallocatehwnd(fMsgHandlerHWND);
inherited;
end;
procedure TMyObject.WndMethod(var Msg: TMessage);
begin
if Msg.Msg = WM_KEYUP then
MessageBeep(0)
else
Msg.Result := DefWindowProc(fMsgHandlerHWND, Msg.Msg, Msg.wParam, Msg.lParam);
end;
Я использую мой FormCreate
выполнить var := TMyObject.Create
,
После строки, где Windows отправляет широковещательные сообщения, когда я нажимаю / отпускаю клавишу (поправьте меня, если я ошибаюсь); Я не уверен, почему это не сработало. Somoeone может сказать мне, что я сделал не так? Есть еще один способ поймать ввод KeyBoard с неоконный объект? Если так, то как?
1 ответ
События клавиатуры доставляются в окно с фокусом ввода. Это никогда не будет твоим скрытым окном.
если вы хотите перехватывать входные события, самый простой способ - использовать OnMessage
событие глобального Application
объект. Все сообщения в очереди проходят через этот обработчик событий. Подписаться на это с помощью TApplicationEvents
пример.