| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Проблема с SendInput |
| Автор: under_sun 5.11.2008, 22:13 | ||
| Приветствую. Следующий код делает окно с дискриптором g_hWnd активным и посылает туда комбинацию клавиш Shift+O:
Проблема в следующем: если мы посылаем комбинацию этих клавиш, например, в блокнот, то нормально печатается 'O'. Но если затем начинаем там набирать текст, то продолжают печататься заглавные буквы, как-будто Shift продолжает быть в нажатом состоянии. Если использовать AttachThreadInput( GetWindowThreadProcessId( g_hWnd, NULL), GetCurrentThreadId(), TRUE ), ситуация та же. Что я делаю не так? |
| Автор: under_sun 6.11.2008, 22:23 | ||||
Сделал так:
Не знаю почему, но проблема осталась. Пробовал еще так:
Где подвох |
| Автор: GremlinProg 6.11.2008, 23:59 | ||
все там же
|
| Автор: under_sun 7.11.2008, 00:30 |
| Проверил, все равно Shift залипает. Кроме того надо одну 'O' печатать. |
| Автор: GremlinProg 7.11.2008, 00:55 | ||||
Добавлено через 3 минуты и 18 секунд попробуй keybd_event Добавлено через 11 минут и 32 секунды ну или 'O' вместо VkKeyScan('O')
|
| Автор: under_sun 11.11.2008, 19:52 |
| GremlinProg, спасибо. С keybd_event заработало. Но я так и не понял причины, почему с SendInput не работает. |
| Автор: dumb 11.11.2008, 20:59 |
| потому что желательна хотя бы минимальная задержка между "нажатием" и "отпусканием". поэтому и между keybd_event обычно Sleep'ы ставят небольшие. а ты все в одном пакете. |
| Автор: GremlinProg 11.11.2008, 22:53 | ||||
не, дело не в задержке, смотрим определение союза:
суть в том, что в союзе первый член типа MOUSEINPUT, у которого первые два поля типа LONG в союзах агрегатаов инициализация идет сначала, т.е. первый компонент союза, второй, и т.д., следовательно KEYEVENTF_KEYUP пишется не в поле dwFlags, а в поле mouseData, которое находится по большему смещению. отсюда и залипание клавиш. вот в таком варианте и SendInput работает
ничего не залипает |