كيف يمكنني الحصول على معرف النافذة ورقم علامة التبويب من نافذة طرفية باستخدام Applescript عبر ScriptingBridge؟

StackOverflow https://stackoverflow.com/questions/2712655

سؤال

يمكنني فتح علامة تبويب طرفية باستخدام Applescript التالي:

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

هذا يعيد سلسلة مثل: tab 1 of window id 3263 of application "Terminal". هذا رائع ، أستطيع أن أرى معرف النافذة 3263 ورقم علامة التبويب 1 (على الرغم من أنني لا أعرف كيفية الاستعلام ميتاب للحصول على هذه القيم فقط).

في Scriptingbridge الكاكاو ، يمكنني القيام:

SBApplication  *terminal;
SBObject       *tab;

terminal = [SBApplication applicationWithBundleIdentifier:@"com.apple.terminal"]
tab = [terminal doScript:@"exec sleep 1" in:nil]

كيف يمكنني الحصول على معرف النافذة ورقم علامة التبويب من كائن علامة التبويب؟


تحرير 2009/4/27 - لماذا؟

رداً على سبب رغبتي في القيام بذلك - أفتح أمرًا في نافذة طرفية (على النحو الوارد أعلاه) ، وأعود إلى التبويب هدف. ومع ذلك ، أريد نقل/تغيير حجم هذه النافذة ، لذلك أحتاج إلى الوصول إلى كائن "نافذة" علامة التبويب.

أنا أستخدم Objective-C (جيدًا في الواقع ، الهدف-C الذي تم سسره من Perl) ، وأرغب في التمسك بمكونات OS القياسية ، لذلك أعتقد أنه لا يوجد لدي سوى أطر Nsapplescript و Scriptingbridge للعب مع (جميع وحدات Applescript التي تم كسرها بـ 64bit إزالة الكربون). سأحاول nsapplescript ، ولكن يبدو أن معالجة القيم التي تم إرجاعها هي فن أسود.

الحل الحالي هو الحصول على tty من كائن علامة التبويب (مضمون فريدة) وتعداد كل علامة تبويب لكل نافذة حتى أجد النافذة التي تحتوي على علامة التبويب. افترضت أن هذا لا يمكن أن يكون أفضل طريقة (من المؤكد أنه ليس سريعًا!).


تحرير 2009/4/30 - الحل

بناء على اقتراحات ""لديها"أدناه ، لقد تحدت nsappleeventdescriptor API. في البداية ، تمكنت فقط من الوصول إلى هذا مع NSAPPLESCRIPT executeAndReturnError() مكالمة. ومع ذلك ، وجدت أن Nsapplescript كان أبطأ بكثير من Scriptingbridge.

بعد استخدام classdump لاستخراج بعض مكالمات SboBject ، وجدت غير موثقة specifierDescription() و qualifiedSpecifier() المكالمات. السابق يعطيني لطيف "علامة التبويب x من معرف النافذة y"السلسلة. إرجاع الأخير واصف حدث Apple ، والذي يمكنني بعد ذلك فك التشفير.

الكود النهائي الخاص بي (في بيرل) هو:

use Foundation;

NSBundle->bundleWithPath_('/System/Library/Frameworks/ScriptingBridge.framework')->load;

# Create an OSType (bid endian long) from a string
sub 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";
هل كانت مفيدة؟

المحلول

من الناحية الفنية لا يمكنك ؛ سؤال أفضل هو لماذا تريد؟

(حسنًا ، حسنًا ، يمكنك أن تستخدم API Appe Manager API أو OBJC-appscript, ، كلاهما يمكن أن يمنحك Aedesc/nsappleeventDescriptor الخام الذي يمكنك بشكل متكرر انفصل عن نفسك. أو قد تتجول في SB لمعرفة ما إذا كان هناك واجهة برمجة تطبيقات غير موثقة للوصول إلى Aedesc الأساسي ، ولكن بالطبع Emptor التحذير ، بالطبع. بدلاً من ذلك ، قد تكون هناك طريقة أفضل لتحقيق هدفك الفعلي دون اللجوء إلى الاختراق ، لكنك ستحتاج إلى تقديم مزيد من المعلومات.)

نصائح أخرى

أعلم أن هذا سؤال قديم ، لكنني واجهت هذه المشكلة اليوم ، ولم أجد إجابات جيدة عبر الإنترنت. هذا عمل بالنسبة لي:

tell application "Terminal"
    set newTab to do script "echo hello"
    set theWindow to first window of (every window whose tabs contains newTab)
    set windowId to theWindow's id
    repeat with i from 1 to the count of theWindow's tabs
        if item i of theWindow's tabs is newTab then set tabNumber to i
    end repeat
    get {windowId, tabNumber}
end tell

ماذا عن شيء بسيط للغاية مثل هذا:

أخبر التطبيق "Terminal" تعيين new_win للقيام بالبرنامج النصي "" تعيين w_id إلى معرف نهاية النافذة الأمامية أخبر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top