代码之家  ›  专栏  ›  技术社区  ›  santa

WPF:绘制自己的光标-非平凡问题

  •  1
  • santa  · 技术社区  · 15 年前

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

    • 必须设置动画
      • 因为n秒后它会自动点击-所以当点击发生时,动画是对用户的反馈
    • 它必须与我们的一些控制装置相结合
    • 它必须在我们的应用程序之外工作

    目前的方法:

    • 将我的WPF控件呈现为位图,从中生成一个游标结构,并使用user32.dll/SetSystemCursor设置它
      • 赞成的意见
      • 反对的论点
      • 捕捉是相当困难的,特别是因为我们有绝对和相对的输入设备,我将不得不重置鼠标位置的所有时间或使用user32.dll/ClipCursor(System.Windows.Forms.Cursor.Clip做同样的),但捕捉的光标总是围绕着捕捉的位置(试图逃脱,得到的复位再次…)
      • 我使用的代码在一段随机时间后抛出奇怪的异常-因此我当前的代码看起来相当不稳定
    • 将我自己的光标渲染到一个最大化的、最顶层的、允许透明的、windowstyle=none的、不可见的窗口中,并在鼠标后手动移动光标(如Canvas.SetLeft(cursor,MousePosition.X))
      • 可以(容易地)进行捕捉
      • 反对的论点
      • 当鼠标点击并击中光标时,光标被点击,而不是窗口
      • 一直在调度程序后台循环中轮询mouseposition对我来说不是很漂亮

    有人知道吗?

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

    示例应用程序;显示将鼠标捕捉到固定位置的问题的源代码:ClipIt.rar

    示例应用程序;随机时间后失败的源-设置自绘制光标:TryOwnCur.rar

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   santa    15 年前

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

    我可以点击我自己画的光标,它跟随鼠标的位置

    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);
      }