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