3

QTで、任意の外部ウィンドウのスクリーンショットを撮るライブラリを作成しています。を使用してスクリーンショットを撮る方法を知っていますQScreen::grabWindow()が、これは引数としてaを取ります。画面やデスクトップ(または同様のもの)のすべてのウィンドウのsのWIdリストを取得する方法があるかどうかを知りたいです。タイトル名を使用して特定のウィンドウのをWId取得するように)、QTを介して。WIdこれは、Windowsなどのプラットフォームに依存する方法で実行できることは承知していますがEnumWindows、可能であれば、QT内でクロスプラットフォームを維持したいと考えていました。

4

1 に答える 1

5

これは Qt では不可能です。ライブラリをプラットフォームに依存しないようにする場合は、サポートするプラットフォームごとにコードを記述する必要があります。

このプラットフォームを独立させるには、 preprocessor を使用してプラットフォームをテストする (パブリック) 関数を作成する必要があります#if

#ifdef __unix__
    // call unix specific code
#elseif ...
    // other platforms
#else
#error Platform not supported!
#endif

UNIX 固有のコードの場合、ウィンドウをツリーで管理する xlib を使用する必要があります。次のコードから、すべてのウィンドウが取得されます。X11 には、目に見えないウィンドウや、個別のウィンドウとは思えないウィンドウがたくさんあります。したがって、間違いなく結果をフィルタリングする必要がありますが、これは必要なウィンドウの種類によって異なります。

このコードを開始として使用します。

#include <X11/Xlib.h>

// Window is a type in Xlib.h
QList<Window> listXWindowsRecursive(Display *disp, Window w)
{
    Window root;
    Window parent;
    Window *children;
    unsigned int childrenCount;

    QList<Window> windows;
    if(XQueryTree(disp, w, &root, &parent, &children, &childrenCount))
    {
        for(unsigned int i = 0; i < childrenCount; ++i)
        {
            windows << children[i];
            windows << listXWindowsRecursive(disp, children[i]);
        }
        XFree(children);
    }
    return windows;
}

Display *disp = XOpenDisplay(":0.0");
Window rootWin = XDefaultRootWindow(disp);
QList<Window> windows = listXWindowsRecursive(disp, rootWin);

foreach(Window win, windows)
{
    // Enumerate through all windows
}
于 2012-07-21T17:47:34.360 に答える