VSTO幻灯片退出播放(C#模拟键盘鼠标的事件)

今天遇到了个问题,幻灯片放映到某一页时需要退出播放,没有找到对应的方法,所以想到了直接通过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 枚举 或者 直接写。

csharp 复制代码
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
            );
        }
    }
}

示例:

  • 模拟操作
csharp 复制代码
Keyboard.SetState(VirtualKeys.VK_CAPITAL,!Keyboard.GetState(VirtualKeys.VK_CAPITAL));
  • 得到键盘状态
csharp 复制代码
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、幻灯片放映时实现退出播放

csharp 复制代码
//退出放映
SendKeys.Send("{ESC}");

3.2、幻灯片放映时实现跳过播放

csharp 复制代码
//跳过放映,播放下一页
 SendKeys.Send("{ENTER}");

3.3、其他例子

csharp 复制代码
// 模拟按下 Enter 键
SendKeys.Send("{ENTER}");
 
// 模拟按下 Tab 键
SendKeys.Send("{TAB}");
 
// 模拟按下 Ctrl+C(复制)
SendKeys.Send("^{C}");
 
// 模拟按下 Shift+Tab(反向 Tab)
SendKeys.Send("+{TAB}");
csharp 复制代码
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}");
}
相关推荐
CodeCraft Studio32 分钟前
国产Excel处理控件Spire.XLS系列教程:C# 将Excel文件转换为Markdown格式
c#·excel
编程轨迹_38 分钟前
使用 Spring 和 Redis 创建处理敏感数据的服务
java·开发语言·restful
赵和范1 小时前
C++:书架
开发语言·c++·算法
boooo_hhh1 小时前
第J7周:对于ResNeXt-50算法的思考
开发语言·python·深度学习
ᥬ 小月亮2 小时前
Uniapp编写微信小程序,使用canvas进行绘图
微信小程序·uni-app·c#
LSL666_2 小时前
Java——多态
java·开发语言·多态·内存图
麓殇⊙2 小时前
CurrentHashMap的整体系统介绍及Java内存模型(JVM)介绍
java·开发语言·jvm
LSL666_3 小时前
Java——包装类
java·开发语言·包装类
yasuniko3 小时前
C++线程库
开发语言·c++
@老蝴3 小时前
C语言—指针2
c语言·开发语言