如何在应用程序中的F1上应用键盘钩

问题描述 投票:1回答:2

对于我们的应用程序,我们创建了一个在线帮助,客户可以在其中查找有关我们应他们可以在菜单中达到这个目的,但我也希望通过在我们的应用程序中按F1键来使其可用(因为这主要用于其他应用程序中的帮助)。

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

所以我试图设置一个键盘钩子,但这似乎也适用于系统范围。有没有办法确保在应用程序中按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);

关于键盘钩,我尝试了:

  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;
delphi local delphi-10.1-berlin keyboard-hook
2个回答
2
投票

您可以使用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}

2
投票

如果您想向您的应用程序显示在线帮助,那么您宁愿使用OnHelp事件的现有帮助支持,因为Ondrej Kelle已在他的评论中提出建议。

使用现有的帮助系统也为您提供了另一个优势也就是说,对于每个控件,您可以为HelpContextHelpKeyword设置特定值,这意味着您可以导航到相关帮助页面,而不是打开在线帮助开始页面,这使得使用提供的帮助系统对应用程序用户来说更加容易。

顺便说一下,如果您不想使用HTML帮助系统在线帮助使用OnHelp事件,您仍然可以轻松实现自己的系统来显示帮助。

© www.soinside.com 2019 - 2024. All rights reserved.