今天我为大家带来一个有趣的例子,有点像Spy++的功能,通过鼠标在屏幕上移动,并实时捕捉指定 坐标点处的窗口信息。
窗口信息包括窗口标题,窗口句柄,窗口类名,以及呈现所捕捉窗口的 缩略图。
现在我们不妨来思考一下,要实现这些功能,我们需要准备哪些技术要点?
1 、获取当前鼠标指针的屏幕坐标,这个用System.Windows.Forms命名空间下的Cursor类的Position属性 就可以知道当前鼠标指针的位置,屏幕坐标。
2、如何从指定坐标处得到窗口,其实就是获得对 应窗口的句柄,这里要使用一个API函数WindowFromPoint,它可以返回指定坐标处的窗口的句柄。这个 窗口不一定指的就是完整的窗口,在Win32窗口中,一个控件也是一个窗口,桌面也是一个窗口。
3、获取窗口的标题文本,使用API函数GetWindowText,根据窗口的句柄得到窗口的标题文本。
4、获取窗口类名,使用API函数GetClassName,得到对应窗口所属的窗口类,这里所指的窗口 类就是我们在开发Win32程序时,类似于在WinMain函数中用RegisterClass函数注册的类名。
5 、把窗口内容绘制成缩略图,这个简单,在System.Drawing命名空间下的Graphics类就有一个 CopyFromScreen方法,可以从屏幕上复制图像,效果是等效于用BitBlt函数从桌面的DC复制到其他位置 一样。
6、我们并不是复制整个屏幕,而只是对应位置处的窗口,要获得窗口的矩形区域,可以 调用API函数GetWindowRect。
好了,现在技术要点解决了,接下来就是真刀真枪干了。
首先是导入Win32的API。
[DllImport("User32.dll",CallingConvention = CallingConvention.StdCall)] public extern static IntPtr WindowFromPoint(int x, int y); [DllImport("User32.dll", CallingConvention = CallingConvention.StdCall)] public extern static int GetClassName( [In] IntPtr hwnd, [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder lpString, [In] int nMaxCount); [DllImport("User32.dll", CallingConvention = CallingConvention.StdCall)] public extern static int GetWindowText( [In] IntPtr hwnd, [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder lpString, [In] int nMaxCount); [DllImport("User32.dll")] public extern static bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 函数
, 句柄
, 窗口
, 类名
, public
, 如何获得窗口句柄
#获取窗口标题
捕捉滚动窗口、obs捕捉不到窗口、按键精灵捕捉窗口、捕捉活动窗口、捕捉不到程序窗口,以便于您获取更多的相关知识。