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

时间:2019-03-24 14:51:24

标签: c# sendkeys

我主要研究了几种选择;

  1. Sendkeys.Send() for right alt key? any alternatives?
  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。例如,可以通过根据documentation提供"+A"来发送通用的 shift + A ,但我需要能够区分左右移 shift control alt 等。

SendKeys.Send()甚至有可能吗?

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

2 个答案:

答案 0 :(得分:3)

否,无法使用.NET Framework SendKeys来区分左右 Shift Ctrl Alt 键。 (字符串)方法,但是您使用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;
});

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

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);
}

答案 1 :(得分:1)

我不了解SendKey.Send(),但我为您提供了另一种解决方案。
使用AutoIt。这是用于自动执行Windows GUI的脚本语言。重要的是它提供.dll文件以允许.NET使用。您只需要下载,安装并添加对.dll文件的引用。
您的代码将如下所示:AutoItX.Send("{RSHIFT}")