引言
在项目中想要直接调用系统的截图工具,毕竟这样感觉有原生的流畅丝滑般的感觉(雾),但是几经查找并未找到API,所以便萌生了直接模拟系统快捷键进行实现。在Windows10当中,截图工具的快捷键为Shift + Win + S
,故模拟即可。为了以后方便调用,我将这些函数抽象成了工具类
VirtualKey
由于在C#当中,系统提供的Key的数值和ASCII码里的不太一样(当初就在这里被坑了),所以就Enumerate了一下。(码分之所以前后有区别是因为前半段是使用代码直接生成的,C++的语法糖好好吃)
using System;
using System.Collections.Generic;
using System.Text;
namespace Elegant.Keyboard
{
public enum VirtualKey
{
VK_a = 97,
VK_b = 98,
VK_c = 99,
VK_d = 100,
VK_e = 101,
VK_f = 102,
VK_g = 103,
VK_h = 104,
VK_i = 105,
VK_j = 106,
VK_k = 107,
VK_l = 108,
VK_m = 109,
VK_n = 110,
VK_o = 111,
VK_p = 112,
VK_q = 113,
VK_r = 114,
VK_s = 115,
VK_t = 116,
VK_u = 117,
VK_v = 118,
VK_w = 119,
VK_x = 120,
VK_y = 121,
VK_z = 122,
VK_A = 65,
VK_B = 66,
VK_C = 67,
VK_D = 68,
VK_E = 69,
VK_F = 70,
VK_G = 71,
VK_H = 72,
VK_I = 73,
VK_J = 74,
VK_K = 75,
VK_L = 76,
VK_M = 77,
VK_N = 78,
VK_O = 79,
VK_P = 80,
VK_Q = 81,
VK_R = 82,
VK_S = 83,
VK_T = 84,
VK_U = 85,
VK_V = 86,
VK_W = 87,
VK_X = 88,
VK_Y = 89,
VK_Z = 90,
VK_0 = 48,
VK_1 = 49,
VK_2 = 50,
VK_3 = 51,
VK_4 = 52,
VK_5 = 53,
VK_6 = 54,
VK_7 = 55,
VK_8 = 56,
VK_9 = 57,
VK_LBUTTON = 0x01,
VK_RBUTTON = 0x02,
VK_CANCEL = 0x03,
VK_MBUTTON = 0x04,
VK_BACK = 0x08,
VK_TAB = 0x09,
VK_CLEAR = 0x0C,
VK_RETURN = 0x0D,
VK_SHIFT = 0x10,
VK_CONTROL = 0x11,
VK_MENU = 0x12,
VK_PAUSE = 0x13,
VK_CAPITAL = 0x14,
VK_KANA = 0x15,
VK_HANGEUL = 0x15,
VK_HANGUL = 0x15,
VK_JUNJA = 0x17,
VK_FINAL = 0x18,
VK_HANJA = 0x19,
VK_KANJI = 0x19,
VK_ESCAPE = 0x1B,
VK_CONVERT = 0x1C,
VK_NONCONVERT = 0x1D,
VK_ACCEPT = 0x1E,
VK_MODECHANGE = 0x1F,
VK_SPACE = 0x20,
VK_PRIOR = 0x21,
VK_NEXT = 0x22,
VK_END = 0x23,
VK_HOME = 0x24,
VK_LEFT = 0x25,
VK_UP = 0x26,
VK_RIGHT = 0x27,
VK_DOWN = 0x28,
VK_SELECT = 0x29,
VK_PRINT = 0x2A,
VK_EXECUTE = 0x2B,
VK_SNAPSHOT = 0x2C,
VK_INSERT = 0x2D,
VK_DELETE = 0x2E,
VK_HELP = 0x2F,
VK_LWIN = 0x5B,
VK_RWIN = 0x5C,
VK_APPS = 0x5D,
VK_NUMPAD0 = 0x60,
VK_NUMPAD1 = 0x61,
VK_NUMPAD2 = 0x62,
VK_NUMPAD3 = 0x63,
VK_NUMPAD4 = 0x64,
VK_NUMPAD5 = 0x65,
VK_NUMPAD6 = 0x66,
VK_NUMPAD7 = 0x67,
VK_NUMPAD8 = 0x68,
VK_NUMPAD9 = 0x69,
VK_MULTIPLY = 0x6A,
VK_ADD = 0x6B,
VK_SEPARATOR = 0x6C,
VK_SUBTRACT = 0x6D,
VK_DECIMAL = 0x6E,
VK_DIVIDE = 0x6F,
VK_F1 = 0x70,
VK_F2 = 0x71,
VK_F3 = 0x72,
VK_F4 = 0x73,
VK_F5 = 0x74,
VK_F6 = 0x75,
VK_F7 = 0x76,
VK_F8 = 0x77,
VK_F9 = 0x78,
VK_F10 = 0x79,
VK_F11 = 0x7A,
VK_F12 = 0x7B,
VK_F13 = 0x7C,
VK_F14 = 0x7D,
VK_F15 = 0x7E,
VK_F16 = 0x7F,
VK_F17 = 0x80,
VK_F18 = 0x81,
VK_F19 = 0x82,
VK_F20 = 0x83,
VK_F21 = 0x84,
VK_F22 = 0x85,
VK_F23 = 0x86,
VK_F24 = 0x87,
VK_NUMLOCK = 0x90,
VK_SCROLL = 0x91,
VK_LSHIFT = 0xA0,
VK_RSHIFT = 0xA1,
VK_LCONTROL = 0xA2,
VK_RCONTROL = 0xA3,
VK_LMENU = 0xA4,
VK_RMENU = 0xA5,
VK_PROCESSKEY = 0xE5,
VK_ATTN = 0xF6,
VK_CRSEL = 0xF7,
VK_EXSEL = 0xF8,
VK_EREOF = 0xF9,
VK_PLAY = 0xFA,
VK_ZOOM = 0xFB,
VK_NONAME = 0xFC,
VK_PA1 = 0xFD,
VK_OEM_CLEAR = 0xFE
}
}
VirtualKeyHelper
直接使用char
来获得VirtualKey
:
using System;
using System.Collections.Generic;
using System.Text;
namespace Elegant.Keyboard
{
public static class VirtualKeyHelper
{
public static VirtualKey GetVirtualKey(char Key)
{
if (Key > 127) { throw new Exception("Not Valid Char."); }
return (VirtualKey)Key;
}
}
}
KeyboardSimulator
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace Elegant.Keyboard
{
public static class KeyboardSimulator
{
#region Win32API调用
[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
#endregion
#region 常量声明
public const int KEYEVENTF_KEY_DOWN = 0;
public const int KEYEVENTF_KEY_UP = 2;
#endregion
#region 模拟方法
public static void KeyPress(VirtualKey Key)
{
keybd_event((byte)Key, 0, KEYEVENTF_KEY_DOWN, 0);
}
public static void KeyRelease(VirtualKey Key)
{
keybd_event((byte)Key, 0, KEYEVENTF_KEY_UP, 0);
}
#endregion
}
}
实现截图
KeyPress(VirtualKey.VK_LSHIFT);
KeyPress(VirtualKey.VK_LWIN);
KeyPress(VirtualKey.VK_S);
KeyRelease(VirtualKey.VK_S);
KeyRelease(VirtualKey.VK_LWIN);
KeyRelease(VirtualKey.VK_LSHIFT);