Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 348

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

Возникла проблема при эмуляции нажатия функциональных клавиш F1-F12 (возможно и других, но не проверял). При регистрации одной горячей клавиши(без модификатора) - все работает прекрасно, но если используется модификатор (Alt, Control, Shift или их сочетания) - отсылается некорректный код. Подозреваю что дело в том что отсылается в момент нажатия, а не отпускания, т.е. на момент посылки модификатор остается в нажатом состоянии. Как можно решить данную проблему?
Цель: корректно эмулировать нажатие клавиш при использовании горячей клавиши с модификатором.

Приложение:
  1.  
  2. procedure WMHotkey ( var msg: TWMHotkey ); message WM_HOTKEY;
  3.  
  4. Var
  5.  
  6.  
  7. procedure TfrmMult.FormCreate(Sender: TObject);
  8. begin
  9.  
  10. HK:= 9999; RegisterHotKey(Handle, HK, 0, 45); //Insert
  11.  
  12. HK1:= 1; RegisterHotKey(Handle, HK1, MOD_ALT, 49); // Alt + 1
  13.  
  14. HK2:= 2; RegisterHotKey(Handle, HK2, 0, 49); // 1
  15.  
  16. End;
  17.  
  18. procedure TfrmMult.WMHotKey(var Msg: TWMHotKey);
  19. Begin
  20.  
  21.  
  22.  
  23. begin
  24. PostMessage(hnd, wm_keydown, 112, 0);
  25. sleep(10);
  26. PostMessage(hnd, wm_keyup, 112, 0);
  27. end;
  28.  
  29.  
  30. begin
  31. PostMessage(hnd, wm_keydown, 112, 0);
  32. sleep(10);
  33. PostMessage(hnd, wm_keyup, 112, 0);
  34. end;
  35. End;


Примечание #1 (5 января 2013, 22:55):
Пишу в XE3

Ins Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ins (статус: 1-ый класс)
Вопрос отправлен: 5 января 2013, 21:19
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 14 января 2013, 21:21; участников в обсуждении: 1.
Ins

Ins (статус: 1-ый класс), 8 января 2013, 23:37 [#1]:

В решение нашлось, но оно мне не нравится. вопрос оставляю открытым.
while MyKeyState(vk_menu)=True do
Begin
sleep(100);
Application.ProcessMessages;
End;
Ins

Ins (статус: 1-ый класс), 14 января 2013, 21:21 [#2]:

Данное решение является лишь частичным, работает только если окно программы активно. SetForegroundWindow не решает проблему(

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.02 сек.