Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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# .NET-在特定坐标处捕获光标位图 免责声明_C#_.net_Vb.net_Cursor_Interop - Fatal编程技术网

C# .NET-在特定坐标处捕获光标位图 免责声明

C# .NET-在特定坐标处捕获光标位图 免责声明,c#,.net,vb.net,cursor,interop,C#,.net,Vb.net,Cursor,Interop,这个问题与StackOverflow上的另一个问题有些相似,但要求略有不同 背景 我正在编写一个可编写脚本的自动化客户端,它可以从3个旧的Win32系统中删除数据 当光标悬停在某些特定区域上时,其中两个系统可能通过光标位图中的更改来指示是否存在已完成的任务。没有提供其他提示(颜色更改、状态消息) 我自己的代码来源于免责声明中提到的原始帖子 要求 虽然我能够通过编程将光标移动到特定坐标并通过CURSORINFO捕获光标位图,但我的想法是允许交互式用户继续使用计算机。事实上,强制定位会中断该过

这个问题与StackOverflow上的另一个问题有些相似,但要求略有不同

背景
  • 我正在编写一个可编写脚本的自动化客户端,它可以从3个旧的Win32系统中删除数据
  • 当光标悬停在某些特定区域上时,其中两个系统可能通过光标位图中的更改来指示是否存在已完成的任务。没有提供其他提示(颜色更改、状态消息)
  • 我自己的代码来源于免责声明中提到的原始帖子
要求
  • 虽然我能够通过编程将光标移动到特定坐标并通过CURSORINFO捕获光标位图,但我的想法是允许交互式用户继续使用计算机。事实上,强制定位会中断该过程
问题:
  • 是否有方法通过参数化位置捕捉光标位图(例如,请求光标信息,就好像焦点位于窗口W的坐标X,Y)

使用提供的信息实施了满足此问题具体要求的解决方案,因此所有功劳都归他所有

当前设置如图所示:

它在有两个显示器的机器上运行。图中未显示的是一个小型应用程序,它实际上负责事件监视和数据抓取——它以最小化和无人值守的方式运行

解决方案
  • 获取要测试的应用程序的窗口句柄(在本例中,我循环了进程返回的所有进程。GetProcesses():

  • 使用目标应用程序的窗口句柄,我们现在可以创建特定的消息并通过发送给它

  • 为了将坐标传递给SendMessage,我们需要将X和Y坐标序列化为单个长值:

    public int MakeLong(short lowPart, short highPart)
    {
        return (int)(((ushort)lowPart) | (uint)(highPart << 16)); 
    }
    
  • 我们需要来获取位图:

    Win32Stuff.CURSORINFO ci = new Win32Stuff.CURSORINFO();
    Win32Stuff.GetCursorInfo(ci);
    
  • 检查GetCursorInfo中的返回标志是否指示光标正在显示(pco.flags==cursor\u showing):

  • 使用获取光标位图的有效句柄:

    IntPtr hicon = default(IntPtr);
    hicon = Win32Stuff.CopyIcon(ci.hCursor);
    
  • 使用从处理程序中提取信息:

    Win32Stuff.ICONINFO icInfo = default(Win32Stuff.ICONINFO);
    Win32Stuff.GetIconInfo(hicon, icInfo);
    
  • 使用System.Drawing.Icon类,使用Icon.FromHandle获得可管理的副本,并传递CopyIcon返回的值

    Icon ic = Icon.FromHandle(hicon);
    
  • 通过Icon.ToBitmap方法提取位图

    Bitmap bmp = ic.ToBitmap();
    
局限性
  • 此解决方案在两种不同的操作系统上进行了测试:Windows XP和Windows 8。它只在Windows XP上工作。在Windows 8上,光标将闪烁并立即返回到“正确”格式,捕获的光标信息反映了这一点
  • 测试点区域必须可见(即,应用程序不得最小化,测试点不得位于重叠窗口下。但测试窗口可能部分重叠,并且不需要聚焦。)
  • 发出WM_NCHITTEST时,WebApp上的当前物理光标将更改为被探测应用程序设置的任何光标位图。CURSORINFO包含被探测应用程序设置的光标位图,但坐标始终指示“物理”位置

使用提供的信息实施了满足此问题具体要求的解决方案,因此所有功劳都归他所有

当前设置如图所示:

它运行在一台有两个显示器的机器上。图中未显示的是一个实际负责事件监视和数据清理的小型应用程序-它运行在最小化和无人值守的情况下

解决方案
  • 获取要测试的应用程序的窗口句柄(在本例中,我循环了进程返回的所有进程。GetProcesses():

  • 使用目标应用程序的窗口句柄,我们现在可以创建特定的消息并通过发送给它

  • 为了将坐标传递给SendMessage,我们需要将X和Y坐标序列化为单个长值:

    public int MakeLong(short lowPart, short highPart)
    {
        return (int)(((ushort)lowPart) | (uint)(highPart << 16)); 
    }
    
  • 我们需要来获取位图:

    Win32Stuff.CURSORINFO ci = new Win32Stuff.CURSORINFO();
    Win32Stuff.GetCursorInfo(ci);
    
  • 检查GetCursorInfo中的返回标志是否指示光标正在显示(pco.flags==cursor\u showing):

  • 使用获取光标位图的有效句柄:

    IntPtr hicon = default(IntPtr);
    hicon = Win32Stuff.CopyIcon(ci.hCursor);
    
  • 使用从处理程序中提取信息:

    Win32Stuff.ICONINFO icInfo = default(Win32Stuff.ICONINFO);
    Win32Stuff.GetIconInfo(hicon, icInfo);
    
  • 使用System.Drawing.Icon类,使用Icon.FromHandle获得可管理的副本,并传递CopyIcon返回的值

    Icon ic = Icon.FromHandle(hicon);
    
  • 通过Icon.ToBitmap方法提取位图

    Bitmap bmp = ic.ToBitmap();
    
局限性
  • 此解决方案在两种不同的操作系统上进行了测试:Windows XP和Windows 8。它只在Windows XP上工作。在Windows 8上,光标将闪烁并立即返回到“正确”格式,捕获的光标信息反映了这一点
  • 测试点区域必须可见(即,应用程序不得最小化,测试点不得位于重叠窗口下。但测试窗口可能部分重叠,并且不需要聚焦。)
  • 发出WM_NCHITTEST时,WebApp上的当前物理光标将更改为被探测应用程序设置的任何光标位图。CURSORINFO包含被探测应用程序设置的光标位图,但坐标始终指示“物理”位置
您可以使用此选项:感谢您(非常)快速的回复,@Zz。尽管如此,我担心问题仍然存在-GetCursorInfo函数仅报告当前光标位置及其相关信息,包括位图。我的具体要求包括在给定坐标处获取光标信息。如果