今天遇到了个问题,幻灯片放映到某一页时需要退出播放,没有找到对应的方法,所以想到了直接通过ESC键可以退出,所以模拟执行了一下ESC键,发现真的可以。在此记录一下。
C# 模拟键盘鼠标的事件整理
1、模拟键盘
System.Windows.Forms.SendKeys
以下是 SendKeys 的一些特殊键代码表。
键 | 代码 | 功能 |
---|---|---|
INS 或 INSERT | {INSERT} 或 {INS} | 模拟 Insert 键 |
DEL 或 DELETE | {DELETE} 或 {DEL} | 模拟 删除 键 |
ESC | {ESC} | 模拟 退出 键 |
ENTER | {ENTER} 或 ~ | 模拟 回车 键 |
END | {END} | 模拟 End 键 |
BACKSPACE | {BACKSPACE}、{BS} 或 {BKSP} | 模拟 退格 键 |
HOME | {HOME} | 模拟 Home 键 |
PAGE UP | {PGUP} | 模拟 Page Up 键 |
PAGE DOWN | {PGDN} | 模拟 Page Down 键 |
TAB | {TAB} | 模拟 Tab 键 |
UP ARROW ⬆ | {UP} | 模拟 上箭头 键 |
DOWN ARROW⬇ | {DOWN} | 模拟 下箭头 键 |
LEFT ARROW⬅ | {LEFT} | 模拟 左箭头 键 |
RIGHT ARROW➡ | {RIGHT} | 模拟 右箭头 键 |
PRTSC | {PRTSC} | 模拟 打印屏幕 键 |
BREAK | {BREAK} | 模拟 Break 键 |
HELP | {HELP} | 模拟 帮助 键 |
NUM LOCK | {NUMLOCK} | 数字锁定(注意:可能在某些系统上不起作用) |
SCROLL LOCK | {SCROLLLOCK} | 滚动锁定(注意:可能在某些系统上不起作用) |
CAPS LOCK | {CAPSLOCK} | 大小写锁定(注意:可能在某些系统上不起作用) |
F1 | {F1} | 模拟 F1 功能键 |
F2 | {F2} | 模拟 F2 功能键 |
F3 | {F3} | 模拟 F3 功能键 |
F4 | {F4} | 模拟 F4 功能键 |
F5 | {F5} | 模拟 F5 功能键 |
F6 | {F6} | 模拟 F6 功能键 |
F7 | {F7} | 模拟 F7 功能键 |
F8 | {F8} | 模拟 F8 功能键 |
F9 | {F9} | 模拟 F9 功能键 |
F10 | {F10} | 模拟 F10 功能键 |
F11 | {F11} | 模拟 F11 功能键 |
F12 | {F12} | 模拟 F12 功能键 |
+ | {ADD} | 数字键盘加号 |
- | {SUBTRACT} | 数字键盘减号 |
* | {MULTIPLY} | 数字键盘乘号 |
/ | {DIVIDE} | 数字键盘除号 |
{CTRL}, {SHIFT}, {ALT} - 这些可以与其它键组合使用,例如 ^{C} =(Ctrl+C),+{TAB} =(Shift+Tab)
若要指定与 SHIFT、CTRL 和 ALT 键的任意组合一起使用的键,请在这些键代码之前加上以下一个或多个代码:
键 | 代码 |
---|---|
SHIFT | + |
CTRL | ^ |
ALT | % |
方法的说明:
public class SendKeys : System.Object
System.Windows.Forms 的成员
- 提供将键击发送到应用程序的方法。
public static void Send ( System.String keys )
System.Windows.Forms.SendKeys 的成员 - 向活动应用程序发送击键。
public static void Sleep ( System.TimeSpan timeout )
System.Threading.Thread 的成员 - 将当前线程阻塞指定的时间。
public static void Flush ( )
System.Windows.Forms.SendKeys 的成员
2、模拟鼠标
一个简单的模拟键盘鼠标操作的类,扩充 VirtualKeys 枚举 或者 直接写。
using System;
using System.Runtime.InteropServices;
using System.Text;
class Keyboard
{
const uint KEYEVENTF_EXTENDEDKEY = 0x1;
const uint KEYEVENTF_KEYUP = 0x2;
[DllImport("user32.dll")]
static extern short GetKeyState(int nVirtKey);
[DllImport("user32.dll")]
static extern void keybd_event(
byte bVk,
byte bScan,
uint dwFlags,
uint dwExtraInfo
);
public enum VirtualKeys : byte
{
VK_NUMLOCK = 0x90, //数字锁定键
VK_SCROLL = 0x91, //滚动锁定
VK_CAPITAL = 0x14, //大小写锁定
VK_A = 62
}
public static bool GetState(VirtualKeys Key)
{
return (GetKeyState((int)Key) == 1);
}
public static void SetState(VirtualKeys Key, bool State)
{
if (State != GetState(Key))
{
keybd_event(
(byte)Key,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0
);
keybd_event(
(byte)Key,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0
);
}
}
}
示例:
- 模拟操作
Keyboard.SetState(VirtualKeys.VK_CAPITAL,!Keyboard.GetState(VirtualKeys.VK_CAPITAL));
- 得到键盘状态
Keyboard.GetState(VirtualKeys.VK_CAPITAL)
- 十进制值 标识符 IBM兼容键盘
1 VK_LBUTTON 鼠标左键
2 VK_RBUTTON 鼠标右键
3 VK_CANCEL Ctrl+Break(通常不需要处理)
4 VK_MBUTTON 鼠标中键
8 VK_BACK Backspace
9 VK_TAB Tab
12 VK_CLEAR Num Lock关闭时的数字键盘5
13 VK_RETURN Enter(或者另一个)
16 VK_SHIFT Shift(或者另一个)
17 VK_CONTROL Ctrl(或者另一个)
18 VK_MENU Alt(或者另一个)
19 VK_PAUSE Pause
20 VK_CAPITAL Caps Lock
27 VK_ESCAPE Esc
32 VK_SPACE Spacebar
33 VK_PRIOR Page Up
34 VK_NEXT Page Down
35 VK_END End
36 VK_HOME Home
37 VK_LEFT 左箭头
38 VK_UP 上箭头
39 VK_RIGHT 右箭头
40 VK_DOWN 下箭头
41 VK_SELECT 可选
42 VK_PRINT 可选
43 VK_EXECUTE 可选
44 VK_SNAPSHOT Print Screen
45 VK_INSERT Insert
46 VK_DELETE Delete
47 VK_HELP 可选
48~57 无 主键盘上的0~9
65~90 无 A~Z
96~105 VK_NUMPAD0~VK_NUMPAD9 Num Lock打开时数字键盘上的0~9
106 VK_NULTIPLY 数字键盘上的*
107 VK_ADD 数字键盘上的+
108 VK_SEPARATOR 可选
109 VK_SUBTRACT 数字键盘上的-
110 VK_DECIMAL 数字键盘上的.
111 VK_DIVIDE 数字键盘上的/
112~135 VK_F1~VK_F24 功能键F1~F24
144 VK_NUMLOCK Num Lock
145 VK_SCROLL Scroll Lock
*/
-
函数声明:
private readonly int MOUSEEVENTF_LEFTDOWN = 0x2;
private readonly int MOUSEEVENTF_LEFTUP = 0x4;
[DllImport(“user32”)]
public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); -
调用方法:
mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0);
其中X,Y分别是你要点击的点的横坐标和纵坐标
关于这两个函数的详细说明,可以查看MSDN Library或者Windows的Platform SDK文档。
3、例子
3.1、幻灯片放映时实现退出播放
//退出放映
SendKeys.Send("{ESC}");
3.2、幻灯片放映时实现跳过播放
//跳过放映,播放下一页
SendKeys.Send("{ENTER}");
3.3、其他例子
// 模拟按下 Enter 键
SendKeys.Send("{ENTER}");
// 模拟按下 Tab 键
SendKeys.Send("{TAB}");
// 模拟按下 Ctrl+C(复制)
SendKeys.Send("^{C}");
// 模拟按下 Shift+Tab(反向 Tab)
SendKeys.Send("+{TAB}");
private void button1_Click(object sender, System.EventArgs e)
{//英文输入
this.richTextBox1.Focus();
for (int i = 65; i < 91; i++)
{
char Letter = (char)i;
SendKeys.Send(Letter.ToString());
System.Threading.Thread.Sleep(100);
SendKeys.Flush();
}
for (int i = 97; i < 123; i++)
{
char Letter = (char)i;
SendKeys.Send(Letter.ToString());
System.Threading.Thread.Sleep(100);
SendKeys.Flush();
}
}
private void button3_Click(object sender, System.EventArgs e)
{//数字输入
this.richTextBox1.Focus();
for (int i = 0; i < 10; i++)
{
SendKeys.Send(i.ToString());
System.Threading.Thread.Sleep(100);
SendKeys.Flush();
}
}
private void button4_Click(object sender, System.EventArgs e)
{//Backspace
this.richTextBox1.Focus();
SendKeys.Send("{Backspace}");
}
private void button5_Click(object sender, System.EventArgs e)
{//Home
this.richTextBox1.Focus();
SendKeys.Send("{Home}");
}
private void button6_Click(object sender, System.EventArgs e)
{//End
this.richTextBox1.Focus();
SendKeys.Send("{End}");
}
private void button7_Click(object sender, System.EventArgs e)
{//Enter
this.richTextBox1.Focus();
SendKeys.Send("{Enter}");
}
private void button8_Click(object sender, System.EventArgs e)
{//Delete
this.richTextBox1.Focus();
SendKeys.Send("{Delete}");
}
private void button2_Click(object sender, System.EventArgs e)
{//Shift+Home
this.richTextBox1.Focus();
SendKeys.Send("+{Home}");
}
private void button9_Click(object sender, System.EventArgs e)
{//Shift+End
this.richTextBox1.Focus();
SendKeys.Send("+{End}");
}