Имитация нажатия клавиши SysDateTimePick32
Я хочу отправить нажатие на общий элемент управления SysDateTimePick32.
Представьте себе следующий сценарий: существует таблица с множеством строк и столбцов, нарисованная пользователем. Когда вы нажимаете "Enter" в одном из этих столбцов, создается элемент управления SysDateTimePick32, который помещается в текущую ячейку, чтобы вы могли выбрать время для фактического содержимого этой ячейки. Это работает нормально, но я бы хотел, чтобы пользователь мог начать редактировать время, не нажимая сначала клавишу ввода.
Это означает: таблица находится в режиме "отображения" и ячейка выбрана. Пока нет элемента управления SysDateTimePick32. Вместо нажатия клавиши ввода (и, следовательно, создания и отображения SysDateTimePick32), пользователь вводит, например, "3". Теперь должен быть создан и показан SysDateTimePick32, и на него должно быть отправлено ранее набранное "3", точно так же, как пользователь нажал "enter", а затем "3".
я пытаюсь
SendMessage(sysDateTimePick32Handle, WM_KEYDOWN, '3', MAKELPARAM (1, 0));
Тем не менее, это не похоже на работу. Что такое "чистый" способ отправки определенных нажатий клавиш в элемент управления Win32, особенно SysDateTimePick32?
1 ответ
Подобные нажатия клавиш наполняются медвежьими ловушками. Непонятно, почему это не сработает, хотя это неверный путь. WM_KEYDOWN публикуется, а не отправляется, поэтому вы должны использовать PostMessage(). Для ввода клавиш типа "3" вы должны вместо этого отправить WM_CHAR, избавив вас от хлопот, связанных с правильной настройкой состояния клавиш-модификаторов (Shift, Ctrl, Alt), и удалите активную раскладку клавиатуры в качестве режима сбоя. Выберите SendInput(), если это не подходит.
Обдумайте менее хакерский способ, который делает это проще. Просто всегда создавайте сборщик, когда фокус попадает в ячейку. Уничтожьте или проигнорируйте его, когда обнаружите, что ничего не было введено.