我正在编写一个控制器程序,它模拟对任何活动应用程序的击键。我找到了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
andwScan
可以通过System.Windows.Forms.Keys
枚举值分配。我还查看了值,发现Shift=65536, Control=131072, Alt=262144
(所有键的值都是 1-254)。我也知道这三个值应该在wScan
(对应的 1、2、4)中,它们是修饰符状态标志。但是三个问题:
例如,我想向活动应用程序发送一个左 Ctrl 键,我必须同时传递一个
wVk==LControlKey
吗wScan==Control
?如果我只通过第一个而不通过第二个会发生什么?我应该通过wVk==LControlKey; wScan==Control; dwFlags==0
(key down dwFlags) 和wVk==LControlKey; wScan==0; dwFlags==2
(key up dwFlags) 吗?在
Keys
枚举中存在LControlKey, RControlKey, ControlKey
,第三个是什么意思?在
Keys
枚举中存在 Control 键和 Shift 键,但为什么没有 Alt 键?那么是否可以通过SendInput
方法发送 Alt 击键?