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 回答