keybd_event - это устаревший вызов API. Попробуйте использовать Модер SendInput функцию API
UINT WINAPI SendInput(
_In_ UINT nInputs,
_In_ LPINPUT pInputs,
_In_ int cbSize
);
nInputs
Число структур в pInputs
массиве.
pInputs
Массив из INPUT
структур. Каждая структура представляет собой событие, которое должно быть вставлено в поток ввода клавиатуры или мыши.
cbSize
Размер, в байтах, структуры INPUT
. Если cbSize
не является размерностью структуры INPUT
, функция не работает.
Эта функция подчиняется UIPI. Приложениям разрешено вводить ввод только в приложения, которые имеют одинаковый или меньший уровень целостности.
Функция SendInput
вставляет события в структурах INPUT
последовательно в поток ввода клавиатуры или мыши. Эти события не чередуются с другими событиями ввода клавиатуры или мыши, вставленными либо пользователем (с клавиатурой или мышью), либо вызовами keybd_event
, mouse_event
или другими вызовами на SendInput
.
Эта функция не сбрасывает текущее состояние клавиатуры. Любые клавиши, которые уже нажаты при вызове функции, могут помешать событиям, которые генерирует эта функция. Чтобы избежать этой проблемы, проверьте состояние клавиатуры с помощью функции GetAsyncKeyState
и при необходимости исправьте.
Поскольку сенсорная клавиатура использует макросы суррогата, определенные в winnls.h для отправки ввода в систему, слушатель на клавиатурном крючке события должен декодировать вход, исходящий с сенсорной клавиатуры. Для получения дополнительной информации см. Суррогаты и дополнительные символы.
Приложение с возможностью доступа может использовать SendInput
для ввода нажатий клавиш, соответствующих клавишам быстрого запуска приложения, которые обрабатываются оболочкой. Эта функция не гарантируется для работы с другими типами приложений.