zoukankan      html  css  js  c++  java
  • c# 2016QQ自动登录程序

    程序是抓QQ主程序窗体句柄,通过移位定位到QQ 输入框,虚拟键盘输入后,ALT切换到密码框的方式实现的

    附程序:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Drawing;
    using System.Diagnostics;
    using System.Threading;
    using System.Windows.Forms;
    namespace QQ2016AutoLogin
    {
    class QQ2016AutoLogin2
    {

    ///<summary>
    /// 查找窗口句柄
    ///</summary>
    ///<param name="lpClassName">窗口类名</param>
    ///<param name="lpWindowName">窗口标题</param>
    ///<returns></returns>
    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    ///<summary>
    /// 查找子窗口句柄
    ///</summary>
    ///<param name="hwndParent">要查找子窗口的父窗口句柄</param>
    ///<param name="hwndChildAfter">上一个子窗口句柄</param>
    ///<param name="lpszClass">子窗口类名</param>
    ///<param name="lpszWindow">窗口标题</param>
    ///<returns></returns>
    [DllImport("User32.DLL")]
    private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    ///<summary>
    /// 设置指定窗口为当前活动窗口
    ///</summary>
    ///<param name="hWnd">窗口句柄</param>
    [DllImport("User32.DLL")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    ///<summary>
    /// 可将最小化窗口还原
    ///</summary>
    ///<param name="hWnd"></param>
    ///<param name="nCmdShow"></param>
    ///<returns></returns>
    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    ///<summary>
    /// 向指定窗口发送字符串
    ///</summary>
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);

    ///<summary>
    /// 可向指定窗口发送按键
    ///</summary>
    [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern int SendMessage(IntPtr hwnd, uint wMsg, uint wParam, uint lParam);

    ///<summary>
    /// 发送按键消息用PostMessage比较好,SendMessage有时会不起作用
    ///</summary>
    [DllImport("user32.dll", EntryPoint = "PostMessage", SetLastError = true)]
    private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    // 注意,运行时知道如何列集一个矩形
    [DllImport("user32.dll")]
    public static extern int GetWindowRect(int hwnd, ref Rectangle rc);

    //SendMessage参数
    const int WM_KEYDOWN = 0x0100;//普通按键按下
    const int WM_KEYUP = 0x0101;//普通按键放开
    const int WM_SYSKEYDOWN = 0x104;//系统按键按下
    const int WM_SYSKEYUP = 0x105;//系统按键按下放开
    const int WM_SYSCHAR = 0x0106;//发送单个字符
    const int WM_SETTEXT = 0x000C;//发送文本
    const int WM_CLICK = 0x00F5;//模拟鼠标左键点击
    const int WM_SETFOCUS = 0x0007;//设置焦点
    const int WM_COPY=0x301; // 复制
       const int WM_CUT=0x300; // 剪切
       const int WM_PASTE=0x302; //粘帖

    const int SW_RESTORE = 9;//恢复最小化的窗口

    static IntPtr mainHwnd = IntPtr.Zero;//主窗口句柄

    public static void AutoLogin(string qq, string passwd)
    {
    // mainHwnd = FindWindow("TXGuiFoundation", "QQ");
    // if (mainHwnd != IntPtr.Zero)
    // {
    //Rectangle rectMain = new Rectangle();
    //GetWindowRect(mainHwnd.ToInt32(), ref rectMain);
    //if (rectMain.Height - rectMain.Y != 250)//rectMain.Width-rectMain.X
    //{

    Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Tencent\PlatForm_Type_List\1", true);
    string qq2010Path = regKey.GetValue("TypePath").ToString();
    regKey.Close();
    if (!string.IsNullOrEmpty(qq2010Path))
    {
    Process.Start(qq2010Path);
    Thread.Sleep(500);
    while (true)
    {
    mainHwnd = FindWindow("TXGuiFoundation", "QQ");
    if (mainHwnd != IntPtr.Zero)
    break;
    Thread.Sleep(100);
    }
    }
    else
    {
    MessageBox.Show("未能找到QQ2010安装目录,请手动打开QQ程序!");
    return;
    }
    // }
    // }
    mainHwnd = FindWindow("TXGuiFoundation", "QQ");
    ShowWindow(mainHwnd, SW_RESTORE);//将最小化窗口还原
    SetForegroundWindow(mainHwnd); //激活窗口
    Thread.Sleep(500);

    //获取账号框句柄 此法已经没用
    //// IntPtr userHwnd = FindWindowEx(mainHwnd, IntPtr.Zero, "ATL:30A551F0", "");
    // SendMessage(passHwnd, WM_SETFOCUS, 0, 0);//设置焦点到密码框,发送tab键不能转到密码框
    Rectangle rect = new Rectangle();
    GetWindowRect(mainHwnd.ToInt32(), ref rect);//获取文本框相对屏幕中的位置
    int mainwX = rect.X;
    int mainwY = rect.Y;
    int mainwleft = rect.Left;
    int mainwheight = rect.Height;
    //光标移动到QQ号码框,并模拟鼠标左键单击
    WindowsAPI.SendMouseLeftClick((int)WindowsAPI.MOUSEEVENTF.LEFTDOWN, (int)WindowsAPI.MOUSEEVENTF.LEFTUP, rect.X + 200, rect.Y + 275);
    //删除号码框里的号码或者直接输入号码,因为此时号码框已经变蓝,可以直接输入;此处用复制黏贴的方式,先获取焦点,然后复制黏贴
    //没有句柄无法发消息 WindowsAPI.SendUnicode("12345");
    //复制号码到剪切板
    //必须聚焦
    // Thread.Sleep(1000);
    SendMessage(mainHwnd, WM_SETFOCUS, 0, 0);
    //删除当前号码
    Thread.Sleep(100);
    //WindowsAPI.SendDelCode(10);
    // WindowsAPI.SendSingleKey(WindowsAPI.VK_TAB);

    for (int i = 0; i < 13; i++)
    {
    Thread.Sleep(100);
    SendMessage(mainHwnd, WM_KEYDOWN, WindowsAPI.VK_BACK, 0);//发送
    SendMessage(mainHwnd, WM_KEYUP, WindowsAPI.VK_BACK, 0);//释放
    }

    Clipboard.SetDataObject(qq);
    SendMessage(mainHwnd, WM_PASTE, 0,0);
    Clipboard.Clear();
    Thread.Sleep(1000);
    SendMessage(mainHwnd, WM_KEYDOWN, WindowsAPI.VK_TAB, 0);//发送tab
    SendMessage(mainHwnd, WM_KEYUP, WindowsAPI.VK_TAB, 0);//释放tab
    WindowsAPI.SendDelCode(10);//删除原来记住的密码
    Thread.Sleep(1000);
    WindowsAPI.SendNoUnicode(passwd);
    ////发送回车键
    //SendMessage(mainHwnd, WM_KEYDOWN, WindowsAPI.VK_TAB, 0);//发送tab
    //SendMessage(mainHwnd, WM_KEYUP, WindowsAPI.VK_TAB, 0);//释放tab
    Thread.Sleep(1000);
    for (int i = 0; i <= 5; i++)
    {
    Thread.Sleep(200);
    WindowsAPI.SendSingleKey(WindowsAPI.VK_TAB);
    }

    SendMessage(mainHwnd, WM_KEYDOWN, WindowsAPI.VK_RETURN, 0);//发送回车
    SendMessage(mainHwnd, WM_KEYUP, WindowsAPI.VK_RETURN, 0);//释放回车



    //PostMessage(mainHwnd, WM_KEYDOWN, 13, 0);
    //PostMessage(mainHwnd, WM_KEYUP, 13, 0);
    //SendMessage(mainHwnd, WM_KEYDOWN, 0x0D, 0);
    //Thread.Sleep(10);
    //WindowsAPI.SendDelCode(10);//删除原来记住的密码
    //WindowsAPI.SendNoUnicode(passwd);
    //Thread.Sleep(500);
    ////发送回车键
    ////PostMessage(mainHwnd, WM_KEYDOWN, 13, 0);
    ////PostMessage(mainHwnd, WM_KEYUP, 13, 0);
    //SendMessage(mainHwnd, WM_KEYDOWN, 0x0D, 0);

    // Thread.Sleep(1000);
    // SendMessage(mainHwnd, WM_KEYDOWN, WindowsAPI.VK_BACK, 0);

    // Thread.Sleep(1000);
    //if (qq != "")
    //{
    // Clipboard.SetDataObject(qq);
    // MessageBox.Show("已复制到剪贴板!");
    //}

    //Rectangle rect = new Rectangle(); //下边获取输入窗句柄,此法已经失效
    //GetWindowRect(userHwnd.ToInt32(), ref rect);//获取文本框居中相对屏幕中的位置
    ////模拟鼠标左键点击事件,将Tab还原到文本框,WM_SETFOCUS不能还原Tab
    //WindowsAPI.SendMouseLeftClick((int)WindowsAPI.MOUSEEVENTF.LEFTDOWN, (int)WindowsAPI.MOUSEEVENTF.LEFTUP, rect.Left + 5, rect.Height - 10);

    ////删除原来qq号码
    //SendMessage(userHwnd, WM_SYSKEYDOWN, WindowsAPI.VK_Delete, 0);
    //SendMessage(userHwnd, WM_SYSKEYUP, WindowsAPI.VK_Delete, 0);

    //SendMessage(userHwnd, WM_SETTEXT, IntPtr.Zero, qq);//发送qq号码
    //Thread.Sleep(10);
    ////发送tab键,两种方法
    //SendMessage(userHwnd, WM_KEYDOWN, WindowsAPI.VK_TAB, 0);//发送tab
    //SendMessage(userHwnd, WM_KEYUP, WindowsAPI.VK_TAB, 0);//释放tab
    //WindowsAPI.SendSingleKey(WindowsAPI.VK_TAB);


    //Thread.Sleep(10);
    //WindowsAPI.SendDelCode(10);//删除原来记住的密码
    //WindowsAPI.SendNoUnicode(passwd);
    //Thread.Sleep(500);
    ////发送回车键
    ////PostMessage(mainHwnd, WM_KEYDOWN, 13, 0);
    ////PostMessage(mainHwnd, WM_KEYUP, 13, 0);
    //SendMessage(mainHwnd, WM_KEYDOWN, 0x0D, 0);


    }
    }
    }

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace QQ2016AutoLogin
        {
        public class WindowsAPI
        {
        [DllImport("user32.dll")]
        private static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize);
    
        [DllImport("user32.dll")]
        private static extern UInt32 SendInput(UInt32 nInputs, INPUT[] pInputs, int cbSize);
    
        [DllImport("user32.dll", EntryPoint ="GetMessageExtraInfo", SetLastError =true)]
        private static extern IntPtr GetMessageExtraInfo();
    
        [DllImport("user32.dll")]
        private static extern bool SetCursorPos(int X, int Y);//设置鼠标位置
        ///<summary>
        /// 向指定窗口发送字符串
        ///</summary>
       
        public enum InputType
        {
        INPUT_MOUSE =0,
        INPUT_KEYBOARD =1,
        INPUT_HARDWARE =2,
        }
    
        [Flags()]
        public enum MOUSEEVENTF
        {
        MOVE =0x0001, //mouse move
        LEFTDOWN =0x0002, //left button down
        LEFTUP =0x0004, //left button up
        RIGHTDOWN =0x0008, //right button down
        RIGHTUP =0x0010, //right button up
        MIDDLEDOWN =0x0020, //middle button down
        MIDDLEUP =0x0040, //middle button up
        XDOWN =0x0080, //x button down
        XUP =0x0100, //x button down
        WHEEL =0x0800, //wheel button rolled
        VIRTUALDESK =0x4000, //map to entire virtual desktop
        ABSOLUTE =0x8000, //absolute move
        }
    
        [Flags()]
        public enum KEYEVENTF
        {
        EXTENDEDKEY =0x0001,
        KEYUP =0x0002,
        UNICODE =0x0004,
        SCANCODE =0x0008,
        }
    
        [StructLayout(LayoutKind.Explicit)]
        private 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)]
        private struct MOUSEINPUT
        {
        public Int32 dx;
        public Int32 dy;
        public Int32 mouseData;
        public Int32 dwFlags;
        public Int32 time;
        public IntPtr dwExtraInfo;
        }
    
        [StructLayout(LayoutKind.Sequential)]
        private struct KEYBDINPUT
        {
        public Int16 wVk;
        public Int16 wScan;
        public Int32 dwFlags;
        public Int32 time;
        public IntPtr dwExtraInfo;
        }
    
        [StructLayout(LayoutKind.Sequential)]
        private struct HARDWAREINPUT
        {
        public Int32 uMsg;
        public Int16 wParamL;
        public Int16 wParamH;
        }
    
        ///<summary>
        /// 模拟鼠标左键点击
        ///</summary>
        public static void SendMouseClick()
        {
        INPUT input_down =new INPUT();
        input_down.mi.dx =0;
        input_down.mi.dy =0;
        input_down.mi.mouseData =0;
        input_down.mi.dwFlags = (int)MOUSEEVENTF.LEFTDOWN;
        SendInput(1, ref input_down, Marshal.SizeOf(input_down));
    
        INPUT input_up = input_down;
        input_up.mi.dwFlags = (int)MOUSEEVENTF.LEFTUP;
        SendInput(1, ref input_up, Marshal.SizeOf(input_up));
        }
    
        ///<summary>
        /// 在x,y位置模拟鼠标点击
        ///</summary>
        ///<param name="dwFlagsDown">MOUSEEVENTF</param>
        ///<param name="dwFlagsUp">MOUSEEVENTF</param>
        ///<param name="x">点击的x坐标</param>
        ///<param name="y">点击的y坐标</param>
        public static void SendMouseLeftClick(int dwFlagsDown, int dwFlagsUp, int x, int y)
        {
        INPUT[] input =new INPUT[2];
        MOUSEINPUT mouseinput_down =new MOUSEINPUT();
        MOUSEINPUT mouseinput_up =new MOUSEINPUT();
    
        mouseinput_down.dwFlags = dwFlagsDown;
        mouseinput_up.dwFlags = dwFlagsUp;
        input[0].type = (int)InputType.INPUT_MOUSE;
        input[0].mi = mouseinput_down;
        input[1].type = (int)InputType.INPUT_MOUSE;
        input[1].mi = mouseinput_up;
         SetCursorPos(x, y);
        Thread.Sleep(5000);
        SendInput(1, input, Marshal.SizeOf(input[0]));//down
        SendInput(1, input, Marshal.SizeOf(input[1]));//up
     
      //  SendInput(1, input, Marshal.SizeOf(input[0]));//down
      //  Thread.Sleep(2000);
      //  SendInput(1, input, Marshal.SizeOf(input[1]));//up
        }
    
        ///<summary>
        /// 发送单一按键,如Tab,Shift,Home,End
        ///</summary>
        ///<param name="wVk">VK_TAB,VK_SHIFT</param>
        public static void SendSingleKey(int wVk)
        {
        INPUT input_down =new INPUT();
        input_down.type = (int)InputType.INPUT_KEYBOARD;
        input_down.ki.dwFlags =0;
        input_down.ki.wVk = (short)wVk;
        SendInput(1, ref input_down, Marshal.SizeOf(input_down));//keydown
    
        INPUT input_up =new INPUT();
        input_up.type = (int)InputType.INPUT_KEYBOARD;
        input_up.ki.wVk = (short)wVk;
        input_up.ki.dwFlags = (int)KEYEVENTF.KEYUP;
        SendInput(1, ref input_up, Marshal.SizeOf(input_up));//keyup 
        }
    
        ///<summary>
        /// 发送组合键
        ///</summary>
        ///<param name="wVk">VK_SHIFT,VK_TAB;如Shift+A,SendNoUnicodeByParam(VK_SHIFT,Keys.A)</param>
        public static void SendKeyCombination(int wVk, Keys key)
        {
        INPUT[] inDown =new INPUT[4];
        inDown[0] =new INPUT();
        inDown[1] =new INPUT();
        inDown[2] =new INPUT();
        inDown[3] =new INPUT();
        inDown[0].type = inDown[1].type = inDown[2].type = inDown[3].type = (int)InputType.INPUT_KEYBOARD;
        inDown[0].ki.wVk = inDown[2].ki.wVk = (short)wVk;
        inDown[1].ki.wVk = inDown[3].ki.wVk = (short)key;
        inDown[0].ki.dwFlags = inDown[1].ki.dwFlags =0;
        inDown[2].ki.dwFlags = inDown[3].ki.dwFlags = (int)KEYEVENTF.KEYUP;
        SendInput(1, ref inDown[0], Marshal.SizeOf(inDown[0]));//down
        SendInput(1, ref inDown[1], Marshal.SizeOf(inDown[1]));//char down
        SendInput(1, ref inDown[2], Marshal.SizeOf(inDown[2]));//up
        SendInput(1, ref inDown[3], Marshal.SizeOf(inDown[3]));//char up
        }
    
        ///<summary>
        /// 发送Del键
        ///</summary>
        ///<param name="count">发送Del键个数</param>
        public static void SendDelCode(int count)
        {
        if (count >0)
        {
        for (int i =0; i < count; i++)
        {
        INPUT clear_down =new INPUT();
        clear_down.type = (int)InputType.INPUT_KEYBOARD;
        clear_down.ki.dwFlags =0;
        clear_down.ki.wVk = VK_BACK;
        SendInput(1, ref clear_down, Marshal.SizeOf(clear_down));//down
        INPUT clear_up =new INPUT();
        clear_up.type = (int)InputType.INPUT_KEYBOARD;
        clear_up.ki.wVk = VK_BACK;
        clear_up.ki.dwFlags = (int)KEYEVENTF.KEYUP;
        SendInput(1, ref clear_up, Marshal.SizeOf(clear_up));//keyup
        }
        }
        }
    
        ///<summary>
        /// 发送unicode字符,可发送任意字符(包括汉字),但不能作用于qq上
        ///</summary>
        ///<param name="message">发送的字符串</param>
        public static void SendUnicode(string message)
        {
        for (int i =0; i < message.Length; i++)
        {
        INPUT input_down =new INPUT();
        input_down.type = (int)InputType.INPUT_KEYBOARD;
        input_down.ki.dwFlags = (int)KEYEVENTF.UNICODE;
        input_down.ki.wScan = (short)message[i];
        SendInput(1, ref input_down, Marshal.SizeOf(input_down));//keydown
    
        INPUT input_up =new INPUT();
        input_up.type = (int)InputType.INPUT_KEYBOARD;
        input_up.ki.wScan = (short)message[i];
        input_up.ki.dwFlags = (int)(KEYEVENTF.KEYUP | KEYEVENTF.UNICODE);
        SendInput(1, ref input_up, Marshal.SizeOf(input_up));//keyup 
        }
        }
    
        ///<summary>
        /// 发送非unicode字符
        ///</summary>
        ///<param name="message">发送的字符串</param>
        public static void SendNoUnicode(string message)
        {
        string lower ="abcdefghijklmnopqrstuvwxyz+-*/. []\;',.`";//密码是小写字母和+ - * / .[]\;',.`和空格
        string upper ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";//密码是大写字母
        string other ="~!@#$%^&()_{}|:"<>?=";
    
        for (int i =0; i < message.Length; i++)
        {
        short sendChar =0;
    
        if (other.IndexOf(message[i].ToString()) >-1)
        {
        sendChar = (short)getKeysByChar2(message[i]);
        INPUT[] inDown =new INPUT[4];
        inDown[0] =new INPUT();
        inDown[1] =new INPUT();
        inDown[2] =new INPUT();
        inDown[3] =new INPUT();
        inDown[0].type = inDown[1].type = inDown[2].type = inDown[3].type = (int)InputType.INPUT_KEYBOARD;
        inDown[0].ki.wVk = inDown[2].ki.wVk = (int)VK_SHIFT;
        inDown[1].ki.wVk = inDown[3].ki.wVk = sendChar;
        inDown[0].ki.dwFlags = inDown[1].ki.dwFlags =0;
        inDown[2].ki.dwFlags = inDown[3].ki.dwFlags = (int)KEYEVENTF.KEYUP;
        SendInput(1, ref inDown[0], Marshal.SizeOf(inDown[0]));//shift down
        SendInput(1, ref inDown[1], Marshal.SizeOf(inDown[1]));//char down
        SendInput(1, ref inDown[2], Marshal.SizeOf(inDown[2]));//shift up
        SendInput(1, ref inDown[3], Marshal.SizeOf(inDown[3]));//char up
        continue;
        }
        else if (upper.IndexOf(message[i].ToString()) >-1)//如果是大写字母,和Shift一起发送
        {
        sendChar = (short)getKeysByChar(message[i]);
        //INPUT[] inDown = new INPUT[4];
        //inDown[0] = new INPUT();
        //inDown[1] = new INPUT();
        //inDown[2] = new INPUT();
        //inDown[3] = new INPUT();
        //inDown[0].type = inDown[1].type = inDown[2].type = inDown[3].type = (int)InputType.INPUT_KEYBOARD;
        //inDown[0].ki.wVk = inDown[2].ki.wVk = (int)VK_SHIFT;
        //inDown[1].ki.wVk = inDown[3].ki.wVk = sendChar;
        //inDown[2].ki.dwFlags = inDown[3].ki.dwFlags = (int)KEYEVENTF.KEYUP;
        //SendInput(4, inDown, Marshal.SizeOf(inDown[0]));
        //上面发送组合键不能作用于QQ,QQ必须一个一个的发送
        INPUT[] inDown =new INPUT[4];
        inDown[0] =new INPUT();
        inDown[1] =new INPUT();
        inDown[2] =new INPUT();
        inDown[3] =new INPUT();
        inDown[0].type = inDown[1].type = inDown[2].type = inDown[3].type = (int)InputType.INPUT_KEYBOARD;
        inDown[0].ki.wVk = inDown[2].ki.wVk = (int)VK_SHIFT;
        inDown[1].ki.wVk = inDown[3].ki.wVk = sendChar;
        inDown[0].ki.dwFlags = inDown[1].ki.dwFlags =0;
        inDown[2].ki.dwFlags = inDown[3].ki.dwFlags = (int)KEYEVENTF.KEYUP;
        SendInput(1, ref inDown[0], Marshal.SizeOf(inDown[0]));//shift down
        SendInput(1, ref inDown[1], Marshal.SizeOf(inDown[1]));//char down
        SendInput(1, ref inDown[2], Marshal.SizeOf(inDown[2]));//shift up
        SendInput(1, ref inDown[3], Marshal.SizeOf(inDown[3]));//char up
        continue;
        }
        else if (lower.IndexOf(message[i].ToString()) >-1)//小写字母
        {
        sendChar = (short)getKeysByChar(message[i]);
        }
        else
        {
        sendChar = (short)message[i];//数字
        }
    
        INPUT input_down =new INPUT();
        input_down.type = (int)InputType.INPUT_KEYBOARD;
        input_down.ki.dwFlags =0;
        input_down.ki.wVk = sendChar;
        SendInput(1, ref input_down, Marshal.SizeOf(input_down));//keydown
    
        INPUT input_up =new INPUT();
        input_up.type = (int)InputType.INPUT_KEYBOARD;
        input_up.ki.wVk = sendChar;
        input_up.ki.dwFlags = (int)KEYEVENTF.KEYUP;
        SendInput(1, ref input_up, Marshal.SizeOf(input_up));//keyup 
        }
        }
    
        private static Keys getKeysByChar(char c)
        {
        string str ="abcdefghijklmnopqrstuvwxyz+-*/. []\;',.`";
        int index = str.IndexOf(c.ToString().ToLower());
        switch (index)
        {
        case 0:
        return Keys.A;
        case 1:
        return Keys.B;
        case 2:
        return Keys.C;
        case 3:
        return Keys.D;
        case 4:
        return Keys.E;
        case 5:
        return Keys.F;
        case 6:
        return Keys.G;
        case 7:
        return Keys.H;
        case 8:
        return Keys.I;
        case 9:
        return Keys.J;
        case 10:
        return Keys.K;
        case 11:
        return Keys.L;
        case 12:
        return Keys.M;
        case 13:
        return Keys.N;
        case 14:
        return Keys.O;
        case 15:
        return Keys.P;
        case 16:
        return Keys.Q;
        case 17:
        return Keys.R;
        case 18:
        return Keys.S;
        case 19:
        return Keys.T;
        case 20:
        return Keys.U;
        case 21:
        return Keys.V;
        case 22:
        return Keys.W;
        case 23:
        return Keys.X;
        case 24:
        return Keys.Y;
        case 25:
        return Keys.Z;
        case 26:
        return Keys.Add;
        case 27:
        return Keys.Subtract;
        case 28:
        return Keys.Multiply;
        case 29:
        return Keys.Divide;
        case 30:
        return Keys.Decimal;
        case 31:
        return Keys.Space;
        case 32:
        return Keys.Oem4;//[]\;',.
        case 33:
        return Keys.Oem6;
        case 34:
        return Keys.Oem5;
        case 35:
        return Keys.Oem1;
        case 36:
        return Keys.Oem7;
        case 37:
        return Keys.Oemcomma;
        case 38:
        return Keys.Oemtilde;
        default:
        return Keys.None;
        }
        }
    
        public static Keys getKeysByChar2(char c)
        {
        string str ="~!@#$%^&()_{}|:"<>?=";
        int index = str.IndexOf(c.ToString().ToLower());
        switch (index)
        {
        case 0:
        return Keys.Oemtilde;//~
        case 1:
        return Keys.D1;//!
        case 2:
        return Keys.D2;//@
        case 3:
        return Keys.D3;//#
        case 4:
        return Keys.D4;//$
        case 5:
        return Keys.D5;//%
        case 6:
        return Keys.D6;//^
        case 7:
        return Keys.D7;//&
        case 8:
        return Keys.D9;//(
        case 9:
        return Keys.D0;//)
        case 10:
        return Keys.OemMinus;//_
        case 11:
        return Keys.Oem4;//{
        case 12:
        return Keys.Oem6;//}
        case 13:
        return Keys.Oem5;//|
        case 14:
        return Keys.Oem1;//:
        case 15:
        return Keys.Oem7;//"
        case 16:
        return Keys.Oemcomma;//<
        case 17:
        return Keys.OemPeriod;//>
        case 18:
        return Keys.OemQuestion;//?
        case 19:
        return Keys.Oemplus;//=
        default:
        return Keys.None;
        }
        }
    
        //Windows 使用的256个虚拟键码
        public const int VK_LBUTTON =0x1;
        public const int VK_RBUTTON =0x2;
        public const int VK_CANCEL =0x3;
        public const int VK_MBUTTON =0x4;
        public const int VK_BACK =0x8;
        public const int VK_TAB =0x9;
        public const int VK_CLEAR =0xC;
        public const int VK_RETURN =0xD;
        public const int VK_SHIFT =0x10;
        public const int VK_CONTROL =0x11;
        public const int VK_MENU =0x12;
        public const int VK_PAUSE =0x13;
        public const int VK_CAPITAL =0x14;
        public const int VK_ESCAPE =0x1B;
        public const int VK_SPACE =0x20;
        public const int VK_PRIOR =0x21;
        public const int VK_NEXT =0x22;
        public const int VK_END =0x23;
        public const int VK_HOME =0x24;
        public const int VK_LEFT =0x25;
        public const int VK_UP =0x26;
        public const int VK_RIGHT =0x27;
        public const int VK_DOWN =0x28;
        public const int VK_Select =0x29;
        public const int VK_PRINT =0x2A;
        public const int VK_EXECUTE =0x2B;
        public const int VK_SNAPSHOT =0x2C;
        public const int VK_Insert =0x2D;
        public const int VK_Delete =0x2E;
        public const int VK_HELP =0x2F;
        public const int VK_0 =0x30;
        public const int VK_1 =0x31;
        public const int VK_2 =0x32;
        public const int VK_3 =0x33;
        public const int VK_4 =0x34;
        public const int VK_5 =0x35;
        public const int VK_6 =0x36;
        public const int VK_7 =0x37;
        public const int VK_8 =0x38;
        public const int VK_9 =0x39;
        public const int VK_A =0x41;
        public const int VK_B =0x42;
        public const int VK_C =0x43;
        public const int VK_D =0x44;
        public const int VK_E =0x45;
        public const int VK_F =0x46;
        public const int VK_G =0x47;
        public const int VK_H =0x48;
        public const int VK_I =0x49;
        public const int VK_J =0x4A;
        public const int VK_K =0x4B;
        public const int VK_L =0x4C;
        public const int VK_M =0x4D;
        public const int VK_N =0x4E;
        public const int VK_O =0x4F;
        public const int VK_P =0x50;
        public const int VK_Q =0x51;
        public const int VK_R =0x52;
        public const int VK_S =0x53;
        public const int VK_T =0x54;
        public const int VK_U =0x55;
        public const int VK_V =0x56;
        public const int VK_W =0x57;
        public const int VK_X =0x58;
        public const int VK_Y =0x59;
        public const int VK_Z =0x5A;
        public const int VK_STARTKEY =0x5B;
        public const int VK_CONTEXTKEY =0x5D;
        public const int VK_NUMPAD0 =0x60;
        public const int VK_NUMPAD1 =0x61;
        public const int VK_NUMPAD2 =0x62;
        public const int VK_NUMPAD3 =0x63;
        public const int VK_NUMPAD4 =0x64;
        public const int VK_NUMPAD5 =0x65;
        public const int VK_NUMPAD6 =0x66;
        public const int VK_NUMPAD7 =0x67;
        public const int VK_NUMPAD8 =0x68;
        public const int VK_NUMPAD9 =0x69;
        public const int VK_MULTIPLY =0x6A;
        public const int VK_ADD =0x6B;
        public const int VK_SEPARATOR =0x6C;
        public const int VK_SUBTRACT =0x6D;
        public const int VK_DECIMAL =0x6E;
        public const int VK_DIVIDE =0x6F;
        public const int VK_F1 =0x70;
        public const int VK_F2 =0x71;
        public const int VK_F3 =0x72;
        public const int VK_F4 =0x73;
        public const int VK_F5 =0x74;
        public const int VK_F6 =0x75;
        public const int VK_F7 =0x76;
        public const int VK_F8 =0x77;
        public const int VK_F9 =0x78;
        public const int VK_F10 =0x79;
        public const int VK_F11 =0x7A;
        public const int VK_F12 =0x7B;
        public const int VK_F13 =0x7C;
        public const int VK_F14 =0x7D;
        public const int VK_F15 =0x7E;
        public const int VK_F16 =0x7F;
        public const int VK_F17 =0x80;
        public const int VK_F18 =0x81;
        public const int VK_F19 =0x82;
        public const int VK_F20 =0x83;
        public const int VK_F21 =0x84;
        public const int VK_F22 =0x85;
        public const int VK_F23 =0x86;
        public const int VK_F24 =0x87;
        public const int VK_NUMLOCK =0x90;
        public const int VK_OEM_SCROLL =0x91;
        public const int VK_OEM_1 =0xBA;
        public const int VK_OEM_PLUS =0xBB;
        public const int VK_OEM_COMMA =0xBC;
        public const int VK_OEM_MINUS =0xBD;
        public const int VK_OEM_PERIOD =0xBE;
        public const int VK_OEM_2 =0xBF;
        public const int VK_OEM_3 =0xC0;
        public const int VK_OEM_4 =0xDB;
        public const int VK_OEM_5 =0xDC;
        public const int VK_OEM_6 =0xDD;
        public const int VK_OEM_7 =0xDE;
        public const int VK_OEM_8 =0xDF;
        public const int VK_ICO_F17 =0xE0;
        public const int VK_ICO_F18 =0xE1;
        public const int VK_OEM102 =0xE2;
        public const int VK_ICO_HELP =0xE3;
        public const int VK_ICO_00 =0xE4;
        public const int VK_ICO_CLEAR =0xE6;
        public const int VK_OEM_RESET =0xE9;
        public const int VK_OEM_JUMP =0xEA;
        public const int VK_OEM_PA1 =0xEB;
        public const int VK_OEM_PA2 =0xEC;
        public const int VK_OEM_PA3 =0xED;
        public const int VK_OEM_WSCTRL =0xEE;
        public const int VK_OEM_CUSEL =0xEF;
        public const int VK_OEM_ATTN =0xF0;
        public const int VK_OEM_FINNISH =0xF1;
        public const int VK_OEM_COPY =0xF2;
        public const int VK_OEM_AUTO =0xF3;
        public const int VK_OEM_ENLW =0xF4;
        public const int VK_OEM_BACKTAB =0xF5;
        public const int VK_ATTN =0xF6;
        public const int VK_CRSEL =0xF7;
        public const int VK_EXSEL =0xF8;
        public const int VK_EREOF =0xF9;
        public const int VK_PLAY =0xFA;
        public const int VK_ZOOM =0xFB;
        public const int VK_NONAME =0xFC;
        public const int VK_PA1 =0xFD;
        public const int VK_OEM_CLEAR =0xFE;
    
        }
        }
  • 相关阅读:
    linux , nginx: 封禁IP的办法【转】
    分布式之消息队列复习精讲【转】
    RocketMQ 简单梳理 及 集群部署笔记【转】
    ls列出排除的文件
    patch的用法【转】
    python3.6安装 zipimport.ZipImportError: can't decompress data; zlib not available【转】
    为什么用ls和du显示出来的文件大小有差别?【转】
    Python多进程和多线程是鸡肋嘛?【转】
    nginx针对某个url限制ip访问,常用于后台访问限制【转】
    windows服务器卸载补丁命令【转】
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/5615469.html
Copyright © 2011-2022 走看看