2014-01-26 00:37:15 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
2014-02-22 11:55:48 +08:00
|
|
|
|
namespace Wox.Infrastructure
|
2014-01-26 00:37:15 +08:00
|
|
|
|
{
|
|
|
|
|
|
public enum KeyEvent : int
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Key down
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
WM_KEYDOWN = 256,
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Key up
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
WM_KEYUP = 257,
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// System key up
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
WM_SYSKEYUP = 261,
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// System key down
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
WM_SYSKEYDOWN = 260
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static class InterceptKeys
|
|
|
|
|
|
{
|
|
|
|
|
|
public delegate IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam);
|
|
|
|
|
|
|
|
|
|
|
|
private static int WH_KEYBOARD_LL = 13;
|
|
|
|
|
|
|
|
|
|
|
|
public static IntPtr SetHook(LowLevelKeyboardProc proc)
|
|
|
|
|
|
{
|
|
|
|
|
|
using (Process curProcess = Process.GetCurrentProcess())
|
|
|
|
|
|
using (ProcessModule curModule = curProcess.MainModule)
|
|
|
|
|
|
{
|
|
|
|
|
|
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
|
|
|
|
public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
|
|
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
|
|
|
|
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
|
|
|
|
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, UIntPtr wParam, IntPtr lParam);
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
|
|
|
|
public static extern IntPtr GetModuleHandle(string lpModuleName);
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
|
|
|
|
|
|
public static extern short GetKeyState(int keyCode);
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
|
internal static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Explicit)]
|
|
|
|
|
|
public struct INPUT
|
|
|
|
|
|
{
|
|
|
|
|
|
[FieldOffset(0)]
|
|
|
|
|
|
public Int32 type;//0-MOUSEINPUT;1-KEYBDINPUT;2-HARDWAREINPUT
|
|
|
|
|
|
[FieldOffset(4)]
|
|
|
|
|
|
public KEYBDINPUT ki;
|
|
|
|
|
|
[FieldOffset(4)]
|
|
|
|
|
|
public MOUSEINPUT mi;
|
|
|
|
|
|
[FieldOffset(4)]
|
|
|
|
|
|
public HARDWAREINPUT hi;
|
|
|
|
|
|
}
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
|
public struct MOUSEINPUT
|
|
|
|
|
|
{
|
|
|
|
|
|
public Int32 dx;
|
|
|
|
|
|
public Int32 dy;
|
|
|
|
|
|
public Int32 mouseData;
|
|
|
|
|
|
public Int32 dwFlags;
|
|
|
|
|
|
public Int32 time;
|
|
|
|
|
|
public IntPtr dwExtraInfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
|
public struct KEYBDINPUT
|
|
|
|
|
|
{
|
|
|
|
|
|
public Int16 wVk;
|
|
|
|
|
|
public Int16 wScan;
|
|
|
|
|
|
public Int32 dwFlags;
|
|
|
|
|
|
public Int32 time;
|
|
|
|
|
|
public IntPtr dwExtraInfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
|
public struct HARDWAREINPUT
|
|
|
|
|
|
{
|
|
|
|
|
|
public Int32 uMsg;
|
|
|
|
|
|
public Int16 wParamL;
|
|
|
|
|
|
public Int16 wParamH;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|