HKMBFZ/Assets/Scripts/Szz_Scripts/KeyboardSimulator.cs

159 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using System.Runtime.InteropServices;
public enum KeyType
{
None,
// 数字
Digit0, Digit1, Digit2, Digit3, Digit4,
Digit5, Digit6, Digit7, Digit8, Digit9,
// 字母
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
// 功能键
F1, F2, F3, F4, F5, F6, F7, F8, F9, F10,
// 特殊键
Enter,
Backspace,
Space,
Plus,
Minus,
// 方向键
ArrowUp, ArrowDown, ArrowLeft, ArrowRight,
NumpadDot,
,,,,
}
public static class KeyboardSimulator
{
[DllImport("user32.dll")]
private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
private const int INPUT_KEYBOARD = 1;
private const uint KEYEVENTF_KEYUP = 0x0002;
[StructLayout(LayoutKind.Sequential)]
private struct INPUT
{
public int type;
public INPUTUNION u;
}
[StructLayout(LayoutKind.Explicit)]
private struct INPUTUNION
{
[FieldOffset(0)] public KEYBDINPUT ki;
}
[StructLayout(LayoutKind.Sequential)]
private struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public System.UIntPtr dwExtraInfo;
}
public static ushort GetVK(KeyType type)
{
switch (type)
{
// 数字
case KeyType.Digit0: return 0x30;
case KeyType.Digit1: return 0x31;
case KeyType.Digit2: return 0x32;
case KeyType.Digit3: return 0x33;
case KeyType.Digit4: return 0x34;
case KeyType.Digit5: return 0x35;
case KeyType.Digit6: return 0x36;
case KeyType.Digit7: return 0x37;
case KeyType.Digit8: return 0x38;
case KeyType.Digit9: return 0x39;
// F1-F10
case KeyType.F1: return 0x70;
case KeyType.F2: return 0x71;
case KeyType.F3: return 0x72;
case KeyType.F4: return 0x73;
case KeyType.F5: return 0x74;
case KeyType.F6: return 0x75;
case KeyType.F7: return 0x76;
case KeyType.F8: return 0x77;
case KeyType.F9: return 0x78;
case KeyType.F10: return 0x79;
// 特殊键
case KeyType.Enter: return 0x0D;
case KeyType.Backspace: return 0x08;
case KeyType.Space: return 0x20;
case KeyType.Minus: return 0xBD;
case KeyType.Plus: return 0xBB;
// 方向键
case KeyType.ArrowUp: return 0x26;
case KeyType.ArrowDown: return 0x28;
case KeyType.ArrowLeft: return 0x25;
case KeyType.ArrowRight: return 0x27;
// 字母
default:
if (type >= KeyType.A && type <= KeyType.Z)
return (ushort)((int)type - (int)KeyType.A + 0x41);
break;
}
return 0;
}
public static void PressKey(KeyType type)
{
ushort vk = GetVK(type);
if (vk == 0) return;
// 特殊处理加号Shift + =
if (type == KeyType.Plus)
{
SendKeyDown(0x10); // Shift
SendKeyPress(0xBB); // =
SendKeyUp(0x10);
return;
}
SendKeyPress(vk);
}
private static void SendKeyPress(ushort vk)
{
SendKeyDown(vk);
SendKeyUp(vk);
}
private static void SendKeyDown(ushort vk)
{
INPUT[] inputs = new INPUT[1];
inputs[0].type = INPUT_KEYBOARD;
inputs[0].u.ki.wVk = vk;
inputs[0].u.ki.dwFlags = 0;
SendInput(1, inputs, Marshal.SizeOf(typeof(INPUT)));
}
private static void SendKeyUp(ushort vk)
{
INPUT[] inputs = new INPUT[1];
inputs[0].type = INPUT_KEYBOARD;
inputs[0].u.ki.wVk = vk;
inputs[0].u.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, inputs, Marshal.SizeOf(typeof(INPUT)));
}
}