如何在winform和wpf中以编程方式实现鼠标移动、单击、右键单击和按键等?

2024-04-17

如何在 winform 和 wpf 中以编程方式移动鼠标、单击、右键单击和按键等。如果可能的话,请帮我提供代码片段。


如果我正确理解你的问题,那么你想真正模拟输入。在这种情况下SendInput是要走的路。从这个链接 http://robrelyea.wordpress.com/2007/06/15/sendkeys-for-wpf/

PInvoke 到 SendInput – 这是 模拟输入的官方方式。它 将输入推入所有的 预期的代码路径,并且是 与真实输入无法区分。

使用它的一个简单方法是输入模拟器 http://inputsimulator.codeplex.com/在 CodePlex。添加对 InputSimulator.dll 的引用,您可以模拟击键,例如

// Tab
InputSimulator.SimulateKeyDown(VirtualKeyCode.TAB);
// Shift+Tab
InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.SHIFT, VirtualKeyCode.TAB);   
// etc.

然而,输入模拟器尚不支持鼠标,但这是一个入门者鼠标模拟器。它只做左键单击 and 右键点击到目前为止,但借助以下两个链接,您可以轻松扩展它鼠标移动 etc.

  • pinvoke.net:发送输入(user32) http://www.pinvoke.net/default.aspx/user32.sendinput
  • 如何在应用程序中模拟鼠标事件? http://www.codeguru.com/forum/showthread.php?t=377394

鼠标模拟器

public class MouseSimulator
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

    [StructLayout(LayoutKind.Sequential)]
    struct INPUT
    {
        public SendInputEventType type;
        public MouseKeybdhardwareInputUnion mkhi;
    }
    [StructLayout(LayoutKind.Explicit)]
    struct MouseKeybdhardwareInputUnion
    {
        [FieldOffset(0)]
        public MouseInputData mi;

        [FieldOffset(0)]
        public KEYBDINPUT ki;

        [FieldOffset(0)]
        public HARDWAREINPUT hi;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct HARDWAREINPUT
    {
        public int uMsg;
        public short wParamL;
        public short wParamH;
    }
    struct MouseInputData
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public MouseEventFlags dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [Flags]
    enum MouseEventFlags : uint
    {
        MOUSEEVENTF_MOVE = 0x0001,
        MOUSEEVENTF_LEFTDOWN = 0x0002,
        MOUSEEVENTF_LEFTUP = 0x0004,
        MOUSEEVENTF_RIGHTDOWN = 0x0008,
        MOUSEEVENTF_RIGHTUP = 0x0010,
        MOUSEEVENTF_MIDDLEDOWN = 0x0020,
        MOUSEEVENTF_MIDDLEUP = 0x0040,
        MOUSEEVENTF_XDOWN = 0x0080,
        MOUSEEVENTF_XUP = 0x0100,
        MOUSEEVENTF_WHEEL = 0x0800,
        MOUSEEVENTF_VIRTUALDESK = 0x4000,
        MOUSEEVENTF_ABSOLUTE = 0x8000
    }
    enum SendInputEventType : int
    {
        InputMouse,
        InputKeyboard,
        InputHardware
    }

    public static void ClickLeftMouseButton()
    {
        INPUT mouseDownInput = new INPUT();
        mouseDownInput.type = SendInputEventType.InputMouse;
        mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
        SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));

        INPUT mouseUpInput = new INPUT();
        mouseUpInput.type = SendInputEventType.InputMouse;
        mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
        SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT()));
    }
    public static void ClickRightMouseButton()
    {
        INPUT mouseDownInput = new INPUT();
        mouseDownInput.type = SendInputEventType.InputMouse;
        mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTDOWN;
        SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));

        INPUT mouseUpInput = new INPUT();
        mouseUpInput.type = SendInputEventType.InputMouse;
        mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTUP;
        SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT()));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在winform和wpf中以编程方式实现鼠标移动、单击、右键单击和按键等? 的相关文章

