Как применить клавиатуру на F1 в приложении - PullRequest
1 голос
/ 01 апреля 2019

Для нашего приложения мы создали онлайн-справку, где клиенты могут посмотреть информацию о нашем приложении. Они могут достичь этого в меню, но я также хотел сделать его доступным, нажав клавишу 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;

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Вы можете перехватить F1 для всего приложения, используя TApplicationEvents.OnHelp.

Удалите компонент в основной форме или в модуле данных, который создан перед основной формой.Дважды щелкните событие 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 голосов
/ 01 апреля 2019

Если вы хотите показывать онлайн-справку для вашего приложения, вы бы предпочли использовать существующую справочную поддержку, используя OnHelp события, как уже рекомендовал Ондрей Келле в своем комментарии.

Использование существующей справочной системы также дает вам еще одно преимущество. И это то, что для каждого из ваших контролов вы можете установить конкретные значения для HelpContext и HelpKeyword, что означает, что вместо открытия стартовой страницы интерактивной справки вы уже можете перейти на соответствующую страницу справки, которая значительно упрощает использование предоставленной справочной системы. пользователи вашего приложения.

Кстати, если вы не хотите использовать систему HTMLHelp для интерактивной справки с использованием событий OnHelp, вы все равно можете легко реализовать собственную систему для отображения справки.

...