Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:绘制自己的光标-非平凡问题_C#_Wpf_Cursor_Click Through_Snapping - Fatal编程技术网

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

C# WPF:绘制自己的光标-非平凡问题,c#,wpf,cursor,click-through,snapping,C#,Wpf,Cursor,Click Through,Snapping,我需要实现一个具有一些非常特定功能的游标: 它必须是动画的 因为n秒后,它会自动单击-因此,当单击发生时,动画是对用户的反馈 它必须与我们的一些控制装置相连接 它必须在我们的应用程序之外工作 迄今为止的做法: 将我的WPF控件呈现为位图,从中生成游标结构,并使用user32.dll/SetSystemCursor进行设置 PRO 光标在鼠标之后没有延迟,因为它是真实的光标 CON 捕捉非常困难,特别是因为我们有绝对和相对输入设备,我必须一直重置鼠标位置,或者使用user32.dll/

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

  • 它必须是动画的
    • 因为n秒后,它会自动单击-因此,当单击发生时,动画是对用户的反馈
  • 它必须与我们的一些控制装置相连接
  • 它必须在我们的应用程序之外工作
迄今为止的做法:

  • 将我的WPF控件呈现为位图,从中生成游标结构,并使用user32.dll/SetSystemCursor进行设置
    • PRO
    • 光标在鼠标之后没有延迟,因为它是真实的光标
    • CON
    • 捕捉非常困难,特别是因为我们有绝对和相对输入设备,我必须一直重置鼠标位置,或者使用user32.dll/ClipCursor(System.Windows.Forms.Cursor.Clip也一样),但是捕捉到的光标总是在捕捉位置周围晃动(尝试逃逸,再次重置…)
    • 我使用的代码会在一段随机时间后抛出奇怪的异常,因此我当前的代码看起来相当不稳定
  • 将我自己的光标渲染到最大化、最顶部、允许透明、windowstyle=none、不可见的窗口中,并在鼠标后手动移动光标(如Canvas.SetLeft(cursor,MousePosition.X))
    • PRO
    • 捕捉可以(容易地)完成
    • CON
    • 当鼠标点击并点击光标时,光标被点击,而不是窗口
    • 一直在调度程序后台循环中轮询鼠标位置对我来说不是很漂亮
要解决第二种方法,我的光标必须至少有一个透明像素 在热点,以便鼠标可以点击通过。。。这对我来说似乎不是一个真正的解决办法

有人知道吗

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

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

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

可以在以下位置找到:

感谢

我可以点击我的自画光标,它跟随鼠标位置 设置窗口样式:none和allowtransparent,就像我已经做的那样,并且 然后

并从OnSourceInitialized调用makeTransparent

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