287 lines
6.0 KiB
C#
287 lines
6.0 KiB
C#
#if UNITY_EDITOR
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
using Debug = UnityEngine.Debug;
|
|
|
|
namespace MonKey.Internal
|
|
{
|
|
//big thanks to keyboardP
|
|
//https://stackoverflow.com/questions/17579658/
|
|
//how-to-intercept-all-the-keyboard-events-and-prevent-losing-focus-in-a-winforms
|
|
internal class KeyboardHook
|
|
{
|
|
private const int WhKeyboardLL = 13;
|
|
private const int WMKeyDown = 0x0100;
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
private static extern IntPtr SetWindowsHookEx(int idHook,
|
|
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
|
|
IntPtr wParam, IntPtr lParam);
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
private static extern IntPtr GetModuleHandle(string lpModuleName);
|
|
|
|
private readonly IntPtr hookID = IntPtr.Zero;
|
|
|
|
|
|
|
|
public KeyboardHook()
|
|
{
|
|
UnhookWindowsHookEx(hookID);
|
|
hookID = SetHook(HookCallback);
|
|
}
|
|
|
|
~KeyboardHook()
|
|
{
|
|
UnhookWindowsHookEx(hookID);
|
|
}
|
|
|
|
private IntPtr SetHook(LowLevelKeyboardProc proc)
|
|
{
|
|
using (Process curProcess = Process.GetCurrentProcess())
|
|
using (ProcessModule curModule = curProcess.MainModule)
|
|
{
|
|
return SetWindowsHookEx(WhKeyboardLL, proc,
|
|
GetModuleHandle(curModule.ModuleName), 0);
|
|
}
|
|
}
|
|
|
|
private delegate IntPtr LowLevelKeyboardProc(
|
|
int nCode, IntPtr wParam, IntPtr lParam);
|
|
|
|
private IntPtr HookCallback(
|
|
int nCode, IntPtr wParam, IntPtr lParam)
|
|
{
|
|
|
|
try
|
|
{
|
|
if (nCode >= 0 && wParam == (IntPtr)WMKeyDown)
|
|
{
|
|
int vkCode = Marshal.ReadInt32(lParam);
|
|
|
|
WindowsKeyCode code = (WindowsKeyCode) vkCode;
|
|
Debug.Log(code);
|
|
}
|
|
return CallNextHookEx(hookID, nCode, wParam, lParam);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
Debug.Log("Failed to parse the key");
|
|
|
|
return CallNextHookEx(hookID, nCode, wParam, lParam);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Copy from windows form to not have to use a reference to it
|
|
public enum WindowsKeyCode
|
|
{
|
|
LEFT_MOUSE,
|
|
RIGHT_MOUSE,
|
|
CONTROL_BREAK_PROCESSING,
|
|
MIDDLE_MOUSE,
|
|
X1_MOUSE,
|
|
X2_MOUSE,
|
|
UNDEFINED,
|
|
BACKSPACE,
|
|
TAB,
|
|
RESERVED,
|
|
CLEAR,
|
|
ENTER,
|
|
UNDEFINED2,
|
|
SHIFT,
|
|
CTRL,
|
|
ALT,
|
|
PAUSE,
|
|
CAPS_LOCK,
|
|
IME_KANA_MODE,
|
|
IME_HANGUEL_MODE,
|
|
IME_HANGUL_MODE,
|
|
UNDEFINED3,
|
|
IME_JUNJA_MODE,
|
|
IME_FINAL_MODE,
|
|
IME_HANJA_MODE,
|
|
IME_KANJI_MODE,
|
|
UNDEFINED4,
|
|
ESC,
|
|
IME_CONVERT,
|
|
IME_NONCONVERT,
|
|
IME_ACCEPT,
|
|
IME_MODE_CHANGE_REQUEST,
|
|
SPACEBAR,
|
|
PAGE_UP,
|
|
PAGE_DOWN,
|
|
END,
|
|
HOME,
|
|
LEFT_ARROW,
|
|
UP_ARROW,
|
|
RIGHT_ARROW,
|
|
DOWN_ARROW,
|
|
SELECT,
|
|
PRINT,
|
|
EXECUTE,
|
|
PRINT_SCREEN,
|
|
INS,
|
|
DEL,
|
|
HELP,
|
|
ZERO,
|
|
ONE,
|
|
TWO,
|
|
THREE,
|
|
FOUR,
|
|
FIVE,
|
|
SIX,
|
|
SEVEN,
|
|
EIGHT,
|
|
NINE,
|
|
UNDEFINED5,
|
|
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,
|
|
LEFT_WINDOWS,
|
|
RIGHT_WINDOWS,
|
|
APPLICATIONS,
|
|
RESERVED2,
|
|
COMPUTER_SLEEP,
|
|
NUMERICPAD_0,
|
|
NUMERICPAD_1,
|
|
NUMERICPAD_2,
|
|
NUMERICPAD_3,
|
|
NUMERICPAD_4,
|
|
NUMERICPAD_5,
|
|
NUMERICPAD_6,
|
|
NUMERICPAD_7,
|
|
NUMERICPAD_8,
|
|
NUMERICPAD_9,
|
|
MULTIPLY,
|
|
ADD,
|
|
SEPARATOR,
|
|
SUBTRACT,
|
|
DECIMAL,
|
|
DIVIDE,
|
|
F1,
|
|
F2,
|
|
F3,
|
|
F4,
|
|
F5,
|
|
F6,
|
|
F7,
|
|
F8,
|
|
F9,
|
|
F10,
|
|
F11,
|
|
F12,
|
|
F13,
|
|
F14,
|
|
F15,
|
|
F16,
|
|
F17,
|
|
F18,
|
|
F19,
|
|
F20,
|
|
F21,
|
|
F22,
|
|
F23,
|
|
F24,
|
|
UNASSIGNED6,
|
|
NUM_LOCK,
|
|
SCROLL_LOCK,
|
|
OEM_SPECIFIC2,
|
|
UNASSIGNED7,
|
|
LEFT_SHIFT,
|
|
RIGHT_SHIFT,
|
|
LEFT_CONTROL,
|
|
RIGHT_CONTROL,
|
|
LEFT_MENU,
|
|
RIGHT_MENU,
|
|
BROWSER_BACK,
|
|
BROWSER_FORWARD,
|
|
BROWSER_REFRESH,
|
|
BROWSER_STOP,
|
|
BROWSER_SEARCH,
|
|
BROWSER_FAVORITES,
|
|
BROWSER_START_AND_HOME,
|
|
VOLUME_MUTE,
|
|
VOLUME_DOWN,
|
|
VOLUME_UP,
|
|
NEXT_TRACK,
|
|
PREVIOUS_TRACK,
|
|
STOP_MEDIA,
|
|
PLAY_PAUSE_MEDIA,
|
|
START_MAIL,
|
|
SELECT_MEDIA,
|
|
START_APPLICATION_1,
|
|
START_APPLICATION_2,
|
|
RESERVED3,
|
|
SEMICOLON,
|
|
PLUS,
|
|
COMMA,
|
|
MINUS,
|
|
DOT,
|
|
MISC1,
|
|
MISC2,
|
|
MISC3,
|
|
MISC4,
|
|
MISC5,
|
|
MISC6,
|
|
MISC7,
|
|
MISC8,
|
|
MISC9,
|
|
RESERVED8,
|
|
OEM_SPECIFIC3,
|
|
ANGLE_BRACKET,
|
|
OEM_SPECIFIC4,
|
|
IME_PROCESS,
|
|
OEM_SPECIFIC5,
|
|
NONE,
|
|
UNASSIGNED9,
|
|
OEM_SPECIFI6,
|
|
ATTN,
|
|
CR_SEL,
|
|
EX_SEL,
|
|
ERASE_EOF,
|
|
PLAY,
|
|
ZOOM,
|
|
RESERVED4,
|
|
PA1,
|
|
CLEAR2,
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif |