如何将左右系统键发送到SendKeys.Send()?

2024-02-28

我主要研究了几个选项;

  1. Sendkeys.Send() 用于右 alt 键?有什么替代方案吗? https://stackoverflow.com/questions/9330498/sendkeys-send-for-right-alt-key-any-alternatives?rq=1
  2. https://social.msdn.microsoft.com/Forums/vstudio/en-US/dd6406e8-b6bf-4166-82a0-6d533def38a5/how-to-send-leftright-shift-key?forum=csharpgeneral https://social.msdn.microsoft.com/Forums/vstudio/en-US/dd6406e8-b6bf-4166-82a0-6d533def38a5/how-to-send-leftright-shift-key?forum=csharpgeneral

But I can't find if it's possible to send the right or left variants of system keys to the SendKey.Send() api. For example it's possible to send the generic shift+A by supplying "+A" as per the documentation https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.sendkeys.send?view=netframework-4.7.2#remarks but I need to be able to differentiate between left and right shift, control and alt etc.

是否有可能与SendKeys.Send()?

除此之外,我想知道是否有使用类似的解决方案Keys https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.keys?view=netframework-4.7.2 enum.


No, it's not possible to differentiate between left and right Shift, Ctrl, and Alt keys with the .NET Framework SendKeys.Send(String) method, but you're on the right track with the Keys enum. You'll need to use interop services instead.

Since the method you are inquiring about is in the namespace System.Windows.Forms, I've assumed you're working with WinForms. Below are partial instructions for creating a WinForms app that has six buttons which send Right Shift, Left Shift, Right Alt, Left Alt, Right Ctrl, and Left Ctrl keys to the app's own window. Put a Label on the Form so that it can display whichever of the six keys was pressed. This is made possible by overriding DefWndProc.

你应该能够填补缺失的部分。更改应用程序以将这些击键发送到另一个应用程序也不应该太困难。

确保 Form1.cs 文件顶部有这些 using 语句:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

在顶部的 Form1.cs 类中声明:

  • 一个常量字段,表示您要发送的消息类型
  • 用于存储应用程序窗口句柄的字段
  • SendMessage Windows API 方法
const int WM_KEYDOWN = 0x100;
IntPtr _hWnd;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

在调用 InitializeComponent 下方的 Form1 构造函数中,定义一个事件处理程序,该处理程序将允许您检索和存储应用程序的窗口句柄:

HandleCreated += new EventHandler((sender, e) =>
{
    _hWnd = this.Handle;
});

将所有按钮指向同一个单击事件处理程序,每个按钮都相应命名:

void button_Click(object sender, EventArgs e)
{
    var button = (Button)sender;
    var wParam = new IntPtr();

    switch (button.Name)
    {
        case "buttonSendRightShift":
            wParam = (IntPtr)Keys.RShiftKey;
            break;
        case "buttonSendLeftShift":
            wParam = (IntPtr)Keys.LShiftKey;
            break;
        case "buttonSendRightAlt":
            wParam = (IntPtr)Keys.RMenu;
            break;
        case "buttonSendLeftAlt":
            wParam = (IntPtr)Keys.LMenu;
            break;
        case "buttonSendRightCtrl":
            wParam = (IntPtr)Keys.RControlKey;
            break;
        case "buttonSendLeftCtrl":
            wParam = (IntPtr)Keys.LControlKey;
            break;
    }
    SendMessage(_hWnd, WM_KEYDOWN, wParam, 1);
}

像这样重写 DefWndProc:

