Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как программно отправить окну комбинацию клавиш ??  (Прочитано 13212 раз)
0 Пользователей и 1 Гость смотрят эту тему.
muzzy
Гость
« : 22-11-2005 03:52 » 

как программно отправить окну комбинацию клавиш ?? например ctrl+enter
у меня получается отправить одну клавишу, например F3  PostMessage (h, WM_KEYDOWN, VK_F3, 0)
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 22-11-2005 10:52 » 

И так далее, всего четыре сообщения: нажать F3, нажать Enter, отпустить Enter, отпустить F3

В win-процедуре клиента функция TranslateMessage распознает последовательность и сгенерирует синтетическое сообщение control + enter
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
muzzy
Гость
« Ответ #2 : 22-11-2005 13:06 » 

PostMessage(h1,WM_KEYDOWN,VK_CONTROL, 0);
PostMessage(h,WM_KEYDOWN,VK_RETURN, 0);
PostMessage(h,WM_KEYUP,VK_RETURN, 0);
PostMessage(h1,WM_KEYUP,VK_control, 0);

не получается
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 22-11-2005 15:24 » 

А почему PostMessage отсылает сообщения разным окнам?  control отсылается окну h1, enter отсылается окну h?
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
muzzy
Гость
« Ответ #4 : 22-11-2005 15:53 » 

это я здесь ошибку допустил, в проге правильно написано
PostMessage(h,WM_KEYDOWN,VK_CONTROL, 0);
PostMessage(h,WM_KEYDOWN,VK_RETURN, 0);
PostMessage(h,WM_KEYUP,VK_RETURN, 0);
PostMessage(h,WM_KEYUP,VK_CONTROL, 0);

у окна есть горячие клавиши CTRL+ENTER, F3.
PostMessage(h,WM_KEYDOWN,VK_F3, 0);   работает, неважно чей хэндл, лишь бы принадлежил окну
а эта комбинация из 4 строк, делает два enter. Это видно если хэндл принадлежит TMemo
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 14-12-2005 07:35 » 

всё правильно. следует различать две вещи: событие, которое генерит винда, и событие, которое обрабатывает прога. допустим, в проге есть обработчик на OnKeyUp. в этом случае при нажатии клавиши винда сгенерит три сообщения: WM_KEYDOWN, WM_KEYUP, WM_KEYPRESS (или как его там, по матери?). но прога отработает только то, на которое у неё назначен обработчик, в нашем случае - WM_KEYUP. вот именно в этом заключаются ваши грабли. что вы делаете? вы:

1. говорите окну, что нажат Ctrl. (вы не нажимаете его в действительности! вы просто говорите окну, что он был нажат! если обработчик в проге висит только на OnKeyUp - он просто пропустит это сообщение мимо ушей!)
2. говорите окну, что был нажат Enter.
и т.д.

в действительности, я подозреваю, что в программе всего один обработчик, какой-нибудь OnKeyPress, который и получает два Enter'a.

Сочетание некоторых клавиш с функциональной иногда имеет свой собственный код, отличный от кодов самих клавиш. для Enter - это 13, для Ctrl+Enter - это 10. сделайте вот так:

PostMessage(h,WM_KEYUP, 10, 0);

и, я думаю, будет счастье.
« Последнее редактирование: 20-12-2007 18:02 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines