Win32 эмуляция нажатия клавиш без прав администратора

Можно ли как то реализовать эмуляцию нажатия клавиш без прав администратора?

так все работает только через админа:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern void keybd_event(uint bVk, uint bScan, uint dwFlags, uint dwExtraInfo);

        private const int VK_VOLUME_DOWN = 0xAE;
        private const int VK_VOLUME_UP = 0xAF;
        private const int VK_VOLUME_MUTE = 0xAD;

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            keybd_event(VK_VOLUME_UP, 0, 0, 0);
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            keybd_event(VK_VOLUME_DOWN, 0, 0, 0);
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            keybd_event(VK_VOLUME_MUTE, 0, 0, 0);
        }
    }

Ответы (1 шт):

Автор решения: aepot
  1. keybd_event устарел, рекомендуется использовать SendInput.
  2. Есть такая библиотека в NuGet - InputSimulator, уже готовое для использования на базе того же SendInput.
  3. Ничего из перечисленного не требует прав администратора. Вероятно это особенность приложения, реакцию которого вы ожидаете на клавиши.
  4. После нажатия на клавишу ее надо отпустить.
  5. У вас неверная сингатура метода при импорте - 1, 2.

Самый простой пример.

[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

private const byte VK_VOLUME_UP = 0xAF;

private const int KEYEVENTF_KEYDOWN = 0x00;
private const int KEYEVENTF_KEYUP = 0x02;

private async void Button_Click(object sender, RoutedEventArgs e)
{
    keybd_event(VK_VOLUME_UP, 0, KEYEVENTF_KEYDOWN, 0);
    await Task.Delay(50);
    keybd_event(VK_VOLUME_UP, 0, KEYEVENTF_KEYUP, 0)
}
→ Ссылка