| 
| 
 | Вопрос # 4 601/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Я делаю программку чтобы по нажатии на клавишу на клавиатуре выполнялось какое-то действие. Но вот это работает тогда, когда окно активно. А я бы хотел чтобы программа была свёрнута и не была активна и выполняла те действия когда я нажму на клавишу. Как мне это сделать?
 Приложение:Переключить в обычный режим procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);beginif 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
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |