Net.Like.Xue.Tokyo/Assets/Plugins/MonKey Commander/Editor/MonKey/Hot Keys/KeyboardHook.cs

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