使用C#WPF上的Pinvoke擦除桌面上的绘制对象

时间:2013-09-08 13:40:12

标签: c# wpf leap-motion

我正在尝试为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()命令清除。

知道出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

我认为问题是你在P / Invoke声明中缺少引用

 [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