3

外部スクリーンが取り外されたことを検出し、すべてのウィンドウの場所を保存し、外部スクリーンが再び接続されると、すべてのウィンドウを元の位置に復元する単純な Mac アプリに取り組んでいます。(すでにアプリがあることは知っていますが、これがどのように行われるのか興味があります)

何度も検索した後、最終的にすべてのウィンドウを画面に表示することができました

NSArray *openWindows = [[NSWorkspace sharedWorkspace] runningApplications];
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);

これは次のようなものを返します

{
    kCGWindowAlpha = 1;
    kCGWindowBounds =         {
        Height = 22;
        Width = 279;
        X = 1559;
        Y = 0;
    };
    kCGWindowIsOnscreen = 1;
    kCGWindowLayer = 25;
    kCGWindowMemoryUsage = 13596;
    kCGWindowName = "";
    kCGWindowNumber = 18;
    kCGWindowOwnerName = SystemUIServer;
    kCGWindowOwnerPID = 260;
    kCGWindowSharingState = 1;
    kCGWindowStoreType = 2;
},
    {
    kCGWindowAlpha = 0;
    kCGWindowBounds =         {
        Height = 22;
        Width = 1920;
        X = 0;
        Y = 0;
    };
    kCGWindowIsOnscreen = 1;
    kCGWindowLayer = 25;
    kCGWindowMemoryUsage = 5404;
    kCGWindowNumber = 19;
    kCGWindowOwnerName = SystemUIServer;
    kCGWindowOwnerPID = 260;
    kCGWindowSharingState = 1;
    kCGWindowStoreType = 2;
},

次に、配列をループして、個々のウィンドウを確認します

 for (int i = 0; i < CFArrayGetCount(windowList); i++) {
    CFDictionaryRef ref = CFArrayGetValueAtIndex(windowList, i);

    NSLog(@"%@", CFDictionaryGetValue(ref, kCGWindowBounds));
}

しかし、これが私が行き詰まった場所です。複数の画面で作業しているときに、ウィンドウがどの画面にあるかを最初に知るにはどうすればよいですか。次に、後でウィンドウの境界を調整するにはどうすればよいですか? 各アプリケーションには独自の ID がありますか? または、私が使用できる別の方法はありますか?

4

1 に答える 1