protected override void DefWndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM_KEYDOWN:
            switch ((Keys)m.WParam)
            {
                case Keys.RShiftKey:
                    LabelKeyPressed.Text = "Right Shift Key Received";
                    break;
                case Keys.LShiftKey:
                    LabelKeyPressed.Text = "Left Shift Key Received";
                    break;
                case Keys.RMenu:
                    LabelKeyPressed.Text = "Right Alt Key Received";
                    break;
                case Keys.LMenu:
                    LabelKeyPressed.Text = "Left Alt Key Received";
                    break;
                case Keys.RControlKey:
                    LabelKeyPressed.Text = "Right Ctrl Key Received";
                    break;
                case Keys.LControlKey:
                    LabelKeyPressed.Text = "Left Ctrl Key Received";
                    break;
            }
            break;
    }
    base.DefWndProc(ref m);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将左右系统键发送到SendKeys.Send()? 的相关文章

  • 结构体如何存储在内存中?

    我有一个struct iof header在我的代码中 我确定它的宽度是 24 字节 我执行 sizeof iof header 它返回 32 字节宽 问题1为什么是 32 字节宽而不是 24 字节宽 问题2包括其成员在内 结构体如何存储在
  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 自动映射器多对多 stackoverflowException

    我遇到以下映射的堆栈溢出 Mapper CreateMap
  • 深拷贝和动态转换 unique_ptr

    假设我有一个如下所示的类 class A virtual A class B public A class C public A 我还有一个 unique ptr 向量 它是这样声明的 std vector
  • C# 无法捕获 SerializationException

    我的程序在加载序列化文件的部分遇到问题 如果文件无法反序列化 我希望很好地失败 但由于某种原因 我的程序将中断而不是进入 catch 子句 这是我的代码 using FileStream fs new FileStream openFile
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 使用多态对象数组进行 JSON 反序列化

    我在涉及多态对象数组的 JSON 反序列化方面遇到问题 我已经尝试过记录的序列化解决方案here https stackoverflow com questions 5186973 json serialization of array w
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • 错误 TS1127:在 Angular 7 中运行 Karma 测试时出现无效字符

    我收到错误error TS1127 Invalid character在 Visual Studio Code 终端中 为 Angular 7 应用运行 Karma 测试时 命令行版本 7 3 9 I have 一份 Karma 测试规范在
  • Scapy:处理部分 TLS 段

    我正在尝试使用 Scapy 从 pcap 中提取 TLS 元数据 我能够成功解析数据包和单个消息 例如 client hello server hello 等及其字段 我遇到的问题是当 TLS 记录分布在多个 TCP 数据包 段时 这种情况
  • boost:序列化重构(加载)

    我正在使用 boost serialization 将数据结构保存到文件中 实际数据是类和子类的指针向量 然而 被序列化的类的构造函数将另一个实例化的类 Agent 作为参数 该类 Agent 是控制与模拟 API webots 通信的对象
  • 使用 linQ 和 lambda 表达式删除记录

    我想使用 linq lambda 表达式删除 sql 数据库的记录 我应该怎么办 这里 student 是我的表 db 是 edmx 文件的对象 public bool DeleteRecord int caurseID studentEn
  • Java - 如何使非字符串对象的 JComboBox 显示字符串名称?

    我想做JComboBox元件展示String名称 而不是参考文献 但是 我不知道这是如何做到的 下面显示了我的代码 public class Properties extends JPanel implements ItemListener
  • 为什么在运行单元测试时,django 设置会导入两次,并且测试数据库会创建两次?

    姜戈 1 3 皮查姆 1 5 3 我正在为使用 GEOS 保存 Point 对象的 Django 应用程序编写单元测试 对于本地测试 我按照 GeoDjango 文档遵循了自定义 Spatialite 后端的每一步 每当我尝试使用 Poin
  • 如何检查json对象是否为数组

    我是 python 新手 在将 json arraylist 对象从 java 发送到 python 时 我遇到了这个问题 从 java 发送 json 对象时 arraylist 的 json 结构是 firstObject firstV
  • Magento V1.7 网格视图 - 添加制造商属性以查看

    On 这一页 http www foxtrotgear com index php tactical gear equipment html mode grid我想在商品名称的正下方添加制造商名称 但似乎无法使其正常工作 尝试了很多建议 但
  • 阿格达。冒号之前/之后的参数

    定义数据类型时 我可以在冒号之前 传递 一些参数 data Image A B Set f A B B Set where im f A B x A Image f f x 但出于未知原因 我似乎无法在函数声明中执行此操作 exIm A B
  • MySQL:在同一个 MySql 实例上克隆 MySQL 数据库

    我想编写一个复制当前数据库的脚本sitedb1 to sitedb2在同一个 mysql 数据库实例上 我知道我可以将 sitedb1 转储到 sql 脚本 mysqldump u root p sitedb1 gt db name sql
  • 文本渲染器。如何使用尾省略号渲染多行文本?

    我如何呈现这样的文本 简单列表视图 尝试这样的代码不会出现省略号 TextRenderer DrawText listGraphics anItem Text GetItemFont anItem textRec Color FromKno
  • Java代码中如何标记忽略返回值?

    C 约定标记该函数仅因副作用而调用 并且在这个特定的调用中我们对返回值不感兴趣 void getSomethingAndDoAction Java中有类似的东西吗 The 容易出错的项目 https errorprone info has
  • 将音频输出重定向到手机扬声器,将麦克风输入重定向到耳机

    是否可以将音频输出重定向到手机扬声器并仍然使用麦克风耳机输入 如果我将音频路由重定向到手机扬声器而不是耳机 它也会重定向麦克风 这是有道理的 但我似乎不能仅仅重定向麦克风输入 有任何想法吗 这是我用来将音频重定向到扬声器的代码 UInt32
  • 在Xamarin中动态添加入口控件

    我想获取XML 输入控制 from API 可用于JSON Entry 控件的所有属性均采用 JSON 格式 我想将它们添加到 xml页面并获取它们的值 当用户进入应用程序时 ViewModel 通过数据绑定 UPDATE 根据答案更新代码
  • 如何自定义 Eclipse 的 getter 和 setter 生成?

    如何配置 Eclipse 来生成带有参数变量前缀的 getter 和 setter Example private String someVariable public void setSomeVariable String aSomeVa
  • 有没有适用于 Android 传真的本机应用程序?

    我想开发一个传真应用程序 我在谷歌上搜索并找到了一些链接 用于在android上开发传真应用程序的应用程序 但是我想使用android的本机应用程序开发应用程序 在一些网站上 我读到免费的网络服务可用于发送 使用Android移动应用程序接
  • Rcpp 公开类的序列化

    我在 R 包中编写了一个 C 类 并将其暴露给 R 命名空间RCPP EXPOSED CLASS and RCPP MODULE 一切都很好 gt index An object of class Index Slot index C ob
  • 我使用 PyPy 是否错误?它比标准 Python 慢 10 倍

    我听说过有关 PyPy 的好消息 特别是我听说它非常快 这让我想知道它是否可用于我的嵌入式项目 我下载了PyPy 2 6 for my Windows 7PC 并将内容解压到一个目录中 我编写了一个小型测试程序来进行基准测试 import
  • 有关电话号码的信息

    node js 是否有任何库可以接收电话号码 任何格式 将其转换为默认格式 并告诉我有关该号码的信息 例如 国家 地区 城市等 我不知道 我也搜索过npm 注册表 http search npmjs org 谷歌有库电话号码 http co
  • 如何将左右系统键发送到SendKeys.Send()?

    我主要研究了几个选项 Sendkeys Send 用于右 alt 键 有什么替代方案吗 https stackoverflow com questions 9330498 sendkeys send for right alt key an