我阅读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输入吗?如果是这样,怎么样?
答案 0 :(得分:2)
键盘事件通过输入焦点传送到窗口。这永远不会成为你隐藏的窗口。
如果要捕获输入事件,最简单的方法是使用全局OnMessage
对象的Application
事件。所有排队的消息都通过此事件处理程序。使用TApplicationEvents
实例订阅它。