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消息与节目索引wParam到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;
Run Code Online (Sandbox Code Playgroud)
现在,即使您关闭此新程序,notepad.exe和pbrush.exe也将分别从Ctrl+ Alt+ N和Ctrl+ 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.
| 归档时间: |
|
| 查看次数: |
4140 次 |
| 最近记录: |