c# 2016QQ自动登录程序

时间:2023-03-10 06:26:49
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)//width: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 =,
INPUT_KEYBOARD =,
INPUT_HARDWARE =,
} [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()]
public Int32 type;//0-MOUSEINPUT;1-KEYBDINPUT;2-HARDWAREINPUT
[FieldOffset()]
public KEYBDINPUT ki;
[FieldOffset()]
public MOUSEINPUT mi;
[FieldOffset()]
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 =;
input_down.mi.dy =;
input_down.mi.mouseData =;
input_down.mi.dwFlags = (int)MOUSEEVENTF.LEFTDOWN;
SendInput(, ref input_down, Marshal.SizeOf(input_down)); INPUT input_up = input_down;
input_up.mi.dwFlags = (int)MOUSEEVENTF.LEFTUP;
SendInput(, 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[];
MOUSEINPUT mouseinput_down =new MOUSEINPUT();
MOUSEINPUT mouseinput_up =new MOUSEINPUT(); mouseinput_down.dwFlags = dwFlagsDown;
mouseinput_up.dwFlags = dwFlagsUp;
input[].type = (int)InputType.INPUT_MOUSE;
input[].mi = mouseinput_down;
input[].type = (int)InputType.INPUT_MOUSE;
input[].mi = mouseinput_up;
SetCursorPos(x, y);
Thread.Sleep();
SendInput(, input, Marshal.SizeOf(input[]));//down
SendInput(, input, Marshal.SizeOf(input[]));//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 =;
input_down.ki.wVk = (short)wVk;
SendInput(, 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(, 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[];
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[].type = inDown[].type = inDown[].type = inDown[].type = (int)InputType.INPUT_KEYBOARD;
inDown[].ki.wVk = inDown[].ki.wVk = (short)wVk;
inDown[].ki.wVk = inDown[].ki.wVk = (short)key;
inDown[].ki.dwFlags = inDown[].ki.dwFlags =;
inDown[].ki.dwFlags = inDown[].ki.dwFlags = (int)KEYEVENTF.KEYUP;
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//down
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//char down
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//up
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//char up
} ///<summary>
/// 发送Del键
///</summary>
///<param name="count">发送Del键个数</param>
public static void SendDelCode(int count)
{
if (count >)
{
for (int i =; i < count; i++)
{
INPUT clear_down =new INPUT();
clear_down.type = (int)InputType.INPUT_KEYBOARD;
clear_down.ki.dwFlags =;
clear_down.ki.wVk = VK_BACK;
SendInput(, 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(, 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 =; 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(, 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(, 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 =; i < message.Length; i++)
{
short sendChar =; if (other.IndexOf(message[i].ToString()) >-)
{
sendChar = (short)getKeysByChar2(message[i]);
INPUT[] inDown =new INPUT[];
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[].type = inDown[].type = inDown[].type = inDown[].type = (int)InputType.INPUT_KEYBOARD;
inDown[].ki.wVk = inDown[].ki.wVk = (int)VK_SHIFT;
inDown[].ki.wVk = inDown[].ki.wVk = sendChar;
inDown[].ki.dwFlags = inDown[].ki.dwFlags =;
inDown[].ki.dwFlags = inDown[].ki.dwFlags = (int)KEYEVENTF.KEYUP;
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//shift down
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//char down
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//shift up
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//char up
continue;
}
else if (upper.IndexOf(message[i].ToString()) >-)//如果是大写字母,和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[];
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[] =new INPUT();
inDown[].type = inDown[].type = inDown[].type = inDown[].type = (int)InputType.INPUT_KEYBOARD;
inDown[].ki.wVk = inDown[].ki.wVk = (int)VK_SHIFT;
inDown[].ki.wVk = inDown[].ki.wVk = sendChar;
inDown[].ki.dwFlags = inDown[].ki.dwFlags =;
inDown[].ki.dwFlags = inDown[].ki.dwFlags = (int)KEYEVENTF.KEYUP;
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//shift down
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//char down
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//shift up
SendInput(, ref inDown[], Marshal.SizeOf(inDown[]));//char up
continue;
}
else if (lower.IndexOf(message[i].ToString()) >-)//小写字母
{
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 =;
input_down.ki.wVk = sendChar;
SendInput(, 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(, 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 :
return Keys.A;
case :
return Keys.B;
case :
return Keys.C;
case :
return Keys.D;
case :
return Keys.E;
case :
return Keys.F;
case :
return Keys.G;
case :
return Keys.H;
case :
return Keys.I;
case :
return Keys.J;
case :
return Keys.K;
case :
return Keys.L;
case :
return Keys.M;
case :
return Keys.N;
case :
return Keys.O;
case :
return Keys.P;
case :
return Keys.Q;
case :
return Keys.R;
case :
return Keys.S;
case :
return Keys.T;
case :
return Keys.U;
case :
return Keys.V;
case :
return Keys.W;
case :
return Keys.X;
case :
return Keys.Y;
case :
return Keys.Z;
case :
return Keys.Add;
case :
return Keys.Subtract;
case :
return Keys.Multiply;
case :
return Keys.Divide;
case :
return Keys.Decimal;
case :
return Keys.Space;
case :
return Keys.Oem4;//[]\\;',.
case :
return Keys.Oem6;
case :
return Keys.Oem5;
case :
return Keys.Oem1;
case :
return Keys.Oem7;
case :
return Keys.Oemcomma;
case :
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 :
return Keys.Oemtilde;//~
case :
return Keys.D1;//!
case :
return Keys.D2;//@
case :
return Keys.D3;//#
case :
return Keys.D4;//$
case :
return Keys.D5;//%
case :
return Keys.D6;//^
case :
return Keys.D7;//&
case :
return Keys.D9;//(
case :
return Keys.D0;//)
case :
return Keys.OemMinus;//_
case :
return Keys.Oem4;//{
case :
return Keys.Oem6;//}
case :
return Keys.Oem5;//|
case :
return Keys.Oem1;//:
case :
return Keys.Oem7;//"
case :
return Keys.Oemcomma;//<
case :
return Keys.OemPeriod;//>
case :
return Keys.OemQuestion;//?
case :
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; }
}