如何设置热键("win + Key")组合来调用应用程序?

Jlo*_*uro 7 delphi keyboard-shortcuts

我需要在操作系统级别设置一个热键,一旦设置将调用我告诉它调用的任何内容.必须在我的首选项选项内完成热键设置,但不必打开应用程序以使热键有效.

And*_*and 14

这样做你想要的.

首先,您需要一个在后台运行的程序,并监听并响应击键.像这样:

program Project1;

uses
  Windows, Messages, ShellAPI;

var
  W: HWND;
  M: MSG;

const
  WM_SETHOTKEY = WM_APP + 1;
  WM_UNSETHOTKEY = WM_APP + 2;
  AppName = 'Rejbrand Hot Key Listener';

const
  FileNames: array[0..1] of string = ('notepad.exe', 'pbrush.exe');

begin

  if FindWindow('STATIC', PChar(AppName)) <> 0 then
    Exit;


  W := CreateWindow('STATIC', PChar(AppName), 0, 0, 0, 100, 100, HWND_MESSAGE, 0, HInstance, nil);

  while GetMessage(M, W, 0, 0) do
    case M.message of
      WM_HOTKEY:
        ShellExecute(0, nil, PChar(FileNames[M.wParam]), nil, nil, SW_SHOWNORMAL);
      WM_SETHOTKEY:
        RegisterHotKey(W, M.wParam, M.lParam shr 16, M.lParam and $FFFF);
      WM_UNSETHOTKEY:
        UnregisterHotKey(W, M.wParam);
    end;

end.
Run Code Online (Sandbox Code Playgroud)

(要创建此程序,请选择New/VCL Forms Application,然后从项目中删除主窗体.然后选择Project/View Source并删除Application.Initialize废话.程序应如上所示.)

上述程序侦听WM_SETHOTKEY注册新Windows热键的消息,该热键WM_UNSETHOTKEY删除以前注册的热键,并WM_HOTKEY在最终用户激活注册的热键时由Windows发送.前两条消息由我在此应用程序中定义.

要注册热键,请将消息发送WM_SETHOTKEY到窗口W.该wParam消息的应是索引(在FileNames该程序启动的阵列).该lParam形式应为$ MMMMKKKK其中$ MMMM是修饰符(的Ctrl,Alt,Shift)和$ KKKK热键的虚拟键码.要删除一个热键,发送一个WM_UNSETHOTKEY消息与节目索引wParamW.

样品用法

任何应用程序,您都可以(假设Project1.exe在后台运行)

const
  WM_SETHOTKEY = WM_APP + 1;
  WM_UNSETHOTKEY = WM_APP + 2;

const
  MODIFIER_ALT = MOD_ALT shl 16;
  MODIFIER_CTRL = MOD_CONTROL shl 16;
  MODIFIER_SHIFT = MOD_SHIFT shl 16;

procedure TForm1.RegisterHotkeys;
var
  w: HWND;
begin
  w := FindWindow('STATIC', 'Rejbrand Hot Key Listener');
  PostMessage(w, WM_UNSETHOTKEY, 0, MODIFIER_CTRL + MODIFIER_ALT + ord('N'));
  PostMessage(w, WM_SETHOTKEY, 1, MODIFIER_CTRL + MODIFIER_ALT + ord('P'));
end;
Run Code Online (Sandbox Code Playgroud)

现在,即使您关闭此新程序,notepad.exe和pbrush.exe也将分别从Ctrl+ Alt+ NCtrl+ Alt+ 开始P.

还有一些讨论

注意,编译时,Project1.exe只有20 kB小!对于Delphi中的应用程序来说,这个很小!

要取消注册以前注册的热键,请执行

PostMessage(w, WM_UNSETHOTKEY, N, 0);
Run Code Online (Sandbox Code Playgroud)

其中N,在这个例子中,对于记事本是= 0而对于pbrush是= 1.

要退出project1.exe,请执行

PostMessage(w, WM_QUIT, 0, 0);
Run Code Online (Sandbox Code Playgroud)

但是,当然,如果退出project1.exe,Windows将取消注册所有热键.

你可能想做

procedure TForm1.RegisterHotkeys;
var
  w: HWND;
begin
  w := FindWindow('STATIC', 'Rejbrand Hot Key Listener');
  if w = 0 then
    MessageBox('Error: Rejbrand Hot Key Listener not running!');
  PostMessage(w, WM_UNSETHOTKEY, 0, MODIFIER_CTRL + MODIFIER_ALT + ord('N'));
  PostMessage(w, WM_SETHOTKEY, 1, MODIFIER_CTRL + MODIFIER_ALT + ord('P'));
end;
Run Code Online (Sandbox Code Playgroud)

如果找不到窗口,甚至可以启动project1.exe.