如何在非窗口对象上处理KeyBoard输入消息?

时间:2014-02-11 17:48:12

标签: delphi keyboard-events delphi-xe3 windows-messages

我阅读here有关如何在非窗口控件中创建窗口句柄的信息。我按照我的方式做了,但没有任何反应。所以我来找你们。

我的班级现在就是这样:

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 个答案:

答案 0 :(得分:2)

键盘事件通过输入焦点传送到窗口。这永远不会成为你隐藏的窗口。

如果要捕获输入事件,最简单的方法是使用全局OnMessage对象的Application事件。所有排队的消息都通过此事件处理程序。使用TApplicationEvents实例订阅它。