如何以编程方式模拟按钮按下
本文关键字:按钮 模拟 方式 编程 | 更新日期: 2023-09-27 18:33:55
如何在 .NET 中模拟按钮按下?
我可以轻松地使用自动热键进行操作:
#Persistent
SetTimer,PressTheKey,1000
Return
PressTheKey:
Send, {F5}
Return
任何应用程序都会知道按钮被按下了(就像我按下了一样)。我尝试对以下内容执行相同的操作:
[DllImport("user32.dll", SetLastError = true)]
public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
或:
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
或使用 Windows 输入模拟器 (https://inputsimulator.codeplex.com/):
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.VK_H)
它们都可以在记事本或其他一些应用程序中工作,但它们从未在我的全屏游戏中工作过。知道我该如何实现它吗?我想要一个在系统级别全局模拟点击的解决方案。
有一个名为拦截器的库,它是Windows键盘驱动程序的包装器,但是存在限制 - 即不支持win8或更高版本 - 并且似乎工作已经停止(11个月前)。如果它适合您的需求,请查看它。
我在某处读到有一些方法可以通过 DirectInput API 做到这一点 - 至于是否是这种情况,我不确定。我已经用过几次Interceptor
,它当时满足了我的需求。
希望这有帮助
也链接
编辑:固定链接
我了解到我的应用程序正在使用DirectInput(感谢Gabe)。这使我更加专注于SendInput,我设法向我的应用程序发送了一个"A"键,如下所示:
// A = 30
keyboardDirectInput.Press(30);
所有密钥代码均可在此处找到:https://msdn.microsoft.com/en-us/library/windows/desktop/bb321074%28v=vs.85%29.aspx
KeyboardDirectInput 类:
public class KeyboardDirectInput
{
[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
public void Press(VirtualKeys key)
{
INPUT[] InputData = new INPUT[2];
InputData[0].type = (int)InputType.INPUT_KEYBOARD;
InputData[0].ki.wScan = (short)key;
InputData[0].ki.dwFlags = (int)KEYEVENTF.SCANCODE;
InputData[1].type = (int)InputType.INPUT_KEYBOARD;
InputData[1].ki.wScan = (short)key;
InputData[1].ki.dwFlags = (int)(KEYEVENTF.KEYUP | KEYEVENTF.SCANCODE);
if (SendInput(2, InputData, Marshal.SizeOf(InputData[1])) == 0)
{
Logger.GetInstance().Warn("SendInput failed (CODE {0})", Marshal.GetLastWin32Error());
}
}
[StructLayout(LayoutKind.Explicit)]
public struct INPUT
{
[FieldOffset(4)]
public HARDWAREINPUT hi;
[FieldOffset(4)]
public KEYBDINPUT ki;
[FieldOffset(4)]
public MOUSEINPUT mi;
[FieldOffset(0)]
public int type;
}
[StructLayout(LayoutKind.Sequential)]
public struct HARDWAREINPUT
{
public int uMsg;
public short wParamL;
public short wParamH;
}
[StructLayout(LayoutKind.Sequential)]
public struct MOUSEINPUT
{
public int dx;
public int dy;
public int mouseData;
public int dwFlags;
public int time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
public short wVk;
public short wScan;
public int dwFlags;
public int time;
public IntPtr dwExtraInfo;
}
[Flags]
public enum KEYEVENTF
{
KEYDOWN = 0,
EXTENDEDKEY = 0x0001,
KEYUP = 0x0002,
UNICODE = 0x0004,
SCANCODE = 0x0008,
}
[Flags]
public enum InputType
{
INPUT_MOUSE = 0,
INPUT_KEYBOARD = 1,
INPUT_HARDWARE = 2
}
}