0

我正在编写一个控制器程序,它模拟对任何活动应用程序的击键。我找到了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);

我知道wVkandwScan可以通过System.Windows.Forms.Keys枚举值分配。我还查看了值,发现Shift=65536, Control=131072, Alt=262144(所有键的值都是 1-254)。我也知道这三个值应该在wScan(对应的 1、2、4)中,它们是修饰符状态标志。但是三个问题:

  1. 例如,我想向活动应用程序发送一个左 Ctrl 键,我必须同时传递一个wVk==LControlKeywScan==Control?如果我只通过第一个而不通过第二个会发生什么?我应该通过wVk==LControlKey; wScan==Control; dwFlags==0(key down dwFlags) 和wVk==LControlKey; wScan==0; dwFlags==2(key up dwFlags) 吗?

  2. Keys枚举中存在LControlKey, RControlKey, ControlKey,第三个是什么意思?

  3. Keys枚举中存在 Control 键和 Shift 键,但为什么没有 Alt 键?那么是否可以通过SendInput方法发送 Alt 击键?

4

0 回答 0