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