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参数无论如何都无法解决…这是可能的。一点也不麻烦。这意味着您必须正确地获得方法签名,而不是依赖于设计器。继续尝试。你会解决的。无法从此处进行盲调试。