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

时间:2010-07-08 08:20:34

标签: c# wpf cursor click-through snapping

我需要实现一个具有一些非常特殊功能的游标:

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

到目前为止的方法:

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

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

任何想法都是谁?

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

示例app&源代码显示将鼠标捕捉到固定位置的问题:ClipIt.rar

示例app&随机时间后失败的源 - 设置自绘光标:TryOwnCur.rar

可以在http://sourcemonk.com/Cursor

下找到

1 个答案:

答案 0 :(得分:0)

感谢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 ...