2017-08-21 7 views
0

この問題はTelerik Testing Frameworkで私に届きます。
Telerik Testing Framework SendInputメソッドを使用してマウスクリックをシミュレートしようとしましたが、アプリケーションと対話してもマウスクリックは発生しません。フードtelerikコードの下
C#:管理されていないメソッドSendInputは構造体の異なる表現では機能しません

 [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); 

のように見えます。しかしから構造がLayoutKind.Explicit 入力の変化は LayoutKind.Sequentialにすべては、たとえば、正常に動作している場合:

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

私の意見では、両方のバリアントはメモリ内で同じであるため、動作する必要があります。

何か考えてくださいLayoutKind.Explicitは動作しません。

答えて

0

は、のアライメントが8であるため、アライメントが8です。つまり、64ビットシステムでの正しいオフセットは4ではなく8です。シーケンシャルレイアウトに切り替えると、C#コンパイラ正しい場所にMOUSEINPUT構造体を配置することができます。

私はあなたのバージョンもあまり気にしません。 INPUT構造体は実際にはサイズフィールドで、MOUSEINPUTKEYBDINPUTおよびHARDWAREINPUTというユニオンが続きます。 MOUSEINPUTのみを含むことは、共用体の他の2つのメンバーと同じ整列を持ち、2つの省略された構造体の整列以上の整列を持つMOUSEINPUTに依存します。

INPUTという宣言を使用することをお勧めします。https://stackoverflow.com/a/6833311/505088

関連する問題