这个问题与StackOverflow上的另一个问题有点相似,C# - Capturing the Mouse cursor image - 但需求略有不同。
答案 0 :(得分:1)
使用Hans Passant提供的信息实现了解决此问题细节的解决方案,因此所有信用都必须归他所有。
当前设置如下所示:
它在具有两个显示器的机器上运行。图中未显示的是一个实际负责事件监控和数据抓取的小应用程序 - 它运行最小化且无人值守。
获取要测试的应用程序的Window句柄(在这种情况下,我循环遍历 Process.GetProcesses ()返回的所有进程:
IntPtr _probeHwnd;
var _procs = Process.GetProcesses();
foreach (var item in _procs)
{
if (item.MainWindowTitle == "WinApp#1")
{
_probeHwnd= item.MainWindowHandle;
break;
}
}
使用目标应用程序的窗口句柄,我们现在可以制作特定消息并通过 SendMessage 发送给它。
为了将坐标传递给SendMessage,我们需要将X和Y坐标序列化为一个长值:
public int MakeLong(short lowPart, short highPart)
{
return (int)(((ushort)lowPart) | (uint)(highPart << 16));
}
知道我们想要探测的具体坐标(_probeX,_probeY),现在我们可以发出WM_NCHITTEST消息:
SendMessage(_probeHwnd, WM_NCHITTEST, NULL, (LPARAM)MakeLong(_probeX, _probeY));
我们需要 GetCursorInfo 来获取位图:
Win32Stuff.CURSORINFO ci = new Win32Stuff.CURSORINFO();
Win32Stuff.GetCursorInfo(ci);
检查GetCursorInfo的返回标志是否表示光标正在显示(pco.flags == CURSOR_SHOWING):
使用 CopyIcon 以获取光标位图的有效句柄:
IntPtr hicon = default(IntPtr);
hicon = Win32Stuff.CopyIcon(ci.hCursor);
使用 GetIconInfo 从处理程序中提取信息:
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();