Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Отсылка комбинации нажатых клавиш окну


Автор: rogi08 24.6.2009, 10:16

Добрый день,

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


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

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);)

Автор: Andrey44 24.6.2009, 10:23
Если приложение твое, зачем так делать?

Автор: GremlinProg 24.6.2009, 10:29
используй http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx для отсылки сразу списка команд
перед вызовом только поставь фокус в окно

Автор: rogi08 24.6.2009, 10:56
GremlinProg, 
Andrey44
Спасибо за ответы.

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

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


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

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


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

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

как нету?
Код

SetFocus(h);

Автор: Andrey44 24.6.2009, 11:08
Цитата(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));


Автор: GremlinProg 24.6.2009, 11:30
Цитата(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 - просто удобна для посылки серии команд

Автор: Andrey44 24.6.2009, 11:42
GremlinProg, спасибо, буду знать. smile 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)