cocoa – 如何通过ScriptingBridge使用AppleScript获取终端窗口的窗口ID和标签号?

cocoa – 如何通过ScriptingBridge使用AppleScript获取终端窗口的窗口ID和标签号?,第1张

概述我可以使用以下AppleScript打开终端选项卡: tell application "Terminal" set myTab to do script "exec sleep 1" get myTabend tell 这将返回一个字符串,如:应用程序“终端”的窗口ID 3263的选项卡1.这很好,我可以看到窗口ID 3263和标签号1(虽然我不知道如何查询myTab只获取这些 我可以使用以下AppleScript打开终端选项卡:

tell application "Terminal"    set myTab to do script "exec sleep 1"    get myTabend tell

这将返回一个字符串,如:应用程序“终端”的窗口ID 3263的选项卡1.这很好,我可以看到窗口ID 3263和标签号1(虽然我不知道如何查询myTab只获取这些值).

在Cocoa ScriptingBrIDge中,我可以这样做:

SBApplication  *terminal;SBObject       *tab;terminal = [SBApplication applicationWithBundleIDentifIEr:@"com.apple.terminal"]tab = [terminal doScript:@"exec sleep 1" in:nil]

如何从选项卡对象中获取窗口ID和选项卡编号?

编辑2009/4/27 – 为什么?

为了回答我为什么要这样做 – 我在终端窗口中打开一个命令(如上所述),然后我回到了tab对象.但是我想移动/调整此窗口的大小,因此我需要访问选项卡的“窗口”对象.

我正在使用Objective-C(实际上,从Perl桥接的Objective-C),并且希望坚持使用标准的OS组件,因此我相信我只能使用NSAppleScript和ScriptingBrIDge框架(所有perl applescript模块都打破了64位除碳).我会尝试NSAppleScript,但处理返回的值似乎是一个黑暗的艺术.

我目前的解决方案是获取选项卡对象的TTY(保证唯一)并枚举每个窗口的每个选项卡,直到找到包含选项卡的窗口.我认为这不是最好的方法(肯定不是很快!).

编辑2009/4/30 – 解决方案

根据下面“has”的建议,我冒了NSAppleEventDescriptor API.最初,我只能通过NSAppleScript的executeAndReturnError()调用来实现这一点.但是我发现NSAppleScript比ScriptingBrIDge慢得多.

在使用ClassDump提取更多SBObject调用之后,我发现了未记录的specifIErDescription()和qualifIEdSpecifIEr()调用.前者给了我很好的“窗口ID Y的标签X”字符串.后者返回apple事件描述符,然后我可以解码.

我的最终代码(在perl中)是:

use Foundation;NSBundle->bundleWithPath_('/System/library/Frameworks/ScriptingBrIDge.framework')->load;# Create an OSType (bID endian long) from a stringsub OSType ($) { return unpack('N',$_[0]) }my $terminal = SBApplication->applicationWithBundleIDentifIEr_("com.apple.terminal");my $tab         = $terminal->doScript_in_("exec sleep 1",undef);my $tab_ev_desc = $tab->qualifIEdSpecifIEr;my $tab_ID      = $tab_ev_desc->descriptorForKeyword_(OSType 'seld')->int32Value;my $win_ev_desc = $tab_ev_desc->descriptorForKeyword_(OSType 'from');my $window_ID   = $win_ev_desc->descriptorForKeyword_(OSType 'seld')->int32Value;print "Window:$window_ID Tab:$tab_ID\n";
解决方法 技术上你不能;一个更好的问题是为什么要这样做?

(好吧,你可以使用Apple Event Manager API或objc-appscript,这两者都可以为你提供一个原始的AEDesc / NSAppleEventDescriptor,你可以递归pull apart yourself.或者你可以在SB中找到它,看看是否有一个未记录的API得到底层的AEDesc,但当然需要注意.或者,可能有更好的方法来实现你的实际目标而不诉诸Hackery,但你需要提供更多的信息.)

总结

以上是内存溢出为你收集整理的cocoa – 如何通过ScriptingBridge使用AppleScript获取终端窗口的窗口ID和标签号?全部内容,希望文章能够帮你解决cocoa – 如何通过ScriptingBridge使用AppleScript获取终端窗口的窗口ID和标签号?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1011871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存