MacOSでJava(JNAを使用)のすべてのウィンドウハンドルのリストを取得する方法

Mobeen:

私はJNAライブラリーを使用して、Windowsですべての可視ウィンドウハンドルを取得しています。JNAを使用してmacOSで同様のことを行う必要があります。

Windowsのすべてのウィンドウハンドルを取得するコードは次のとおりです。

 public static List<HWND> findAll() {
    final List<HWND> windows = new LinkedList<>();
    User32.INSTANCE.EnumWindows(new User32.WNDENUMPROC() {
        @Override
        public boolean callback(HWND hWnd, Pointer arg) {
            if (User32.INSTANCE.IsWindowVisible(hWnd)) {
                windows.add(hWnd);
            }
            return true;
        } 
    }, null);
    return windows;
}

macOSの同等のコードは何ですか?

ダニエルウィディス:

Core Graphics Frameworkの一部をマップする必要がありますCGWindowListCopyWindowInfo()関数を使用してウィンドウをリストできます。

フレームワークをロードするには、CoreGraphicsJNAのLibraryクラスを拡張するインターフェースをマップし、必要な関数をマップする必要があります。

public interface CoreGraphics extends Library {
    CoreGraphics INSTANCE = Native.load("CoreGraphics", CoreGraphics.class);

    CFArrayRef CGWindowListCopyWindowInfo(int option, int relativeToWindow);
}

CFArrayRefタイプはすでにJNAにマッピングされているCoreFoundationクラス。適切なウィンドウリストオプションを選択します(おそらくkCGWindowListOptionAll= 0)。すでにウィンドウ番号がある場合は、相対参照を使用できます。それ以外の場合はkCGNullWindowID、2番目のパラメーターに(0)を使用します。コードから呼び出すのは簡単です:

CFArrayRef windowInfo = CoreGraphics.INSTANCE.CGWindowListCopyWindowInfo(0, 0);

これによりCFDictionaryRef、ウィンドウを表すオブジェクトの配列が得られます配列を反復処理してCFDictionaryRefからクラスのその他のメソッドを使用して、これらのディクショナリオブジェクトを探索CFStringできます。キーのを作成します。必要なキーのリストはここに記載されており、オプションのキーはここにあります定数文字列は変数名と一致します

これによりCFNumberRef、ウィンドウ番号ごとに(同等の「ハンドル」)が得られます

// Set up keys for dictionary lookup
CFStringRef kCGWindowNumber = CFStringRef.createCFString("kCGWindowNumber");
CFStringRef kCGWindowOwnerPID = CFStringRef.createCFString("kCGWindowOwnerPID");
// Note: the Quartz name is rarely used
CFStringRef kCGWindowName = CFStringRef.createCFString("kCGWindowName");
CFStringRef kCGWindowOwnerName = CFStringRef.createCFString("kCGWindowOwnerName");

// Iterate the array
int numWindows = windowInfo.getCount();
for (int i = 0; i < numWindows; i++) {
    // For each array element, get the dictionary
    Pointer result = windowInfo.getValueAtIndex(i);
    CFDictionaryRef windowRef = new CFDictionaryRef(result);

    // Now get information from the dictionary.

    // Get a pointer to the result, in this case a CFNumber
    result = windowRef.getValue(kCGWindowNumber);
    // "Cast" the pointer to the appropriate type
    CFNumberRef windowNumber = new CFNumberRef(result);
    // CoreFoundation.INSTANCE.CFNumberGetType(windowNumber)
    // --> 4 = kCFNumberSInt64Type, signed 64 bit so use getLong()
    
    // Get a pointer to the result, in this case a CFNumber
    result = windowRef.getValue(kCGWindowOwnerPID);
    // "Cast" the pointer to the appropriate type
    CFNumberRef windowOwnerPID = new CFNumberRef(result);
    // CoreFoundation.INSTANCE.CFNumberGetType(windowOwnerPID)
    // --> 4 = kCFNumberSInt64Type, signed 64 bit so use getLong()

    // Get a pointer to the result, in this case a CFString
    result = windowRef.getValue(kCGWindowName);
    // "Cast" the pointer to the appropriate type
    // Optional key, check for null
    String windowName = result == null ? "" : new CFStringRef(result).stringValue();

    // Get a pointer to the result, in this case a CFString
    result = windowRef.getValue(kCGWindowOwnerName);
    // "Cast" the pointer to the appropriate type
    // Optional key, check for null
    String windowOwnerName = result == null ? "" : new CFStringRef(result).stringValue();

    // ... look up other keys if needed ...
    // use ProcessHandle with the PID to get start time

    // Output or add to List, etc.
    System.out.println(windowNumber.longValue() 
        + " (" + windowOwnerName + ", pid=" 
        + windowOwnerPID.longValue()
        + "): " + windowName);
}

// CF references from "Copy" or "Create" must be released
// release the created key references
kCGWindowNumber.release();
kCGWindowOwnerPID.release();
kCGWindowName.release();
kCGWindowOwnerName.release();
// release the array
windowInfo.release();

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaですべてのウィンドウハンドルのリストを取得する方法(JNAを使用)

分類Dev

WinAPI-すべてのコントロールを取得-ウィンドウのハンドル-ハンドル

分類Dev

フィールドですべての最大カウントを取得する方法

分類Dev

Windows:表示されているすべてのウィンドウのリストを取得する方法は?

分類Dev

C++ で開いているすべてのウィンドウのリストを取得して保存する

分類Dev

PythonスクリプトからmacOSのすべてのウィンドウタイトルのリストを取得します

