1

複数のデスクトップ カーソルを使用する必要があるhttps://www.leapmotion.comデバイス用のインターフェイス プログラムを作成しようとしています。Windows では複数のカーソルを使用できないため、最初のタスクは、デスクトップや他のウィンドウで移動できるビジュアル カーソルを作成することです。

私が今やっている方法は、ループを実装し、カーソル オブジェクトをクリアしながら継続的に描画することです。描画部分は問題なく動作しますが、クリア部分に問題があります。Pinvoke で RedrawWindow() を使用してみましたが、以下のコードはテスト中に壊れてしまいます。

エラー メッセージ: PInvoke 関数 'WpfApplication1!WpfApplication1.MainWindow::RedrawWindow' の呼び出しにより、スタックのバランスが崩れました。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke シグネチャの呼び出し規約とパラメーターがターゲットのアンマネージド シグネチャと一致することを確認します。

提供できるアドバイスに感謝します。

    [DllImport("user32.dll")]
    static extern int RedrawWindow(IntPtr hWnd, [In] ref RECT lprcUpdate, IntPtr hrgnUpdate, uint flags);

    ....

    private void Timer_Tick(object sender, EventArgs e)
    {
        using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
        {

            ///throw new NotImplementedException();
            System.Drawing.Point pt = System.Windows.Forms.Cursor.Position;



            System.Drawing.Rectangle rect = new System.Drawing.Rectangle(new System.Drawing.Point(pt.X - 10, pt.Y - 10), new System.Drawing.Size(20, 20));


            g.DrawEllipse(Pens.Black, rect);

            g.Dispose();

            RECT rc = new RECT( pt.X - 20, pt.Y - 20, pt.X + 20, pt.Y + 20 );

            RedrawWindow(IntPtr.Zero, ref rc, IntPtr.Zero, 0x0400/*RDW_FRAME*/ | 0x0100/*RDW_UPDATENOW*/| 0x0001/*RDW_INVALIDATE*/);

        }

    }

編集:

Alex Farber からの提案に従って、上記のコードを修正しました。(ありがとう!)

また、Sriram Sakthivel の提案により、追加の参照を追加しました。したがって、エラーなしでコンパイルおよび実行できるようになりましたが、描画された楕円は RedrawWindow() コマンドによってまだクリアされていません。

何が間違っているのですか?

4

1 に答える 1

1

問題は、P/Invoke 宣言に ref がないことだと思います

 [DllImport("user32.dll")]
    static extern bool RedrawWindow(IntPtr hWnd, [In] ref RECT lprcUpdate, IntPtr hrgnUpdate, uint flags);

そしてそれを次のように呼び出します

RedrawWindow(IntPtr.Zero, ref rc, IntPtr.Zero, ...);
                          ^ Note ref keyword here
于 2013-09-08T14:05:08.763 に答える