Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何处理非窗口对象上的键盘输入消息?_Delphi_Keyboard Events_Delphi Xe3_Windows Messages - Fatal编程技术网

Delphi 如何处理非窗口对象上的键盘输入消息?

Delphi 如何处理非窗口对象上的键盘输入消息?,delphi,keyboard-events,delphi-xe3,windows-messages,Delphi,Keyboard Events,Delphi Xe3,Windows Messages,我读过关于如何在非窗口控件中创建窗口句柄的内容。我照我读的方式做了,但什么也没发生。所以我来找你们 我的班级现在是这样的: interface type TMyObject = class private fMsgHandlerHWND : HWND; procedure WndMethod(var Msg: TMessage); public constructor Create; destruct

我读过关于如何在非窗口控件中创建窗口句柄的内容。我照我读的方式做了,但什么也没发生。所以我来找你们

我的班级现在是这样的:

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发送广播消息(如果我错了,请纠正我);我不知道为什么它不起作用。谁能告诉我我做错了什么?还有另一种方法可以用非窗口对象捕捉键盘输入吗?如果是,如何将?

键盘事件传递到具有输入焦点的窗口。那永远不会是你隐藏的窗口


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

基本上,它们被发布到活动窗口,而不是隐藏窗口。请看这里:@David在我出现的页面上,它说
deffowenproc
是针对每一条其他消息的(我不会处理)。我必须打电话给它?是的,你需要让系统处理与创建和销毁相关的消息。我应该更新这个问题吗?那么,我可以删除部分答案,让它更干净。顺便说一句,按照惯例,类型的前缀是T。我想我明白了。我无法将
过程TForm1.OnMessage(Msg:TagMSG;Handled:Boolean)
分配给“参数列表不同”编译消息下的
ApplicationEvents1.OnMessage
。Handled是一个变量参数。更容易让设计师完成这一切。将appevents对象放到表单上,在objectinspector中查找OnMessage,双击它。下面是我的限制。如果不是不可能,我想在运行时创建
TApplicationEvents
实例。使
Handled
var参数无论如何都无法解决…这是可能的。一点也不麻烦。这意味着您必须正确地获得方法签名,而不是依赖于设计器。继续尝试。你会解决的。无法从此处进行盲调试。