如何捕捉桌面上的窗口信息

今天我为大家带来一个有趣的例子,有点像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捕捉不到窗口、按键精灵捕捉窗口、捕捉活动窗口、捕捉不到程序窗口,以便于您获取更多的相关知识。

时间: 2024-07-31 09:19:28

如何捕捉桌面上的窗口信息的相关文章

用c++ 做到在桌面上悬浮某个图标时获取这个图标的位置信息

问题描述 用c++ 做到在桌面上悬浮某个图标时获取这个图标的位置信息 就像 windows这样,悬浮后会有一个tips出来里面是位置信息 解决方案 使用shell扩展可以实现 参考:http://www.codeproject.com/Articles/448/The-Complete-Idiots-Guide-to-Writing-Shell-Exten 解决方案二: 至于根据快捷方式文件(.lnk)得到指向的文件和路径,参考:http://www.codeguru.com/cpp/com-t

win7系统如何在桌面上创建Internet Explorer图标

在桌面空白处鼠标右键单击"新建"--"文本文档" 2 打开新建文本文档,将下面的代码复制进去并保存文件 ;在Windows7下桌面创建仿真度99.99%的IE图标 - 小瑞 [Version] signature="$Windows NT$" DriverVer=10/01/2002,5.2.3790.1830 [DefaultInstall] AddReg = DeskIEIcon.AddReg [DeskIEIcon.AddReg] HKCR

在Windows Server 2012中如何快速开关桌面上经典的计算机、我的文档等通用图标

  在Windows Server 2012中如何快速开关桌面上经典的计算机.我的文档等通用图标           我们都知道,在Windows Server 2012系列的服务器版本中都已经引入了Modern的现代界面作为默认的用户交互界面,同时满足视觉一致化,新版的服务器管理程序也做成了扁平化.因此传统的计算机(我的电脑).我的文档这些经典图标默认是不会存在于传统的经典桌面上的. 为什么会有这样的开题,微软建议大家使用新得Modern模式,你还找原先的那些东西做什么? 那么场景来了,如果是

怎么恢复桌面上的小键盘?

  你说的"桌面上的小键盘"应该叫"语言栏",如果该图标丢失可以按以下方法恢复: 方法1.在任务栏的空白处单击鼠标右键→在弹出的快捷菜单中指向"工具栏"→在出现的下一级菜单中单击"语言栏"即可. 方法2.单击"开始"→"控制面板"→"日期.时间.语言和区域设置"→"区域和语言选项"→弹出"区域和语言选项"窗口→选择"语

如何在Linux桌面上使用Gifine录制GIF动画?

不用我说,你也知道 GIF 动画在过去几年发展迅速.人们经常在线上文字交流时使用动画增添趣味,同时这些动画在很多其他地方也显得非常有用. 在技术领域使用动画能够很快的描述出现的问题或者返回的错误.它也能很好的展现出一个软件应用产品的特性.你可以在进行线上座谈会或者在进行公司展示时使用 GIF 动画,当然,你可以在更多的地方用到它. 现在,假设你的电脑桌面上打开了多个应用程序,或者无论出于什么目的,你想制作一个 GIF 动画来记录桌面上一个应用程序窗口的操作过程.你应该怎么做呢?显然,你需要一个工

如何在 Linux 桌面上使用 Gifine 录制 GIF 动画?

不用我说,你也知道 GIF 动画在过去几年发展迅速.人们经常在线上文字交流时使用动画增添趣味,同时这些动画在很多其他地方也显得非常有用. 在技术领域使用动画能够很快的描述出现的问题或者返回的错误.它也能很好的展现出一个软件应用产品的特性.你可以在进行线上座谈会或者在进行公司展示时使用 GIF 动画,当然,你可以在更多的地方用到它. 现在,假设你的电脑桌面上打开了多个应用程序,或者无论出于什么目的,你想制作一个 GIF 动画来记录桌面上一个应用程序窗口的操作过程.你应该怎么做呢?显然,你需要一个工

注册表快速删除WINDOWS桌面上的顽固图标(WIN7 WIN8 WIN10)

IE浏览器是Windows系统自带的浏览器,很多用户新装系统后,往往都会自己重新下载自己喜欢的浏览器,然后把桌面上的IE图标也删除掉.但是对桌面IE图标进行右击删除时,却发现怎么也删不掉.怎么办呢?下面脚本之家小编给大家介绍Win7/Win8/Win10桌面上的IE浏览器顽固图标删不掉的解决方法.  顽固IE图标其实是这样的  用直接右键删除是不起作用的,可以看到,直接点击右键的话是没有删除选项的,按照度娘的方法:360急救箱.金山急救箱.windows清理助手.注册表删除项等方法均告失败.  

Flash动画 让其巧妙的设置成桌面上的布景

flash动画 动画有很多种格式,Flash是比较优秀的一种.其文件小巧,并且可以任意放大,播放也很简单,下载一个插件后,用浏览器就可以播放.那我们能否让Flash文件做为桌面的布景呢?一般情况下,桌面上只能将图片文件做为背景,但同时它也支持Web格式的文件,也就是超文本文件.Flash是在网络上很流行的动画格式,在网络上展示它也就是通过超文本文件,那么我们只要在本地制作含有Flash动画的超文本文件,不就可以实现在桌面上显示Flash动画. 想法有了,现在要做的事情就是该如何实现. 一.获取F

教你在桌面上涂鸦

我曾经说过一句致理名言:涂鸦是人生一大乐趣. 只要你懂得涂鸦之道,涂鸦是非常好玩的 .在窗口上画多了,不爽了,想不想在桌面上画? 不要惊讶,这是可以的. Graphics类可以用 一个静态方法FromHwnd来创建实例,如果想在桌面上涂鸦,只要得到桌面的句柄就可以了.那么如何得 到桌面的句柄呢?要用到一个非托管API,即 [DllImport("User32.dll")] public extern static IntPtr GetDesktopWindow(); 使用它可以得到桌面