我研究了一些选择,主要是;
> Sendkeys.Send() for right alt key? any alternatives?
> 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”来发送通用班次A,但是我需要能够区分左右班次,控制和alt等.
SendKeys.Send()甚至可能吗?
另外,我想知道是否有使用Keys枚举之类的解决方案.
解决方法:
不,使用.NET Framework SendKeys.Send(String)方法无法区分左右Shift,Ctrl和Alt键,但是使用Keys枚举在正确的轨道上.您将需要使用互操作服务.
由于您要查询的方法位于System.Windows.Forms命名空间中,因此我假设您正在使用WinForms.以下是创建WinForms应用程序的部分说明,该应用程序具有六个按钮,这些按钮会将Right Shift,Left Shift,Right Alt,Left Alt,Right Ctrl和Left 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);
}