複数のデスクトップ カーソルを使用する必要がある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() コマンドによってまだクリアされていません。
何が間違っているのですか?