|
Вопрос # 4 601/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Я делаю программку чтобы по нажатии на клавишу на клавиатуре выполнялось какое-то действие. Но вот это работает тогда, когда окно активно. А я бы хотел чтобы программа была свёрнута и не была активна и выполняла те действия когда я нажму на клавишу. Как мне это сделать?
Приложение: Переключить в обычный режим- procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if key=vk_numpad5 then
- begin
- Timer1.Enabled:=True;
- i:=2;
- end;
-
- end;
 |
Вопрос задал: Andrew_Cyber (статус: Посетитель)
Вопрос отправлен: 23 сентября 2010, 20:22
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Смотри хэлп по API-функциям RegisterHotkey() и UnregisterHotkey().
Я еаписал несколько программ, в которых предусмотрена такая функциональность. Вот кусок кода:
В конструкторе главной формы:
// Регистрация клавиш звуков и клавиши отмены воспроизведения
for HotKeyID:= 0 to 9 do
RegisterHotKey(Application.Handle, HotKeyID, MOD_WIN, $30 + HotKeyID); // Win + 0...9 - звуки юзера
RegisterHotKey(Application.Handle, 253, MOD_CONTROL or MOD_WIN, VK_F12); // Ctrl + Win + F12 - сказать время
RegisterHotKey(Application.Handle, 254, MOD_CONTROL or MOD_WIN, VK_F11); // Ctrl + Win + F11 - развернуть из трея
RegisterHotKey(Application.Handle, 255, MOD_WIN, $20); // Win + Space - прекратить воспроизведение
В деструкторе:
// Сброс регистрации клавиш звуков и клавиши отмены воспроизведения
for HotKeyID:= 0 to 9 do
UnregisterHotKey(Application.Handle, HotKeyID);
UnregisterHotKey(Application.Handle, 253);
UnregisterHotKey(Application.Handle, 254);
UnregisterHotKey(Application.Handle, 255);
В обработчике Application.OnMessage:
procedure TMainForm.AppEventsMessage(var Msg: tagMSG;
var Handled: Boolean);
var
SoundIndex: Integer;
begin
case Msg.message of
WM_QUERYENDSESSION: Close();
WM_HOTKEY: begin
case Msg.wParam of
// Проигрывание звуков, если заданы
0..9: begin
if Msg.wParam = 0
then SoundIndex:= 9
else SoundIndex:= Msg.wParam - 1;
if SoundIndex < UserSoundsMRU.Items.Count
then UserSoundsMRUClick(UserSoundsMRU, UserSoundsMRU.Items[SoundIndex]);
end;
// Развернуть/активизировать
253: if IsIconic(Application.Handle)
then begin
Application.Restore();
Application.BringToFront();
end
else Application.Minimize();
// Сказать время
254: begin
Application.ProcessMessages();
Clocker.SpeakTime();
end;
// Отмена проигрывания
255: ThreadQueue.TerminateAllThreads();
end; // case
Handled:= False; // Отдаю другим прогам
end;
end; // case
// Активация первой копии приложения
if Msg.message = WCM_ACTIVATE
then begin
Application.Restore();
Application.BringToFront;
SetActiveWindow(Application.Handle);
SetForegroundWindow(Application.Handle);
end;
end;
Будут вопросы - пиши.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 24 сентября 2010, 08:23
Оценка за ответ: 5
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|