Как обрабатывать входные сообщения 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 пример.

Другие вопросы по тегам