gpt4 book ai didi

delphi - 如何在应用程序内的 F1 上应用键盘钩子(Hook)

转载 作者:行者123 更新时间:2023-12-03 05:24:33 25 4
gpt4 key购买 nike

对于我们的应用程序,我们创建了一个在线帮助,客户可以在其中查找有关我们的应用程序的内容。他们可以在菜单中找到此内容,但我也希望无论您在我们的应用程序中的任何位置按 F1 键都可以使用它(因为这主要用于其他应用程序中的帮助)。

我尝试使用 RegisterHotKey 函数,但事实证明,这会在系统范围内注册热键。我只希望它在您使用我们的应用程序时打开我们的在线帮助。

所以我尝试设置一个键盘 Hook ,但这似乎也适用于系统范围。有没有办法确保在应用程序中按 F1 键将打开它,但当您没有聚焦应用程序时则不会打开它?

编写我尝试过的代码:

procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;

procedure TZZ_Main_Form.WMHotKey(var Msg: TWMHotKey);
begin
if Msg.HotKey = HotKeyIDF1 then btOnlineHelpClick(nil);
end;

在 FormCreate 和 FormDestroy 中:

RegisterHotKey(Handle, HotKeyIDF1, 0, VK_F1);
UnRegisterHotKey(Handle, HotKeyIDF1);

关于键盘 Hook ,我尝试过:

  hkHook := SetWindowsHookEx(WH_KEYBOARD,@KeyboardProc,hInstance,GetCurrentThreadID());

function KeyboardProc(Code, wParam, lParam: Integer): Integer;
var
url: String;
ShellInfo: TShellExecuteInfo;
begin
try
case wParam of
VK_F1:
begin
url := 'ourOnlineHelpLink'
if url <> '' then
begin
FillChar( ShellInfo, SizeOf( TShellExecuteInfo ), 0 );
ShellInfo.cbSize := SizeOf( TShellExecuteInfo );
ShellInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI or
SEE_MASK_FLAG_DDEWAIT;
ShellInfo.Wnd := HWnd_Desktop;
ShellInfo.lpVerb := 'OPEN';
ShellInfo.lpFile := PChar( url );
ShellInfo.lpParameters := nil;
ShellInfo.lpDirectory := nil;
ShellInfo.nShow := sw_ShowNormal;

ShellExecuteEx( @ShellInfo );
end;
end;
end;
finally
Result := -1;
end;
end;

最佳答案

您可以使用 TApplicationEvents.OnHelp 在应用程序范围内拦截 F1

将该组件拖放到主窗体上,或者放在主窗体之前创建的数据模块中。双击其事件选项卡上的 OnHelp 事件,然后添加类似于以下的代码(Delphi 2007 之后参数类型发生了更改,因此我添加了对两者的支持):

// Delphi 2007 and earlier
{$IFDEF VER185}
function TMainForm.ApplicationEvents1Help(Command: Word; Data: Integer;
var CallHelp: Boolean): Boolean;
begin
CallHelp := False;
// Call your own procedure to implement help as you'd like
Result := True;
end;
{$ELSE Greater than D2007}
function TMainForm.ApplicationEvents1Help(Command: Word; Data: NativeInt;
var CallHelp: Boolean): Boolean;
begin
CallHelp := False;
// Call your own procedure to implement help as you'd like
Result := True;
end;
{$ENDIF}

关于delphi - 如何在应用程序内的 F1 上应用键盘钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55452624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com