I Delphi Мне нужна функция, которая определяет, открывается ли системное меню (соответственно меню окна, меню, которое появляется при щелчке значка). Причина в том, что я пишу функцию анти-кейлоггера, которая отправляет мусор текущему активному editcontrol (это также предотвращает кейлоггер, который читает сообщения WinAPI для чтения содержимого). Но если открыто системное меню, то в панели управления editcontrol STILL есть фокус, поэтому мусор будет вызывать ярлыки.Delphi: Открыто ли системное меню?
Если я использую сообщение WM_INITMENUPOPUP в моем TForm1, я могу детерминированный, когда откроется системное меню, но я хочу, чтобы я не должен изменить TForm, так как я хочу, чтобы написать неофициальный визуальный компонент, который не делает нужны любые модификации самого класса TForm-дериватива.
//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;
Даже после очень долгих исследований я не нашел никакой информации о том, как запрашивать, если меню системы открыто или нет. Я не нашел способа определить открытие + закрытие этого меню.
У кого-то есть решение для меня, пожалуйста?
С уважением
Daniel Marschall
Я никогда не слышал об этой функции, и я не знаю, как это может помочь мне подключить WM_INITMENUPOPUP. –
Пропускает параметр 'GWLP_WNDPROC'' 'InIndex'. Here в качестве примера. Он был использован SetWindowLong(), но теперь Microsoft рекомендует использовать SetWindowLongPtr(), чтобы сделать его совместимым с 32-разрядной и 64-разрядной версиями Windows. – Vantomex
Стиль отличается от стиля VCL, вы должны предоставить функцию обратного вызова, и именно там вы ставите свои критерии перехвата и выполняете дальнейшую обработку. Стиль Delphi VCL для перехвата сообщения - это просто оболочка этой функции Windows API. – Vantomex