只是尝试一些 WinAPI 的东西。我有一个 C# 控制台应用程序,用于SendInput
模拟某个键盘键的 akeydown
和keyup
事件。但它不起作用,也许我在做一些愚蠢的事情,没有发送密钥,不确定我错过了什么 - (尝试发送“W”,休眠 5 秒,打开一些文本编辑器查看神奇的信在那里):
static void Main(string[] args)
{
INPUT input = new INPUT();
input.type = (int)InputType.INPUT_KEYBOARD;
input.U.ki.wScan = 0;
input.U.ki.time = 0;
input.U.ki.dwExtraInfo = UIntPtr.Zero;
input.U.ki.wVk = VirtualKeyShort.KEY_W;
System.Threading.Thread.Sleep(5000);
input.U.ki.dwFlags = KEYEVENTF.KEYDOWN;
NativeCalls.SendInput(1, new INPUT[] { input }, INPUT.Size);
input.U.ki.dwFlags = KEYEVENTF.KEYUP;
NativeCalls.SendInput(1, new INPUT[] { input }, INPUT.Size);
return;
}
定义:
public static class NativeCalls
{
[DllImport("user32.dll")]
public static extern uint SendInput(
uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize);
}
[StructLayout(LayoutKind.Sequential)]
public struct INPUT
{
internal uint type;
internal InputUnion U;
internal static int Size
{
get { return Marshal.SizeOf(typeof(INPUT)); }
}
}
[StructLayout(LayoutKind.Explicit)]
internal struct InputUnion
{
[FieldOffset(0)]
internal KEYBDINPUT ki;
}
[StructLayout(LayoutKind.Sequential)]
internal struct KEYBDINPUT
{
internal VirtualKeyShort wVk;
internal ScanCodeShort wScan;
internal KEYEVENTF dwFlags;
internal int time;
internal UIntPtr dwExtraInfo;
}
[Flags]
internal enum KEYEVENTF : uint
{
KEYDOWN = 0x0000,
EXTENDEDKEY = 0x0001,
KEYUP = 0x0002,
SCANCODE = 0x0008,
UNICODE = 0x0004
}
internal enum InputType { INPUT_MOUSE = 0, INPUT_KEYBOARD = 1, INPUT_HARDWARE = 2 }
internal enum VirtualKeyShort : short
{
// keys
KEY_W = 0x57,
// more keys
}
我究竟做错了什么?为什么没有发送密钥?
谢谢 :)