【问题标题】:C#: The unmanaged method SendInput does not work with different representation of the structureC#:非托管方法 SendInput 不适用于结构的不同表示
【发布时间】:2018-01-29 05:17:01
【问题描述】:

这个问题来找我Telerik Testing Framework
Telerik 测试框架尝试使用方法SendInput 模拟鼠标点击与应用程序交互,但没有发生鼠标点击。

引擎盖下的telerik代码看起来像

       [StructLayout(LayoutKind.Explicit)]
    public struct Input
    {
        [FieldOffset(0)]
        public int type;
        [FieldOffset(4)]
        public MOUSEINPUT mi;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MOUSEINPUT
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    public static void MouseClick()
    {
        var leftDown = new Input();
        leftDown.type = 0;
        leftDown.mi.dwFlags = 2;
        SendInput(1, ref leftDown, Marshal.SizeOf(leftDown));


        var leftUp = new Input();
        leftUp.type = 0;
        leftUp.mi.dwFlags = 4;
        SendInput(1, ref leftUp, Marshal.SizeOf(leftUp));
    }
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, ref Input pInputs, int cbSize);

但如果将 Input 结构从 LayoutKind.Explicit 更改为 LayoutKind.Sequential 一切正常,例如:

[StructLayout(LayoutKind.Sequential)]
public struct Input
{
    public int type;
    public MOUSEINPUT mi;
}

在我看来,这两种变体都必须有效,因为在内存中它们的表示方式相同。

知道为什么带有 LayoutKind.ExplicitInput 不起作用吗?

【问题讨论】:

    标签: c# telerik pinvoke marshalling unmanaged


    【解决方案1】:

    在 64 位系统上,MOUSEINPUT 的对齐方式为 8,因为 dwExtraInfo 的对齐方式为 8。这意味着 64 位系统上的正确偏移量是 8 而不是 4。如果切换到顺序布局,那么C# 编译器能够将 MOUSEINPUT 结构放置在正确的位置。

    也就是说,我也不太喜欢你的版本。 INPUT 结构实际上是一个大小字段,后跟 MOUSEINPUTKEYBDINPUTHARDWAREINPUT 的并集。仅包含 MOUSEINPUT 依赖于 MOUSEINPUT 与联合的其他两个成员具有相同的对齐方式,并且具有大于或等于两个省略的结构的对齐方式。

    我建议您使用此处找到的INPUT 的声明:https://stackoverflow.com/a/6833311/505088

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2012-05-15
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多