Это делает то, что вы хотите.
Во-первых, вам нужна программа, которая работает в фоновом режиме и прослушивает нажатия клавиш и реагирует на них.Например:
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
.Программа должна выглядеть следующим образом.)
Вышеуказанная программа слушает сообщения WM_SETHOTKEY
, в которых регистрируется новая горячая клавиша Windows, WM_UNSETHOTKEY
, которая удаляет ранее зарегистрированную горячую клавишу, и WM_HOTKEY
, отправляемая Windowsкогда конечный пользователь активирует зарегистрированную горячую клавишу.Первые два сообщения определены мной, в этом приложении.
Чтобы зарегистрировать горячую клавишу, отправьте сообщение WM_SETHOTKEY
в окно W
.wParam
сообщения должно быть индексом (в массиве FileNames
) запускаемой программы.lParam
должен иметь форму $ MMMMKKKK, где $ MMMM - модификаторы ( Ctrl , Alt , Shift ) и $ KKKK - код виртуальной клавишигорячей клавишиЧтобы удалить горячую клавишу, отправьте сообщение WM_UNSETHOTKEY
с индексом программы от wParam
до W
.
Пример использования
Из любого приложения, вы можетеdo (при условии, что 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 КБ!Это крошечный для приложения, созданного в 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, если не можете найти окно.