【问题标题】:SendInput() does not produce any visible outputSendInput() 不产生任何可见的输出
【发布时间】:2014-09-13 21:16:19
【问题描述】:

我在获取 SendInput 函数以产生任何类型的输出时遇到问题。所有结构都定义如下(我已经离开了鼠标和硬件):

[StructLayout(LayoutKind.Explicit)]
    public struct INPUT
    {
        [FieldOffset(0)]
        public int type;
        [FieldOffset(8)]
        public MOUSEINPUT mi;
        [FieldOffset(8)]
        public KEYBDINPUT ki;
        [FieldOffset(8)]
        public HARDWAREINPUT hi;
    }

[StructLayout(LayoutKind.Sequential)]
    public struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

我通过以下方式发送密钥:

SetForegroundWindow(hProc); // using user32.dll switch to desired process
// send keydown 
INPUT iKeyDown = new INPUT();
KEYBDINPUT sKeysDown = new KEYBDINPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki = sKeysDown;
sKeysDown.wVk = 0;
sKeysDown.wScan = (ushort)0x1E;
sKeysDown.dwFlags = 0x0008 ;
sKeysDown.time = 0;
sKeysDown.dwExtraInfo = GetMessageExtraInfo();

我以完全相同的方式发送 Key Up 事件,除了 dwFlags 属性:

sKeysUp.dwFlags = 0x0008 | 0x0002;

最后,

INPUT[] aInputs = new INPUT[] { iKeyDown, iKeyUp };
uint result = SendInput(2, aInputs, Marshal.SizeOf(iKeyDown));  // when dll importing, SetLastError = true 
int error = Marshal.GetLastWin32Error();
Debug.WriteLine(result.ToString() + " " + error.ToString());

这样的结果是,嗯,没有可见的输出,结果变量总是等于 2(成功输入的数量)并且 GetLastWin32Error() 返回 0(根据错误代码,它是成功的)。我在这里有什么遗漏吗?干杯!

【问题讨论】:

  • 您的 SetForegroundWindow() 调用失败。 从不 忽略 winapi 函数的返回值。它需要一个窗口句柄,而不是进程句柄。
  • @HansPassant 如果我猜是一个糟糕的变量,就是这种情况。我使用 `FindWindow(null, WINDOW_HEADER_NAME) 得到它,它是一个窗口句柄,而不是别的东西。它按预期工作,返回 True。我可能应该重命名那个变量。
  • @Lambdaλ MouseInput, KeyboardInput, HardwareInput 是一个联合体。看这里 - msdn.microsoft.com/en-us/library/windows/desktop/…
  • @PsyXandeR 你是doing it wrong anyway
  • 你忽略了调用的返回值。不好。工会应该按照雷蒙德的方式进行。到目前为止,使用 SendKeys 更容易。或者自动化。也许其他应用程序不喜欢伪造的输入。你用记事本测试过吧?

标签: c# winapi sendinput


【解决方案1】:

我已经回答了我自己的问题 - 我错误地填写了结构。而不是

INPUT iKeyDown = new INPUT();
KEYBDINPUT sKeysDown = new KEYBDINPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki = sKeysDown;
sKeysDown.wVk = 0; // etc

我应该做的

INPUT iKeyDown = new INPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki.wvK = 0; // etc

相反。那个新的 KEYBDINPUT() 把事情搞砸了。正如 GSerg 建议的那样,我也确实将鼠标/键盘/硬件联合放在了自己单独的结构中。现在它按预期工作。

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多