WPF:绘制自己的光标 – 非常重要的问题

我需要实现一个具有一些非常具体的function的游标:

  • 它必须是动画的
    • 因为在n秒之后它会自动点击 – 所以当点击发生时,动画就是用户的反馈
  • 它必须捕捉我们的一些控件
  • 它必须在我们的应用程序之外工作

到目前为止的方法:

  • 将我的WPF控件渲染为位图,从中创建一个cursor-struct并使用user32.dll / SetSystemCursor来设置它
    • PRO
    • 鼠标后光标没有延迟,因为它是真正的光标
    • CON
    • 捕捉是相当困难的,特别是因为我们有绝对和相对的输入设备,我将不得不一直重置鼠标位置或使用user32.dll / ClipCursor(System.Windows.Forms.Cursor.Clip做同样的事情)但是捕捉的光标是总是在拍摄位置周围晃动(试图逃跑,再次重置……)
    • 我使用的代码在一些随机时间后抛出奇怪的exception – 所以我当前的代码似乎很不稳定
  • 将我自己的光标渲染为最大化,最顶部,允许透明,windowstyle = none,不可见窗口并在鼠标后手动移动光标(如Canvas.SetLeft(cursor,MousePosition.X))
    • PRO
    • 可以(轻松)完成捕捉
    • CON
    • 当鼠标点击并点击光标时,光标会被点击,而不是超出窗口
    • 在调度程序 – 背景循环中轮询鼠标位置对我来说似乎并不是很美

要解决第二种方法,我的光标必须在热点中至少有一个透明像素,以便鼠标可以点击…这对我来说似乎不是一个真正的解决方案……

任何想法都是谁?

编辑:一些示例来源显示问题…:

示例app和source显示将鼠标捕捉到固定位置的问题:ClipIt.rar

随机时间后失败的示例应用和源 – 设置自绘光标:TryOwnCur.rar

可以在http://sourcemonk.com/Cursor下找到

感谢http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f

我可以点击鼠标位置后面的自绘光标,通过设置窗口样式:none,和allowtransparent一样,然后我已经做了然后

public const int WS_EX_TRANSPARENT = 0x00000020; public const int GWL_EXSTYLE = (-20); [DllImport("user32.dll")] public static extern int GetWindowLong(IntPtr hwnd, int index); [DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle); public static void makeTransparent(IntPtr hwnd) { int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT); } 

并从OnSourceInitialized调用makeTransparent …