【发布时间】:2010-10-10 06:14:13
【问题描述】:
我是 Delphi,我需要一个函数来确定系统菜单(分别是窗口菜单,单击图标时出现的菜单)是否打开。原因是我正在编写一个反键盘记录器功能,它将垃圾发送到当前活动的编辑控件(这也阻止了读取 WinAPI 消息的键盘记录器来读取内容)。但是如果打开系统菜单,editcontrol仍然有焦点,所以垃圾会调用快捷方式。
如果我在 TForm1 中使用消息 WM_INITMENUPOPUP,我可以确定系统菜单何时打开,但我希望不必更改 TForm,因为我想编写一个非可视组件,不需要对 TForm-derivate-class 本身进行任何修改。
//I do not want that solution since I have to modify TForm1 for that!
procedure TForm1.WMInitMenuPopup(var Message: TWMInitMenuPopup);
begin
if message.MenuPopup=getsystemmenu(Handle, False) then
begin
SystemMenuIsOpened := true;
end;
end;
TApplicaton.HookMainWindow() 不会将WM_INITMENUPOPUP 发送到我的挂钩函数。
function TForm1.MessageHook(var Msg: TMessage): Boolean;
begin
Result := False;
if (Msg.Msg = WM_INITMENUPOPUP) then
begin
// Msg.Msg IS NEVER WM_INITMENUPOPUP!
if LongBool(msg.LParamHi) then
begin
SystemMenuIsOpened := true;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(MessageHook);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.UnhookMainWindow(MessageHook);
end;
即使经过很长时间的研究,我也没有找到任何关于如何查询系统菜单是否打开的信息。我找不到任何方法来确定该菜单的打开和关闭。
请问有人可以帮我解决吗?
问候
丹尼尔·马歇尔
【问题讨论】:
标签: windows delphi winapi system