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
→ Ссылка
keybd_eventустарел, рекомендуется использоватьSendInput.- Есть такая библиотека в NuGet - InputSimulator, уже готовое для использования на базе того же
SendInput. - Ничего из перечисленного не требует прав администратора. Вероятно это особенность приложения, реакцию которого вы ожидаете на клавиши.
- После нажатия на клавишу ее надо отпустить.
- У вас неверная сингатура метода при импорте - 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)
}