2009-10-22 14 views

答えて

12

いくつかの潜在的に有用な参考文献:

CGSGetWindowPropertyあります、私は(完全にテストされていない)、次のようにあなたがNSWindowList()の項目にそれを使用することができると信じて:AppleScriptでは

OSErr err; 
CGSValue titleValue; 
char *title; 
CGSConnection connection = _CGSDefaultConnection(); 
int windowCount, *windows, i; 

NSCountWindows(&windowCount); 
windows = malloc(windowCount * sizeof(*windows)); 
if (windows) { 
    NSWindowList(windowCount, windows); 
    for (i=0; i < windowCount; ++i) { 
     err = CGSGetWindowProperty(connection, windows[i], 
        CGSCreateCStringNoCopy("kCGSWindowTitle"), 
        &titleValue); 
     title = CGSCStringValue(titleValue); 
    } 
    free(windows); 
} 

、それは本当に簡単です:

tell application "System Events" to get the title of every window of every process 

あなたは内からAppleScriptを呼び出すことができますアプリケーションをNSAppleScriptを使用するか、appscriptをObjC-AppleScriptブリッジとして使用してください。 Leopardに、あなたはScripting Bridge(詳細未テストコード)を使用することができます:あなたが読みやすさを気にしない場合

SystemEventsApplication *systemEvents = [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"]; 
SBElementArray *processes = [systemEvents processes]; 
for (SystemEventsProcess* process in processes) { 
    NSArray *titles = [[process windows] arrayByApplyingSelector:@selector(title)]; 
} 

あなたも、一回の長い呼び出しでそれを試みることができます。

SystemEventsApplication *systemEvents = [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"]; 
NSArray *titles = [[[systemEvents processes] 
        arrayByApplyingSelector:@selector(windows)] 
       arrayByApplyingSelector:@selector(arrayByApplyingSelector:) 
       withObject:@selector(title)]; 

コンパイラが@selector(title)が間違った型であると文句を言うだろうが、それが動作するはずです。手を委任してください。あなたは[[[systemEvents processes] windows] title]に電話をかけることができます。

+2

アップルスクリプトが公開されているとCの等価物(http://developer.apple.com/mac/library/documentation/Accessibility/Reference/AccessibilityLowlevel/を参照)を有するアクセシビリティインターフェースを使用していることに留意されたいです。 CGS * APIは文書化されていないだけでなく、いつでも変更することができます。 (アクセシビリティAPIの使用例はありますか? –

+1

アクセシビリティAPIの使用例はありますか?私はそれを含めることを望んでいましたが、それを使用する方法を提供するのに十分に精通していません。 – outis

+0

また、アクセシビリティを有効にする必要があります。 – outis

8

浮動小数点のCGSPrivate.hヘッダーは、CGSGetWindowProperty()はもはや存在しないという点で、OS X 10.8とは直接互換性がありません(もはやリンクできません)。だから、CGSPrivate.hファイルに次の2行を追加します - 私はGoogleの検索多くの時間後に自分自身を先に行って、これを考え出した - それは仕事を得るために:outisのコードを適応さ

extern CGSConnection CGSDefaultConnectionForThread(void); 
extern CGError CGSCopyWindowProperty(const CGSConnection cid, NSInteger wid, CFStringRef key, CFStringRef *output); 

、ここでの方法です各ウインドウタイトルを反復処理します。私はマウンテンライオンに打ち鳴らす4.2でこれをテストしています

CFStringRef titleValue; 
CGSConnection connection = CGSDefaultConnectionForThread(); 
NSInteger windowCount, *windows; 

NSCountWindows(&windowCount); 
windows = (NSInteger*) malloc(windowCount * sizeof(NSInteger)); 
if (windows) { 
    NSWindowList(windowCount, windows); 
    for (int i = 0; i < windowCount; ++i) 
    { 
     CGSCopyWindowProperty(connection, windows[i], CFSTR("kCGSWindowTitle"), &titleValue); 

     if(!titleValue) //Not every window has a title 
      continue; 

     //Do something with titleValue here 
    } 
    free(windows); 
} 

私が見つけたいくつかの他のものには以下が含まれます。

  1. んが、ウィンドウのタイトルが127のバイトを超えていません。
  2. ウィンドウのタイトルがそうkCFStringEncodingMacRoman

でエンコードされますが、C-文字列としてそれをしたい場合は、このような何か書く:個人的に

char *cTitle[127] = {0}; 
CFStringGetCString(titleValue,cTitle,127,kCFStringEncodingMacRoman); 

を、私は以来、このようにそれをやってお勧めしますアクセシビリティAPIは完全な痛みであり、余分な権限が必要です。

これが誰かを助けることを願っています!乾杯!

+0

この回答は高価ですが、移植性はどうですか? 'CGS_xx'は見つからないか、' 10.6'で廃止されました。私は10.8.2 MLのためにコードし、確かに非難されたものに頼ることができません。 –

+0

まあ、私が上で与えたコードはMountain Lionでテストされました。変更されているほど見つからないというわけではありません。私は上記のやった反転作業は 'CGS_xx'を使用して**あなたは**この特定の問題を解決することができます正しいシグネチャを提供します。私は窓のタイトル以外には何もしようとしなかった。 は、あなたが、あなたはおそらく(すなわち。10.6のために上下または10.7以降のために)あなたのパッケージの複数のバージョンをリリースする必要があり、これを使用する必要があると感じた場合 –

関連する問題