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 …