引言

在项目中想要直接调用系统的截图工具,毕竟这样感觉有原生的流畅丝滑般的感觉(雾),但是几经查找并未找到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);
最后修改:2020 年 09 月 10 日 01 : 08 PM
真的不买杯奶茶嘛....qwq