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



我主要研究了一些选项;

  1. Sendkeys.Send() for right alt key? 有什么选择吗?
  2. https://social.msdn.microsoft.com/Forums/vstudio/en-US/dd6406e8-b6bf-4166-82a0-6d533def38a5/how-to-send-leftright-shift-key?forum=csharpgeneral

但是我找不到是否可以将系统密钥的右侧或左侧变体发送到SendKey.Send()api。例如,可以通过根据文档提供"+A"来发送通用shift+A,但我需要能够区分左右移位控制和alt等。

SendKeys.Send()甚至可能吗?

除此之外,我想知道是否有使用类似 Keys 枚举的解决方案。

不,使用 .NET Framework SendKeys.Send(String) 方法无法区分左右ShiftCtrlAlt键,但使用Keys枚举时,您走在正确的轨道上。您需要改用互操作服务。

由于您要查询的方法位于命名空间System.Windows.Forms中,因此我假设您正在使用WinForms。下面是创建具有六个按钮的 WinForms 应用程序的部分说明,这些按钮将右移、左、右 Alt、Alt右 Ctrl和左Ctrl键发送到应用程序自己的窗口。在窗体上放置一个标签,以便它可以显示按下的六个键中的任何一个。这是通过覆盖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);
}

我不知道SendKey.Send(),但我知道适合您的替代解决方案。
使用自动。它是一种用于自动化窗口GUI的脚本语言。重要的是它提供了.dll文件以允许 .NET 使用。您只需要下载,安装它并添加对.dll文件的引用。
你的代码将是这样的:AutoItX.Send("{RSHIFT}")

最新更新