我发过挺多工作中用到的C#内容,整体链接和内容去这里看下:C#基础知识体系框架图,及起对应我发过的博客_花开莫与流年错_的博客-CSDN博客_c#架构图
可以记住电脑上鼠标、键盘操作记录,用处就很多,比较灵活了,只要记下自己电脑上操作的内容,可以循环去模拟人为的执行。而我呢是用在自动化生产中,接收PLC命令后模拟人操作控制电脑上的软件。键盘和鼠标功能码与ascll码一致。
使用的话基本都是基于MouseKeyHook开发的,下面我来介绍下详细内容。
使用MouseKeyHook
其中主要两个接口:key键盘点击事件、mouse鼠标点击事件
namespace Gma.System.MouseKeyHook
public interface IKeyboardMouseEvents : IKeyboardEvents, IMouseEvents, IDisposable
namespace Gma.System.MouseKeyHook
{
public static class Hook
{
public static IKeyboardMouseEvents AppEvents();
public static IKeyboardMouseEvents GlobalEvents();
}
}
使用代码
private IKeyboardMouseEvents m_GlobalHook;
public void Subscribe()
{
m_GlobalHook = Hook.GlobalEvents();
m_GlobalHook.MouseDownExt += GlobalHookMouseDownExt;
m_GlobalHook.KeyDown += KeyEventHandler;
}
private void KeyEventHandler(object sender, KeyEventArgs e)
{
// keyValue值对应键盘事件要参考下面System.Windows.Forms中Keys的定义
Console.WriteLine(e.KeyValue);
}
private void GlobalHookMouseDownExt(object sender, MouseEventExtArgs e)
{
if (e.Button == MouseButtons.Left)
{
Console.WriteLine("左键");
key = 1;
}
if (e.Button == MouseButtons.Right)
{
Console.WriteLine("右键");
m_GlobalHook.MouseDownExt -= GlobalHookMouseDownExt;
m_GlobalHook.Dispose();
key = 2;
}
}
上面只触发了点击事件,还要获取当前点击位置
// 当前查看的代码是在定时器里面获取的,Cursor对象对应命名控件:System.Windows.Forms
Cursor.Position.X.ToString() + "," + Cursor.Position.Y.ToString();
// 获取屏幕整体宽度和高度,但是这里不是真实大小(被屏幕显示百分比重新计算后的)
Screen.PrimaryScreen.Bounds.Width + ", " + Screen.PrimaryScreen.Bounds.Height;
// 添加事件处理
keyboardWatcher.OnKeyboardInput += (s, e) =>
{ }
mouseWatcher.OnMouseInput += (s, e) => { }
运行快键记录
[DllImport("user32.dll")]
static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
// 通过定时器和鼠标、键盘事件记录鼠标位置和事件,控制实现
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x * 65536 / 1920, y * 65536 / 1080, 0, 0);
InputSimulator对象中KeyPress虚拟按键、Mouse虚拟鼠标,由IKeyboardSimulator和IMouseSimulator声明。
鼠标Mouse移动
MoveMouseTo(double absoluteX, double absoluteY);
LeftButtonDown();
LeftButtonUp();
LeftButtonClick();
LeftButtonDoubleClick();
RightButtonDown();
RightButtonUp();
RightButtonClick();
RightButtonDoubleClick();
MiddleButtonDown();
MiddleButtonUp();
MiddleButtonClick();
Sleep(int millsecondsTimeout);
代码中触发键盘。KeyPress(单个键盘触发)、ModifiedKeyStroke(多个键盘同时触发)、TextEntry(输入文件)、Sleep(暂停)
sim.Keyboard
.ModifiedKeyStroke(VirtualKeyCode.LWIN, VirtualKeyCode.VK_R)
.Sleep(1000)
.TextEntry("notepad")
.Sleep(1000)
.KeyPress(VirtualKeyCode.RETURN)
.KeyPress(VirtualKeyCode.RETURN)
.Sleep(1000)
.TextEntry("0123456789")
.Sleep(1000)
.TextEntry(".")
.Sleep(1000)
.TextEntry(".")
.Sleep(1000)
.TextEntry(".")
.Sleep(1000)
.ModifiedKeyStroke(VirtualKeyCode.MENU, VirtualKeyCode.SPACE)
.KeyPress(VirtualKeyCode.DOWN)
.KeyPress(VirtualKeyCode.RETURN);
windows上每个按键的功能(可以自己在vs找到Forms中的Keys,按F12跳转到定义查看所有内容),对应映射的值拷贝到下面了,这里其实和ascll码是一样的,只不过还多了一些命令而已。
#region 程序集 System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\System.Windows.Forms.dll
#endregion
using System.ComponentModel;
using System.Drawing.Design;
using System.Runtime.InteropServices;
namespace System.Windows.Forms
{
//
// 摘要:
// 指定键代码和修饰符。
[ComVisible(true)]
[Editor("System.Windows.Forms.Design.ShortcutKeysEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[Flags]
[TypeConverter(typeof(KeysConverter))]
public enum Keys
{
//
// 摘要:
// 若要从一个密钥值中提取修饰符位掩码。
Modifiers = -65536,
//
// 摘要:
// 不按任何键。
None = 0,
//
// 摘要:
// 鼠标左键。
LButton = 1,
//
// 摘要:
// 鼠标右键按钮中。
RButton = 2,
//
// 摘要:
// CANCEL 键。
Cancel = 3,
//
// 摘要:
// 鼠标中键 (三个按钮的鼠标)。
MButton = 4,
//
// 摘要:
// 第一个 x 鼠标按钮 (五个按钮的鼠标)。
XButton1 = 5,
//
// 摘要:
// 第二个鼠标按钮 (五个按钮的鼠标) x。
XButton2 = 6,
//
// 摘要:
// BACKSPACE 键。
Back = 8,
//
// 摘要:
// TAB 键。
Tab = 9,
//
// 摘要:
// LINEFEED 键。
LineFeed = 10,
//
// 摘要:
// CLEAR 键。
Clear = 12,
//
// 摘要:
// RETURN 键。
Return = 13,
//
// 摘要:
// ENTER 键。
Enter = 13,
//
// 摘要:
// SHIFT 键。
ShiftKey = 16,
//
// 摘要:
// CTRL 键。
ControlKey = 17,
//
// 摘要:
// ALT 键。
Menu = 18,
//
// 摘要:
// PAUSE 键。
Pause = 19,
//
// 摘要:
// CAPS LOCK 键。
Capital = 20,
//
// 摘要:
// CAPS LOCK 键。
CapsLock = 20,
//
// 摘要:
// IME Kana 模式键。
KanaMode = 21,
//
// 摘要:
// IME Hanguel 模式键。 (保留为了兼容; 使用HangulMode)
HanguelMode = 21,
//
// 摘要:
// IME Hangul 模式键。
HangulMode = 21,
//
// 摘要:
// IME Junja 模式键。
JunjaMode = 23,
//
// 摘要:
// IME 最终模式键。
FinalMode = 24,
//
// 摘要:
// IME Hanja 模式键。
HanjaMode = 25,
//
// 摘要:
// IME Kanji 模式键。
KanjiMode = 25,
//
// 摘要:
// ESC 键。
Escape = 27,
//
// 摘要:
// IME convert 键。
IMEConvert = 28,
//
// 摘要:
// IME nonconvert 键。
IMENonconvert = 29,
//
// 摘要:
// IME 接受密钥,替换System.Windows.Forms.Keys.IMEAceept。
IMEAccept = 30,
//
// 摘要:
// IME 接受密钥。 已过时,请System.Windows.Forms.Keys.IMEAccept相反。
IMEAceept = 30,
//
// 摘要:
// IME 模式更改密钥。
IMEModeChange = 31,
//
// 摘要:
// SPACEBAR 键。
Space = 32,
//
// 摘要:
// PAGE UP 键。
Prior = 33,
//
// 摘要:
// PAGE UP 键。
PageUp = 33,
//
// 摘要:
// PAGE DOWN 键。
Next = 34,
//
// 摘要:
// PAGE DOWN 键。
PageDown = 34,
//
// 摘要:
// END 键。
End = 35,
//
// 摘要:
// HOME 键。
Home = 36,
//
// 摘要:
// LEFT ARROW 键。
Left = 37,
//
// 摘要:
// UP ARROW 键。
Up = 38,
//
// 摘要:
// RIGHT ARROW 键。
Right = 39,
//
// 摘要:
// DOWN ARROW 键。
Down = 40,
//
// 摘要:
// SELECT 键。
Select = 41,
//
// 摘要:
// PRINT 键。
Print = 42,
//
// 摘要:
// EXECUTE 键。
Execute = 43,
//
// 摘要:
// PRINT SCREEN 键。
Snapshot = 44,
//
// 摘要:
// PRINT SCREEN 键。
PrintScreen = 44,
//
// 摘要:
// INS 键。
Insert = 45,
//
// 摘要:
// DEL 键。
Delete = 46,
//
// 摘要:
// HELP 键。
Help = 47,
//
// 摘要:
// 0 键。
D0 = 48,
//
// 摘要:
// 1 键。
D1 = 49,
//
// 摘要:
// 2 键。
D2 = 50,
//
// 摘要:
// 3 键。
D3 = 51,
//
// 摘要:
// 4 键。
D4 = 52,
//
// 摘要:
// 5 键。
D5 = 53,
//
// 摘要:
// 6 键。
D6 = 54,
//
// 摘要:
// 7 键。
D7 = 55,
//
// 摘要:
// 8 键。
D8 = 56,
//
// 摘要:
// 9 键。
D9 = 57,
//
// 摘要:
// A 键。
A = 65,
//
// 摘要:
// B 键。
B = 66,
//
// 摘要:
// C 键。
C = 67,
//
// 摘要:
// D 键。
D = 68,
//
// 摘要:
// E 键。
E = 69,
//
// 摘要:
// F 键。
F = 70,
//
// 摘要:
// G 键。
G = 71,
//
// 摘要:
// H 键。
H = 72,
//
// 摘要:
// I 键。
I = 73,
//
// 摘要:
// J 键。
J = 74,
//
// 摘要:
// K 键。
K = 75,
//
// 摘要:
// L 键。
L = 76,
//
// 摘要:
// M 键。
M = 77,
//
// 摘要:
// N 键。
N = 78,
//
// 摘要:
// O 键。
O = 79,
//
// 摘要:
// P 键。
P = 80,
//
// 摘要:
// Q 键。
Q = 81,
//
// 摘要:
// R 键。
R = 82,
//
// 摘要:
// S 键。
S = 83,
//
// 摘要:
// T 键。
T = 84,
//
// 摘要:
// U 键。
U = 85,
//
// 摘要:
// V 键。
V = 86,
//
// 摘要:
// W 键。
W = 87,
//
// 摘要:
// X 键。
X = 88,
//
// 摘要:
// Y 键。
Y = 89,
//
// 摘要:
// Z 键。
Z = 90,
//
// 摘要:
// 左 Windows 徽标键 (Microsoft Natural Keyboard)。
LWin = 91,
//
// 摘要:
// 右 Windows 徽标键 (Microsoft Natural Keyboard)。
RWin = 92,
//
// 摘要:
// 应用程序密钥 (Microsoft Natural Keyboard)。
Apps = 93,
//
// 摘要:
// 计算机休眠键。
Sleep = 95,
//
// 摘要:
// 数字键盘上的 0 键。
NumPad0 = 96,
//
// 摘要:
// 数字键盘上的 1 键。
NumPad1 = 97,
//
// 摘要:
// 数字键盘上的 2 键。
NumPad2 = 98,
//
// 摘要:
// 数字键盘上的 3 键。
NumPad3 = 99,
//
// 摘要:
// 数字键盘上的 4 键。
NumPad4 = 100,
//
// 摘要:
// 数字键盘上的 5 键。
NumPad5 = 101,
//
// 摘要:
// 数字键盘上的 6 键。
NumPad6 = 102,
//
// 摘要:
// 数字键盘上的 7 键。
NumPad7 = 103,
//
// 摘要:
// 数字键盘上的 8 键。
NumPad8 = 104,
//
// 摘要:
// 数字键盘上的 9 键。
NumPad9 = 105,
//
// 摘要:
// 乘号键。
Multiply = 106,
//
// 摘要:
// 加号键。
Add = 107,
//
// 摘要:
// 分隔符键。
Separator = 108,
//
// 摘要:
// 减号键。
Subtract = 109,
//
// 摘要:
// 句点键。
Decimal = 110,
//
// 摘要:
// 除号键。
Divide = 111,
//
// 摘要:
// F1 键。
F1 = 112,
//
// 摘要:
// F2 键。
F2 = 113,
//
// 摘要:
// F3 键。
F3 = 114,
//
// 摘要:
// F4 键。
F4 = 115,
//
// 摘要:
// F5 键。
F5 = 116,
//
// 摘要:
// F6 键。
F6 = 117,
//
// 摘要:
// F7 键。
F7 = 118,
//
// 摘要:
// F8 键。
F8 = 119,
//
// 摘要:
// F9 键。
F9 = 120,
//
// 摘要:
// F10 键。
F10 = 121,
//
// 摘要:
// F11 键。
F11 = 122,
//
// 摘要:
// F12 键。
F12 = 123,
//
// 摘要:
// F13 键。
F13 = 124,
//
// 摘要:
// F14 键。
F14 = 125,
//
// 摘要:
// F15 键。
F15 = 126,
//
// 摘要:
// F16 键。
F16 = 127,
//
// 摘要:
// F17 键。
F17 = 128,
//
// 摘要:
// F18 键。
F18 = 129,
//
// 摘要:
// F19 键。
F19 = 130,
//
// 摘要:
// F20 键。
F20 = 131,
//
// 摘要:
// F21 键。
F21 = 132,
//
// 摘要:
// F22 键。
F22 = 133,
//
// 摘要:
// F23 键。
F23 = 134,
//
// 摘要:
// F24 键。
F24 = 135,
//
// 摘要:
// NUM LOCK 键。
NumLock = 144,
//
// 摘要:
// SCROLL LOCK 键。
Scroll = 145,
//
// 摘要:
// 左的 SHIFT 键。
LShiftKey = 160,
//
// 摘要:
// 右 SHIFT 键。
RShiftKey = 161,
//
// 摘要:
// 左 CTRL 键。
LControlKey = 162,
//
// 摘要:
// 右 CTRL 键。
RControlKey = 163,
//
// 摘要:
// 左 ALT 键。
LMenu = 164,
//
// 摘要:
// 右 ALT 键。
RMenu = 165,
//
// 摘要:
// 浏览器后退键 (Windows 2000 或更高版本)。
BrowserBack = 166,
//
// 摘要:
// 浏览器前进键 (Windows 2000 或更高版本)。
BrowserForward = 167,
//
// 摘要:
// 浏览器刷新键 (Windows 2000 或更高版本)。
BrowserRefresh = 168,
//
// 摘要:
// 浏览器停止键 (Windows 2000 或更高版本)。
BrowserStop = 169,
//
// 摘要:
// 浏览器搜索键 (Windows 2000 或更高版本)。
BrowserSearch = 170,
//
// 摘要:
// 浏览器收藏键 (Windows 2000 或更高版本)。
BrowserFavorites = 171,
//
// 摘要:
// 浏览器主页键 (Windows 2000 或更高版本)。
BrowserHome = 172,
//
// 摘要:
// 卷静音键 (Windows 2000 或更高版本)。
VolumeMute = 173,
//
// 摘要:
// 音量降低键 (Windows 2000 或更高版本)。
VolumeDown = 174,
//
// 摘要:
// 音量增大键 (Windows 2000 或更高版本)。
VolumeUp = 175,
//
// 摘要:
// 媒体下一曲目键 (Windows 2000 或更高版本)。
MediaNextTrack = 176,
//
// 摘要:
// 媒体上一曲目键 (Windows 2000 或更高版本)。
MediaPreviousTrack = 177,
//
// 摘要:
// 媒体停止键 (Windows 2000 或更高版本)。
MediaStop = 178,
//
// 摘要:
// 在媒体播放暂停键 (Windows 2000 或更高版本)。
MediaPlayPause = 179,
//
// 摘要:
// 启动邮件键 (Windows 2000 或更高版本)。
LaunchMail = 180,
//
// 摘要:
// 选择媒体键 (Windows 2000 或更高版本) 中。
SelectMedia = 181,
//
// 摘要:
// 启动应用程序一个键 (Windows 2000 或更高版本)。
LaunchApplication1 = 182,
//
// 摘要:
// 启动应用程序两个键 (Windows 2000 或更高版本)。
LaunchApplication2 = 183,
//
// 摘要:
// 美国标准键盘 (Windows 2000 或更高版本) 上的 OEM 分号键。
OemSemicolon = 186,
//
// 摘要:
// OEM 1 键。
Oem1 = 186,
//
// 摘要:
// OEM 加上任何国家/地区键盘 (Windows 2000 或更高版本) 上的密钥。
Oemplus = 187,
//
// 摘要:
// 任何国家/地区键盘 (Windows 2000 或更高版本) 上的 OEM 逗号键。
Oemcomma = 188,
//
// 摘要:
// OEM 减号键 (Windows 2000 或更高版本) 任何国家/地区键盘上。
OemMinus = 189,
//
// 摘要:
// 任何国家/地区键盘 (Windows 2000 或更高版本) 上的 OEM 期间键。
OemPeriod = 190,
//
// 摘要:
// 美国标准键盘 (Windows 2000 或更高版本) 上的 OEM 问号键。
OemQuestion = 191,
//
// 摘要:
// OEM 2 键。
Oem2 = 191,
//
// 摘要:
// 美国标准键盘 (Windows 2000 或更高版本) 上的 OEM 颚化符键。
Oemtilde = 192,
//
// 摘要:
// OEM 3 键。
Oem3 = 192,
//
// 摘要:
// 美国标准键盘 (Windows 2000 或更高版本) 上的 OEM 左大括号键。
OemOpenBrackets = 219,
//
// 摘要:
// OEM 4 键。
Oem4 = 219,
//
// 摘要:
// 美国标准键盘 (Windows 2000 或更高版本) 上的 OEM 管道键。
OemPipe = 220,
//
// 摘要:
// OEM 5 键。
Oem5 = 220,
//
// 摘要:
// 美国标准键盘 (Windows 2000 或更高版本) 上的 OEM 右大括号键。
OemCloseBrackets = 221,
//
// 摘要:
// OEM 6 键。
Oem6 = 221,
//
// 摘要:
// OEM 意见/双精度型引号密钥美国标准键盘 (Windows 2000 或更高版本) 上。
OemQuotes = 222,
//
// 摘要:
// OEM 7 键。
Oem7 = 222,
//
// 摘要:
// OEM 8 键。
Oem8 = 223,
//
// 摘要:
// OEM 尖括号或 RT 102 键键盘 (Windows 2000 或更高版本) 上的反斜杠键。
OemBackslash = 226,
//
// 摘要:
// OEM 102 键。
Oem102 = 226,
//
// 摘要:
// PROCESS 键键中。
ProcessKey = 229,
//
// 摘要:
// 用于传递 Unicode 字符,就像它们是击键一样。 Packet 键值是用于非键盘输入方法的 32 位虚拟密钥值的低位字。
Packet = 231,
//
// 摘要:
// ATTN 键。
Attn = 246,
//
// 摘要:
// CRSEL 键。
Crsel = 247,
//
// 摘要:
// EXSEL 键。
Exsel = 248,
//
// 摘要:
// ERASE EOF 键。
EraseEof = 249,
//
// 摘要:
// 播放键。
Play = 250,
//
// 摘要:
// 缩放键。
Zoom = 251,
//
// 摘要:
// 留待将来使用的常数。
NoName = 252,
//
// 摘要:
// PA1 键。
Pa1 = 253,
//
// 摘要:
// CLEAR 键。
OemClear = 254,
//
// 摘要:
// 从一个密钥值中提取键代码的位屏蔽。
KeyCode = 65535,
//
// 摘要:
// SHIFT 修改键。
Shift = 65536,
//
// 摘要:
// CTRL 修改键。
Control = 131072,
//
// 摘要:
// ALT 修改键。
Alt = 262144
}
}