-1

Xcode 4.6.1 での作業では、すべてのウィンドウのリストを取得し、特定のウィンドウを (おそらく windowID で) 選択し、そのサイズ (幅と高さ) と原点 (X & Y) を指定したいと考えています。

画面サイズを取得できます。NSStringFromRect を使用すると、NSLog で結果を表示できます。NSRect は {NSPoint の原点です。NSSize size;} および私のディスプレイのコンテキストでは {{0, 0}, {2560, 1440}}.

以下を使用して、ディスプレイのサイズを取得します。(C 構造体とキャストに関する Guillaume のコメントに感謝します):

-(void)awakeFromNib
{
    NSRect screenRect = [[NSScreen mainScreen] frame];
    CGSize myScreenSize = screenRect.size;
    NSLog(@"myScreenSize = %d x %d", (int)myScreenSize.width, (int)myScreenSize.height);

    // returns: myScreenSize = 2560 x 1440
}
@end

起動した別のアプリケーション ウィンドウ (自分のプロセスに属していない) のサイズと原点を設定してみます。

まず、実行中のすべてのアプリケーションのリストと、各ウィンドウの windowID を取得してから、移動/サイズ変更するウィンドウを選択します。

他の検索に基づいて、これは CGSPrivate.h またはアクセシビリティ API を使用して実行できます。特定のwindowID/NumberまたはPIDのサイズなどを設定するために、これらのいずれかをまだ使用する方法がわかりません

#import "rsAppDelegate.h"

@implementation rsAppDelegate

-(void)awakeFromNib
{
    // get the size of the main screen
    NSRect screenRect = [[NSScreen mainScreen] frame];    
    // devrived fromGuillaume's suggestion
    CGSize myScreenSize = screenRect.size;
    CGPoint myScreenOrigin = screenRect.origin;
    NSLog(@"myScreenSize = %d x %d", (int)myScreenSize.width, (int)myScreenSize.height);
    NSLog(@"Origin = %d , %d", (int)myScreenOrigin.x, (int)myScreenOrigin.y);

    // To get a list of Application windows, the PID of the window, the window number, and the window bounds (origin, height, width)   
    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
    for (NSMutableDictionary* entry in (__bridge NSArray*)windowList)
    {
        NSArray *ownerName = [entry objectForKey:(id)kCGWindowOwnerName];
        NSInteger ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] integerValue];
        NSInteger windowNumber = [[entry objectForKey:(id)kCGWindowNumber] integerValue];
        NSArray *ownerBounds = [entry objectForKey:(id)kCGWindowBounds];
        NSLog(@"\nApp = %@ \nAppPID = %ld \nwindowNumber = %ld \nProgramBounds = %@", ownerName, (long)ownerPID, (long)windowNumber, ownerBounds);
    }
    CFRelease(windowList);
    /*
    OUTPUT:
    myScreenSize = 2560 x 1440 | Origin = 0 , 0
    App = Xcode
    AppPID = 3260
    windowNumber = 4493
    ProgramBounds = {
        Height = 1285;
        Width = 1852;
        X = 339;
        Y = 32;
    }
    */

    // Knowing the name of the application, it's PID, window number, and bounds to a percentage of the screen:
    // Set it's origin and size

}
@end

これで、画面サイズがわかり、各アプリケーションのすべてのウィンドウに関するすべての利用可能な情報が得られました。 PID 3260、ウィンドウ番号 4493 のアプリケーションの NEW Origin、Width、Height を指定するにはどうすればよいですか?

newPos = AXValueCreate(kAXValueCGPointType, windowOrigin);
AXUIElementSetAttributeValue(chosenWindow, kAXPositionAttribute, newPos)

newSize = AXValueCreate(kAXValueCGSizeType, windowSize);
AXUIElementSetAttributeValue(chosenWindow, kAXSizeAttribute, newSize);

selectedWindow を指定するにはどうすればよいですか? windowOrigin と windowSize はどのような形式で指定すればよいですか?

ここに私が見つけた情報がありますが、使用方法がわかりません:

kAXValueCGPointType は CGPoint のラッパーです。AXValue.h で宣言されている CoreGraphics.h を参照してください。

kAXValueCGSizeType は CGSize のラッパーです。

これらは、他の構造体の AXValueType ラッパーです。AXValueCreate および AXValueGetValue 関数を使用して、ラップされた構造とネイティブ構造の間で変換する必要があります。

4

1 に答える 1

1

まず、ウィンドウがどこにあるかを調べる必要があります。

NSWindowクラスリファレンスから...

画面

ウィンドウが表示されている画面を返します。

- (NSScreen *)screen

戻り値

ほとんどのウィンドウが表示されている画面。ウィンドウがオフスクリーンの場合は nil。

討論

ウィンドウの一部が 1 つの画面に表示され、一部が別の画面に表示される場合は、ウィンドウの大部分が存在する画面が返されます。

最も深い画面

ウィンドウが表示されている最も深い画面を返します (複数の画面に分割されている場合があります)。

- (NSScreen *)deepestScreen

戻り値

ウィンドウが表示されている最も深い画面。ウィンドウがオフスクリーンの場合は nil。

次に、ウィンドウが 1 つの画面上にある場合にのみ、そのサイズを何かのパーセンテージとして決定できます。

ただし、一般に、ウィンドウをメイン画面またはユーザーが選択した画面に制限しないと、この方法では問題が発生します。

それ以外の場合は、さまざまな画面構成を処理する方法を検討する必要があります。

次の NSApplication デリゲート メソッドも必要です。

applicationDidChangeScreenParameters:

> コンピューターに接続されているディスプレイの構成が変更された場合 (プログラムによって、またはユーザーが > [ディスプレイ] コントロール パネルで設定を変更した場合) に、既定の通知センターから送信されます。

- (void)applicationDidChangeScreenParameters:(NSNotification *)aNotification パラメーター

aNotification NSApplicationDidChangeScreenParametersNotification という名前の通知。この通知のオブジェクト メソッドを呼び出すと、NSApplication オブジェクト自体が返されます。

NSScreenインスタンスには、と同じようframeに を返すメソッドがあります。そこから、ウィンドウのフレームの設定に使用する NSRect を作成するときに使用する size.width と size.height を設定する適切な高さと幅を決定できます。NSRectNSWindow

スクリーン フレームを取得してその高さにアクセスする例:

NSRect mainScreenFrameRect = [[NSScreen mainScreen] frame];
CGFloat screenHeight = mainScreenFrameRect.size.height;

高さまたは幅のパーセンテージを取得することは、そこから簡単に計算できます。

setFrame:display:animate:applicationDidFinishLaunching またはその他の適切な場所でNSWindow メソッドを使用することをお勧めします。(必要な NSWindow サブクラスがあるかどうかを検討してください。)

于 2013-04-22T13:29:35.743 に答える