gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:49:15 25 4
gpt4 key购买 nike

我需要在操作系统级别设置一个热键,一旦设置就会调用我告诉它调用的任何内容。热键设置必须在我的首选项内完成,但不必打开应用程序才能使热键发挥作用。

最佳答案

这就是你想要的。

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

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.

(要创建此程序,请选择“New/VCL Forms Application”,然后从项目中删除主窗体。然后选择“Project/View Source”并删除 Application.Initialize 废话。该程序应该类似于上面的内容。)

上面的程序监听注册新 Windows 热键的消息 WM_SETHOTKEY,删除先前注册的热键的 WM_UNSETHOTKEY 消息,以及删除先前注册的热键的 WM_HOTKEY 消息。当最终用户激活注册的热键时,由 Windows 发送。前两条消息是我在这个应用程序中定义的。

要注册热键,请将消息WM_SETHOTKEY发送到窗口W。消息的 wParam 应该是要启动的程序的索引(在 FileNames 数组中)。 lParam 的格式应为 $MMMMKKKK,其中 $MMMM 是修饰符(CtrlAltShift) $KKKK 是热键的虚拟键代码。要删除热键,请将程序索引为 wParamWM_UNSETHOTKEY 消息发送到 W

使用示例

任何应用程序中,您都可以执行此操作(假设 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;

现在,即使您关闭这个新程序,notepad.exe 和 pbrush.exe 也会在 Ctrl + Alt + N 上启动,并且分别为 Ctrl + Alt + P

更多讨论

请注意,编译后,Project1.exe 只有 20 kB 小!对于用 Delphi 制作的应用程序来说,这很小!

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

PostMessage(w, WM_UNSETHOTKEY, N, 0);

在此示例中,N = 0(对于记事本)和 = 1(对于 pbrush)。

要退出project1.exe,请执行

PostMessage(w, WM_QUIT, 0, 0);

但是,当然,如果您退出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;

如果找不到该窗口,甚至启动project1.exe。

关于delphi - 如何设置热键 ("win+Key") 组合来调用应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3688235/

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