我正在编写一个控制器程序,它模拟任何活动应用程序的击键。我找到了这样的SendInput
方法(我只关心键盘,省略了无关的定义):
[StructLayout(LayoutKind.Explicit)]
public struct INPUT
{
[FieldOffset(0)]
public Int32 type;
[FieldOffset(4)]
public KEYBDINPUT ki;
[FieldOffset(4)]
public MOUSEINPUT mi;
[FieldOffset(4)]
public HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
public Int16 wVk;
public Int16 wScan;
public Int32 dwFlags;
public Int32 time;
public IntPtr dwExtraInfo;
}
[DllImport("user32.dll")]
public static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize);
我知道wVk
和wScan
可以通过System.Windows.Forms.Keys
enumation值分配。我还查看了值,发现Shift=65536, Control=131072, Alt=262144
(所有键的值都是1-254)。我也知道这三个值应该在wScan
(对应的1,2,4)中,它们是修饰符状态标志。但有三个问题:
例如,我想将左Ctrl键发送到活动应用程序,我必须同时通过wVk==LControlKey
和wScan==Control
吗?如果我只通过第一个而不是第二个会怎么样?我应该通过wVk==LControlKey; wScan==Control; dwFlags==0
(关键字dwFlags)和wVk==LControlKey; wScan==0; dwFlags==2
(关键字dwFlags)吗?
在Keys
enumation中存在LControlKey, RControlKey, ControlKey
,第三个是什么意思?
在Keys
enumation中存在Control键和Shift键,但为什么不使用Alt键?那么是不是可以通过SendInput
方法发送Alt按键?