分類Dev

MacOSでJava(JNAを使用)でフォアグラウンドウィンドウ/プロセスを取得する方法

分類Dev

Powershellのプロセスですべてのウィンドウハンドルを取得するにはどうすればよいですか?

分類Dev

Pythonでコンテキストメニューのウィンドウハンドラーを取得する方法

分類Dev

MySQLでケースを使用して特定のフィールドのカウントを取得する方法

分類Dev

cmdの変数にウィンドウハンドルを割り当てて、ウィンドウを移動するスクリプトを作成します

分類Dev

C ++:プロセスID、プロセスハンドル、およびタイトル名によって、プロセスから唯一のウィンドウのウィンドウハンドルを取得するための最良の方法

分類Dev

すべてのウィンドウスクロールイベントで要素を回転させる方法は?

分類Dev

ドキュメント内のすべてのフィールドをリストで取得する-Firestore Java

分類Dev

Javaで私のウィンドウの外でマウスクリック座標を取得する方法

分類Dev

WSH や WMI などを使用してウィンドウのウィンドウ ハンドルにアクセスする方法はありますか?

分類Dev

.netでInternetExplorerのウィンドウハンドルへの参照を取得する方法

分類Dev

リストではなくセレンのウィンドウハンドルにセットを使用するのはなぜですか?

分類Dev

トップウィンドウまたはすべてのウィンドウのリストを取得できません

分類Dev

SwiftのMacOSで開いているウィンドウのリストを取得するにはどうすればよいですか?

分類Dev

ウィンドウのすべてのUI要素を取得するための最良の方法は何ですか?

分類Dev

Firebaseのハンドルバーテンプレートエンジンでノードjsを使用してウェブアプリをホストする方法

分類Dev

外部で実行されている可視ウィンドウc ++のハンドルを取得する

分類Dev

Mac OS X MountainLionのすべてのウィンドウでタイトルバーを有効にする方法

分類Dev

すべてのウィンドウでカスタムイベントをリッスンする方法、バブリングの問題?

分類Dev

applescriptを使用して現在のAquamacsウィンドウのタイトルを取得する方法

分類Dev

デフォルトで開くすべてのウィンドウに特定のウィンドウサイズと配置を設定する方法

分類Dev

デフォルトで開くすべてのウィンドウに特定のウィンドウサイズと配置を設定する方法

分類Dev

子ウィンドウの親ウィンドウでスクリプトを実行する方法は?

Related 関連記事

  1. 1

    Javaですべてのウィンドウハンドルのリストを取得する方法(JNAを使用)

  2. 2

    WinAPI-すべてのコントロールを取得-ウィンドウのハンドル-ハンドル

  3. 3

    フィールドですべての最大カウントを取得する方法

  4. 4

    Windows:表示されているすべてのウィンドウのリストを取得する方法は?

  5. 5

    C++ で開いているすべてのウィンドウのリストを取得して保存する

  6. 6

    PythonスクリプトからmacOSのすべてのウィンドウタイトルのリストを取得します

  7. 7

    MacOSでJava(JNAを使用)でフォアグラウンドウィンドウ/プロセスを取得する方法

  8. 8

    Powershellのプロセスですべてのウィンドウハンドルを取得するにはどうすればよいですか?

  9. 9

    Pythonでコンテキストメニューのウィンドウハンドラーを取得する方法

  10. 10

    MySQLでケースを使用して特定のフィールドのカウントを取得する方法

  11. 11

    cmdの変数にウィンドウハンドルを割り当てて、ウィンドウを移動するスクリプトを作成します

  12. 12

    C ++:プロセスID、プロセスハンドル、およびタイトル名によって、プロセスから唯一のウィンドウのウィンドウハンドルを取得するための最良の方法

  13. 13

    すべてのウィンドウスクロールイベントで要素を回転させる方法は?

  14. 14

    ドキュメント内のすべてのフィールドをリストで取得する-Firestore Java

  15. 15

    Javaで私のウィンドウの外でマウスクリック座標を取得する方法

  16. 16

    WSH や WMI などを使用してウィンドウのウィンドウ ハンドルにアクセスする方法はありますか?

  17. 17

    .netでInternetExplorerのウィンドウハンドルへの参照を取得する方法

  18. 18

    リストではなくセレンのウィンドウハンドルにセットを使用するのはなぜですか?

  19. 19

    トップウィンドウまたはすべてのウィンドウのリストを取得できません

  20. 20

    SwiftのMacOSで開いているウィンドウのリストを取得するにはどうすればよいですか?

  21. 21

    ウィンドウのすべてのUI要素を取得するための最良の方法は何ですか?

  22. 22

    Firebaseのハンドルバーテンプレートエンジンでノードjsを使用してウェブアプリをホストする方法

  23. 23

    外部で実行されている可視ウィンドウc ++のハンドルを取得する

  24. 24

    Mac OS X MountainLionのすべてのウィンドウでタイトルバーを有効にする方法

  25. 25

    すべてのウィンドウでカスタムイベントをリッスンする方法、バブリングの問題?

  26. 26

    applescriptを使用して現在のAquamacsウィンドウのタイトルを取得する方法

  27. 27

    デフォルトで開くすべてのウィンドウに特定のウィンドウサイズと配置を設定する方法

  28. 28

    デフォルトで開くすべてのウィンドウに特定のウィンドウサイズと配置を設定する方法

  29. 29

    子ウィンドウの親ウィンドウでスクリプトを実行する方法は?

ホットタグ

アーカイブ