草庐IT

c++ - OSX 窗口捕获

coder 2024-02-12 原文

我一直在研究 OSX 中的窗口系统。我正在尝试了解有关它的所有信息,以获取我正在处理的一些捕获代码。

我想做什么

我希望能够过滤我的窗口查询,以便我抓取在任何空间中可见或在任何空间中最小化的窗口。

到目前为止的工作

现在,使用 SonOfGrab 测试代码和文档,我创建了一个可以查询窗口服务器并给我如下列表的程序:

{
"name": "Xcode",
"id": 25314,
"width": 16,
"height": 194,
"visible": "NO",
"desktop": -1,
"owner pid": 37319,
"layer": 0
}

我过滤掉所有桌面元素,只抓取可共享的窗口。

我学到了什么

据我从文档中可以看出,这是有限的,我的示例程序就是这些东西

  1. 窗口的可见性属性会告诉你它是否可见 在当前事件空间中。
  2. 图层似乎很重要。据我所知,我要过滤的窗口仅在第 0 层可用。看起来其他层与停靠栏、工具栏、图标等相关。
  3. 不可见但位于第 0 层的项目有时是最小化窗口。

我遇到的问题

以下是我在代码和 SonOfGrab 示例中遇到的问题。

  1. 某些应用程序中最小化的窗口和关闭的窗口看起来是一样的。例如使用事件监视器。如果我最小化窗口或关闭它,输出是相同的。还有其他领域可以帮助我区分这一点吗?发生这种情况似乎是因为应用程序始终在任务栏中运行。

最小化事件监视器

{
    "name": "Activity Monitor",
    "id": 94,
    "width": 703,
    "height": 728,
    "visible": "NO",
    "desktop": -1,
    "owner pid": 2353,
    "layer": 0
},

关闭事件监视器

{
    "name": "Activity Monitor",
    "id": 94,
    "width": 703,
    "height": 728,
    "visible": "NO",
    "desktop": -1,
    "owner pid": 2353,
    "layer": 0
},
  1. 即使我过滤掉桌面元素并只从第 0 层抓取。我仍然看到 SystemUIServer 漂浮在周围。当我尝试使用 SonOfGrab 抓取它的窗口时,我什么也没得到。除了按名称过滤外,还有其他有意义的方法吗?
  2. 无法查看的窗口。使用 XCODE,我注意到如果我打开了一个项目并且可以查看。我的程序和 SonOfGrab 将在第 0 层显示 5 个窗口。其中 1 个可见,其余不可见。

总结

我希望能够只列出在任何空间都可见的窗口,或者最小化后可能被查看的窗口。似乎可见性和图层有点帮助,但也许我需要更多窗口细节来解决这个问题。有什么想法:-)?

最佳答案

我认为你无法实现你想要的。

您可能对不在第 0 层中的窗口感兴趣。该层对应于文档中其他地方所谓的“窗口级别”。参见 -[NSWindow setLevel:]CGWindowLevelForKey()。例如,在我的测试中, float 面板位于第 3 层。

由于你使用的是CGWindowList API,你可以使用kCGWindowListExcludeDesktopElements来排除菜单栏、Dock等。你似乎意识到了这一点,所以我我不确定您为什么要查看图层属性。

其次,我怀疑您能否区分最小化窗口和“隐藏”窗口。列表中窗口的存在仅意味着它具有关联的“窗口设备”。 (参见-[NSWindow initWithContentRect:...]方法的deferCreation参数和-[NSWindow windowNumber]方法的说明。 ) 但是,如果窗口位于另一个空间、最小化或已被其应用程序从窗口列表中移出(即隐藏),则该窗口将不可见。事实上,如果窗口是一次性窗口(参见 -setOneShot:),窗口设备可能会在最小化或隐藏时被释放。

换句话说,即使在窗口服务器的内部,最小化窗口和隐藏窗口之间的区别也很小。

最后,您无法捕获不在当前空间或最小化的窗口的内容。您可以通过 Son of Grab 示例代码看到这一点。

关于c++ - OSX 窗口捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20732899/

有关c++ - OSX 窗口捕获的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. ruby - rbenv 安装 ruby​​ 校验和不匹配 osx - 2

    我已经在mountainlion上成功安装了rbenv和ruby​​build。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub

  5. ruby - 如何让Ruby捕获线程中的语法错误 - 2

    我正在尝试使用ruby​​编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?

  6. ruby-on-rails - 无法在 Rails 助手中捕获 block 的输出 - 2

    我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  9. ruby - 在 ruby​​ 中生成一个进程,捕获 stdout,stderr,获取退出状态 - 2

    我想从ruby​​rake脚本运行一个可执行文件,比如foo.exe我希望将foo.exe的STDOUT和STDERR输出直接写入我正在运行rake任务的控制台.当进程完成时,我想将退出代码捕获到一个变量中。我如何实现这一目标?我一直在玩backticks、process.spawn、system但我无法获得我想要的所有行为,只有部分更新:我在Windows上,在标准命令提示符下,而不是cygwin 最佳答案 system获取您想要的STDOUT行为。它还返回true作为零退出代码,这可能很有用。$?填充了有关最后一次system调

  10. ruby - 捕获 Ruby Logger 输出以进行测试 - 2

    我有一个像这样的ruby​​类:require'logger'classTdefdo_somethinglog=Logger.new(STDERR)log.info("Hereisaninfomessage")endend测试脚本行如下:#!/usr/bin/envrubygem"minitest"require'minitest/autorun'require_relative't'classTestMailProcessorClasses当我运行这个测试时,out和err都是空字符串。我看到消息打印在stderr上(在终端上)。有没有办法让Logger和capture_io一起玩得

随机推荐