如何在SendInput中使用扩展扫描码

How to use extended scancodes in SendInput

本文关键字:扩展 扫描 SendInput      更新时间:2023-10-16

为了模拟一些键,我必须向那里发送扫描码,为此我使用WinAPI中的SendInput()函数,在大多数情况下它都很好,但如何使用它来发送"Pause"等键的扫描码?该键生成6字节扫描码(E1 1D 45 E1 9D C5),因为KEYBDINPUT结构中的扫描码具有WORD类型,即只允许使用最多2字节的扫描码。我尝试了1D45扫描代码和带有KEYEVENTF_EXTENDEDKEY标志的9DC5,建议它根据内容应用E0\E1代码。我还尝试发送六个1字节命令的序列。但所有这些都不起作用。

我找到了答案。对于SendInput,您必须向数组中发送两个输入。第一个条目将为0xE0,第二个条目将是您的扫描码。

事实上,我在这里找到了解决方案,嵌入到图形中:https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa299374(v=vs.60)

请参阅代码。这是C#,但你会明白的。

        inputs = new[]
        {
            new WinAPI.INPUT
            {
                type = WinAPI.INPUT_KEYBOARD,
                u = new WinAPI.InputUnion
                {
                    ki = new WinAPI.KEYBDINPUT()
                    {
                        wScan = (ushort) 0xe0,
                        wVk = (ushort) 0,
                        dwFlags = (ushort) dwFlags,
                        dwExtraInfo = WinAPI.GetMessageExtraInfo()
                    }
                }
            },
            new WinAPI.INPUT
            {
                type = WinAPI.INPUT_KEYBOARD,
                u = new WinAPI.InputUnion
                {
                    ki = new WinAPI.KEYBDINPUT()
                    {
                        wScan = (ushort) tscancode,
                        wVk = (ushort) tvk,
                        dwFlags = (ushort) dwFlags,
                        dwExtraInfo = WinAPI.GetMessageExtraInfo()
                    }
                }
            }
        };