ОБСУЖДЕНИЕ

Резидентные программы

4 ответов 7,7 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Люди помогите
Кароч интересно как сделать так что бы программы работала но окна не было
можно конечно скрыть окно (Form1.hide) но так не катит прога мот выполняться и будет но мне нужно что бы работала клавиатура т.е. прога отслеживала и выполняла команды с клавы но окна не было...
(если делать окно всегда поверх остальных окон и ещё скрыть его то тоже не работает)
 
SetWindowsHookEx
 
Понятие "резидентная программа" отмерло ещё со времён ДОС.

Сейчас Ваш вопрос стоит о перехвате событий проходящих в системе... что бы больше об этом понимать стоит почитать любую книжку по программированию на Delphi, не верное или не совсем верное использование указанной для Вас выше функции может привести к падению системы!
 
ВАша проблема ясна, я уже делал такую ерунду.
Ответ заключается в том чтобы задать системные горячие клавиши для вашей проги.
Даже если вы будете работать в Worde и там допустим нажмете сохранить горячими клавишами.
Но ваша прога их под себя зарегистрирует, то на нажатие этих клавиш будет реагировать только ваша прога.
И также её скрыть как вам угодно.

Ниже теория

Горячие клавиши - сочетания клавиш, которые регистрируются в системе и при их нажатии система посылает сообщение WM_HOTKEY тому окну, Handle которого было заявлено при регистрации горячей клавиши. При этом не важно, имеет ли окно- получатель фокус ввода и видимо ли оно на экране. Это особенно удобно при написании резидентных программ, т.е. приложений, которые активизируются при нажатии определенных сочетаний клавиш.
Регистрация производится при помощи вызова API RegisterHotKey
function RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL;
hWnd - Handle окна, которое будет получать сообщения при нажатии горячей клавиши
id - идентификатор (просто число, передаваемое в сообщении WM_HOTKEY. id позволяет приложению работать с несколькими горячими клавишами, различая их по id). Нельзя определить две горячие клавиши с одинаковым id
fsModifiers - модификаторы. Определяют, какие клавиши должны быть нажаты совместно с указанной vk. Допустимы значения: MOD_ALT - ALT, MOD_CONTROL - CTRL, MOD_SHIFT - SHIFT
vk - виртуальный код клавиши
Если горячую клавишу удается зарегистрировать, то функция возвращает TRUE.
При завершении приложения необходимо отменить регистрацию горячей клавиши при помощи вызова UnregisterHotKey. При вызве ей передается Handle окна и id горячей клавиши.

Пример:
Код:
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 procedure FormDestroy(Sender: TObject);
private
 // Обработчик сообщения WM_HOTKEY
 procedure WMHotKey(var Mess:TWMHotKey);message WM_HOTKEY;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMHotKey(var Mess: TWMHotKey);
begin
MessageBeep(0);
ShowMessage('Нажата горячая клавиша CTRL+F12');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, 1 ,MOD_CONTROL, vk_F12);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle, 1);
end;
 
Метод использования хоткеев это узкий случай перехвата событий. В общем случае он не пригоден для мониторинга нажатых клавиш...

Использование хуков даёт Вам более широкие возможности для обработки событий системы...
 
Статус
Закрыто для дальнейших ответов.

Ещё по теме