Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отсылка комбинации нажатых клавиш окну 
:(
    Опции темы
rogi08
  Дата 24.6.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.2.2009

Репутация: нет
Всего: нет




Добрый день,

следующая проблема, необходимо отправить окну с заданным хендлом комбинацию клавиш.


Следующая комбинация 

PostMessage(h,WM_KEYDOWN,VK_CONTROL, 0);
PostMessage(h,WM_KEYDOWN,VK_F5, 0);
PostMessage(h,WM_KEYUP,VK_F5, 0);
PostMessage(h,WM_KEYUP,VK_CONTROL, 0);

не подходит, потому что между PostMessage окно может потерять\не иметь фокус.

Поделитесь опытом, как за один PostMessage\SendMessage отправить сочетания двух клавиш, например CTRL + F5

(Сочетание некоторых клавиш с функциональной иногда имеет свой собственный код, отличный от кодов самих клавиш. для Enter - это 13, для Ctrl+Enter - это 10. PostMessage(h,WM_KEYUP, 10, 0);)
PM MAIL   Вверх
Andrey44
Дата 24.6.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Если приложение твое, зачем так делать?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 24.6.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



используй SendInput для отсылки сразу списка команд
перед вызовом только поставь фокус в окно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
rogi08
Дата 24.6.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



GremlinProg, 
Andrey44
Спасибо за ответы.

Цитата(Andrey44 @  24.6.2009,  10:23 Найти цитируемый пост)
Если приложение твое, зачем так делать?

Приложение не моё.


Цитата(GremlinProg @  24.6.2009,  10:29 Найти цитируемый пост)
поставь фокус в окно

нет возможности поставить фокус в окно


Можно ли сделать, используя SendMessage\PostMessage ? 

PM MAIL   Вверх
GremlinProg
Дата 24.6.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(rogi08 @  24.6.2009,  12:56 Найти цитируемый пост)
нет возможности поставить фокус в окно

как нету?
Код

SetFocus(h);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Andrey44
Дата 24.6.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Цитата(rogi08 @  24.6.2009,  10:56 Найти цитируемый пост)
Можно ли сделать, используя SendMessage\PostMessage ? 

Нельзя.

Тут проблема вот в чем - если нажать  и посмотреть через Spy++ на сообщения, идущие окнам , то при всем желании никаких WM_KEYDOWN/WM_SYSKEYDOWN там не найти. Это потому, что эти нажатия обрабатываются самой ОС, и на окно идет уже готовое сообщение WM_COMMAND. Его, конечно, тоже можно послать самостоятельно, но вот как выловить из приложения идентификаторы команд его меню, которые при этом понадобятся, навскидку не скажу - ИМХО нужно юзать что-то типа редактора ресурсов. А вообще такие вещи без проблем делаются через SendInput - обработку всего ввода и выработку нужных сообщений берет на себя ОС, а приложение просто шлет нажатия клавиш. Но при этом подопытное окно должно быть в фокусе, так что если это неприемлемо (кстати, а почему?), то остается только ковырять WM_COMMAND. Вот пример с SendInput - посылаем Ctrl+F:
Код

INPUT inp;
inp.type=INPUT_KEYBOARD;
inp.ki.wVk=VK_CONTROL;
inp.ki.wScan=0;
inp.ki.dwFlags=0;
inp.ki.time=0;
inp.ki.dwExtraInfo=NULL;
SendInput(1,&inp,sizeof(inp));
inp.ki.wVk=VkKeyScan('f');
SendInput(1,&inp,sizeof(inp));
inp.ki.dwFlags=KEYEVENTF_KEYUP;
SendInput(1,&inp,sizeof(inp));
inp.ki.wVk=VK_CONTROL;
SendInput(1,&inp,sizeof(inp));




--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 24.6.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(rogi08 @  24.6.2009,  12:16 Найти цитируемый пост)
Поделитесь опытом, как за один PostMessage\SendMessage отправить сочетания двух клавиш, например CTRL + F5

за одно сообщение эти клавиши не посылаются
Цитата(rogi08 @  24.6.2009,  12:16 Найти цитируемый пост)
Сочетание некоторых клавиш с функциональной иногда имеет свой собственный код, отличный от кодов самих клавиш. для Enter - это 13, для Ctrl+Enter - это 10. PostMessage(h,WM_KEYUP, 10, 0);

честно говоря, не понял о чем речь
VK_RETURN
VK_CONTROL
10 - вообще зарезервирован, т.е. не имеет между ними ничего общего
Цитата(Andrey44 @  24.6.2009,  13:08 Найти цитируемый пост)
если нажать  и посмотреть через Spy++ на сообщения, идущие окнам , то при всем желании никаких WM_KEYDOWN/WM_SYSKEYDOWN там не найти

почему же, все видно
Цитата(Andrey44 @  24.6.2009,  13:08 Найти цитируемый пост)
Это потому, что эти нажатия обрабатываются самой ОС, и на окно идет уже готовое сообщение WM_COMMAND

нет, эти сообщения без препядствий приходят в окно,
транслирует их в WM_COMMAND DefWindowProc,
а в WM_CHAR и т.п. - TranslateMessage

SendInput - просто удобна для посылки серии команд


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Andrey44
Дата 24.6.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



GremlinProg, спасибо, буду знать. smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 24.6.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



всегда пожалуйста,
я думаю, ты просто забыл выключить фильтрацию в Spy на сообщения клавиатуры,
поэтому их и не видел,
ничего страшного


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0669 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.