【发布时间】: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.Explicit 的 Input 不起作用吗?
【问题讨论】:
标签: c# telerik pinvoke marshalling unmanaged