随机推荐

  • java中对象和引用的区别与代码?

    public class TestVO public static void main String args VO vo1 new VO VO vo2 new VO VO vo3 VO vo4 new VO vo1 setName Sou
  • php获取多维数组的唯一值[重复]

    这个问题在这里已经有答案了 可能的重复 php多维数组删除重复项 https stackoverflow com questions 1861682 php multi dimensional array remove duplicate
  • Tomcat8 Gzip 压缩 CSS、JS

    我正在使用 tomcat8 并尝试模拟 CSS 和 JS 的 GZIP 压缩 我已在 server xml 中添加了条目 如下所示
  • angularjs指令动态设置模板url

    我正在使用模板 URL 创建指令 我想根据 user role 动态设置模板 URL 任何想法 这是我的指令代码 RatingRX directive headermenu gt directive directive restrict E
  • d3.js:如何创建“力导向图集群”

    我一直在探索 d3 js 库 尤其是力导向图创建 我仔细阅读了 Bostock 等人关于它的论文 并注意到我正在尝试创建的精确类型的图表 基本上是一个力导向图 其中带有围绕羽毛组的颜色编码区域 这是第三列第二行的插图 此处标记为 力导向图簇
  • 从其他容器访问mysql容器

    我已经使用暴露 3306 的 mysql 设置了 docker 容器 我已经指定了数据库用户 数据库密码并创建了一个测试数据库并将权限授予新用户 在另一个容器中 我想访问这个数据库 因此 我使用一个简单的 php 脚本设置了新容器 该脚本在
  • 首先将外键映射到 EF 代码中的非主代理键列

    public class A DatabaseGenerated DatabaseGeneratedOption Identity public virtual int Aid get set public virtual ICollect
  • 选择元素时,CSS 中的插入符号 ^ 有何用途?

    我在文件中遇到了这样的 css 选择器 contactDetails ul li a a href tel 像这样的抑扬符 在 CSS 中没有定义的含义 两字符运算符 可用于属性选择器 http www w3 org TR selector
  • 使用字节将字母数字代码解码为键值对象

    我有一个来自 CS GO 游戏的 十字准线代码 CSGO O4Jsi V36wY rTMGK 9w7qF jQ8WB 我可以使用此函数解码一些值 import BigNumber from bignumber js Intentionall
  • Mongodb php查询,在数组中搜索?

    我正在寻找一种在具有以下结构的 answer 文档数组中搜索关键字 例如 Henrik 的方法 Array id gt MongoId Object id gt 4eeedd9545c717620a000007 formId gt 6 re
  • 使用纬度/经度计算从 A 点到线段的距离

    我正在开发一个使用 GPS 的 Android 应用程序 我想知道如果 新位置 C 点 距离线段 AB 太远 是否有办法可以丢弃 GPS 位置数据 我正在使用发现的点到线段公式在维基百科上 http en wikipedia org wik
  • 在MySQL php中将ID从一个表插入到另一个表

    我有两张桌子 一张是Information另一个是work force 信息 劳动力 当 的时候addInformation 接到电话 我想将数据插入到信息 以及id这是自动增量将插入表workForce 列 twf 这是我尝试过的 添加信
  • 在 BPMN 中用一个任务表示 while 循环的正确方法是什么?

    BPMN 中表示仅重定向到一个任务的简单 while 循环的正确方法是什么 我想说使用循环活动是更好的选择 因为它有助于保持流程模型整洁 在流程中创建循环时也要小心 因为任务定义通常在第一次迭代和第二次迭代之间发生变化 例如第一次迭代是创建
  • 如何使应用程序的触摸栏在 macOS 上始终可见?

    我正在做macOS 菜单栏应用程序 https vidr io显示全屏覆盖 用户可以通过菜单栏中的滑块控制该叠加层的不透明度 我希望将这些控件移至触摸栏 因为该应用程序用于屏幕录制 并且会记录主屏幕上的干扰 我的应用程序中的滑块应该像默认情
  • Spring Security 3.1.0 - 无法从 HTTPS 切换到 HTTP

    我是 Spring Security 的新手 所以我制作了一个小型 Web 应用程序 以便尝试它并找到对我正在从事的项目有用的配置 我强制通过 HTTPS 访问登录页面 登录后需要切换回 HTTP 换句话说 登录页面 仅限 HTTPS 其他
  • iPhone开发-设置UIWebView字体

    我必须显示从服务器提取的富文本 所以我使用 UIWebView 现在的问题是我无法控制 UIWebView 中使用的字体 如何更改字体以使用系统字体 使其与应用程序的其余部分一致 我现在正在做这样的事情 myRichTextView UIW
  • 如何在 AWS CloudWatch Insights 中按字段聚合日志,然后按 bin 聚合日志?

    我正在尝试执行一个查询 该查询将首先按字段计数聚合 然后按bin 1h 例如我想得到如下结果 Date Field Count 1 2019 01 01T10 00 00 000Z A 123 2 2019 01 01T11 00 00 0
  • 存档的 macOS 应用程序启动时显示空白窗口

    我有一个 macOS 应用程序 其中包含一个 ViewController 可以重命名应用程序窗口并调整其大小 有几个按钮 以及一个在启动时加载默认网页的 WKWebView 该项目本身是一个 xcworkspace 文件 因为它包含用于
  • 对外部程序的非阻塞调用,不会丢失返回码

    当从 Matlab 中启动外部程序 为了简洁起见 我们将其称为 EX 时 我可以这样做 status result system EX exe 它将阻塞直到 EX 返回 或者像这样 status result system start EX
  • 如何在winform和wpf中以编程方式实现鼠标移动、单击、右键单击和按键等?

    如何在 winform 和 wpf 中以编程方式移动鼠标 单击 右键单击和按键等 如果可能的话 请帮我提供代码片段 如果我正确理解你的问题 那么你想真正模拟输入 在这种情况下SendInput是要走的路 从这个链接 http robrely