我正在尝试为需要使用多个桌面光标的https://www.leapmotion.com设备创建一个接口程序。因为windows不允许多个光标,所以我的第一个任务是创建一个可以在桌面和其他窗口中移动的可视光标。
我现在的方法是实现一个循环,并在清除光标对象的同时连续绘制它。绘图部分工作正常,但我在清除部分时遇到问题。我尝试在Pinvoke中使用RedrawWindow(),但是下面的代码在测试过程中崩溃了。
错误消息:对'WpfApplication1!WpfApplication1.MainWindow::RedrawWindow‘函数PInvoke的调用使堆栈不平衡。这可能是因为托管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()命令清除。
你知道哪里出问题了吗?
发布于 2013-09-08 22:05:09
我认为问题在于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
https://stackoverflow.com/questions/18684323
复制相似问题