【问题标题】:SendInput() press 6 and not rightSendInput() 按 6 不正确
【发布时间】:2018-11-06 15:35:40
【问题描述】:

我正在尝试使用 SendInput 发送击键。例如,如果我尝试发送键 A,则该代码有效,但如果我尝试右箭头键,它会键入 6。不知道为什么。

[DllImport("USER32.DLL")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
    public static extern IntPtr FindWindow(string lpClassName,
        string lpWindowName);

    [DllImport("user32.dll")]
    internal static extern uint SendInput(
        uint nInputs,
        [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
        int cbSize);

    private void button1_Click(object sender, EventArgs e)
    {
        SetForegroundWindow(FindWindow("Notepad", "Untitled - Notepad"));
        SendInputWithAPI();
    }


    void SendInputWithAPI()
    {
        INPUT[] Inputs = new INPUT[1];
        INPUT Input = new INPUT();

        Input.type = 1; // 1 = Keyboard Input
        Input.U.ki.wScan = ScanCodeShort.RIGHT;
        Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
        Inputs[0] = Input;


        SendInput(1, Inputs, INPUT.Size);
    }

顺便说一句,ScanCodeShort.RIGHT 返回 77。 谢谢。

【问题讨论】:

  • 右 = NUM​​PAD6 = 77
  • @GSerg 不太了解,我从谷歌那里得到了输入。
  • @neil.work 那么我应该怎么做才能让它真正正常工作?
  • 去掉SCANCODE标志,不初始化Input.U.ki.wScan,把VK_RIGHT传给Input.U.ki.wVk?扫描码表示物理键而不是逻辑键,如果扫描码表示数字键盘键 6,则结果将取决于例如您的 Num Lock 状态。

标签: c# sendinput


【解决方案1】:

扫描码代表物理键。不同的键盘布局和状态,同一个物理按键可能有不同的含义,但其扫描码始终相同。 IE。物理“numpad 6”键可能表示右箭头或数字 6,具体取决于 Num Lock 的状态。

如果您的目标是“按下”逻辑“右箭头”,而不是物理键盘上的某个物理键,无论其当前含义如何,您都应该使用虚拟键代码。它们代表物理键的当前含义。假设你的INPUT structure declaration is correct

private const int INPUT_KEYBOARD = 1;
private const int VK_RIGHT = 0x27;
Input.type = INPUT_KEYBOARD;
Input.U.ki.wVk = VK_RIGHT;
Inputs[0] = Input;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多