C++ 如何在C++;?

C++ 如何在C++;?,c++,linux,qt,C++,Linux,Qt,有没有办法在Linux下获取当前聚焦窗口的几何图形?我只需要窗口的位置(x和y)和大小(宽度和高度)就可以了,窗口当前有焦点或者在桌面上 我想在我的QT应用程序中使用此信息来截屏此窗口。显然,解决此问题的第一步是确定当前处于焦点的窗口。为此,您可以使用Xlib的函数。在此之后,使用获取窗口的位置和大小(甚至是有关窗口的更多信息)。显然,解决此问题的第一步是确定当前处于焦点的窗口。为此,您可以使用Xlib的函数。之后,使用获取窗口的位置和大小(甚至更多关于窗口的信息)。谢谢@Striezel,您的

有没有办法在Linux下获取当前聚焦窗口的几何图形?我只需要窗口的位置(x和y)和大小(宽度和高度)就可以了,窗口当前有焦点或者在桌面上


我想在我的QT应用程序中使用此信息来截屏此窗口。

显然,解决此问题的第一步是确定当前处于焦点的窗口。为此,您可以使用Xlib的函数。在此之后,使用获取窗口的位置和大小(甚至是有关窗口的更多信息)。

显然,解决此问题的第一步是确定当前处于焦点的窗口。为此,您可以使用Xlib的函数。之后,使用获取窗口的位置和大小(甚至更多关于窗口的信息)。

谢谢@Striezel,您的反馈为我指明了正确的方向。在研究了您的解决方案后,我发现了以下帖子:

稍微调整一下@Doug的答案,我得到了如下结果,似乎如预期的那样工作:

Window getToplevelParent(Display* display, Window window)
{
    Window parentWindow;
    Window rootWindow;
    Window* childrenWindows;
    unsigned int numberOfChildren;

    while (1) {
        if (XQueryTree(display, window, &rootWindow, &parentWindow, &childrenWindows,
                       &numberOfChildren) == 0) {
            qCritical("ImageGrabber::getToplevelParent: XQueryTree Error");
            return 0;
        }
        if (childrenWindows) {
            XFree(childrenWindows);
        }
        if (window == rootWindow || parentWindow == rootWindow) {
            return window;
        } else {
            window = parentWindow;
        }
    }
}

QRect ImageGrabber::getActiveWindowRect()
{

    Display* display = XOpenDisplay(NULL);
    Window focusWindow, parentOfFocusedWindow;
    XWindowAttributes attrributes;
    int revert;

    XGetInputFocus(display, &focusWindow, &revert);
    parentOfFocusedWindow = getToplevelParent(display, focusWindow);
    if (!parentOfFocusedWindow) {
        qCritical("ImageGrabber::getActiveWindowRect: Unable to get window, returning screen.");
        return getCurrectScreenRect();
    }

    XGetWindowAttributes(display, parentOfFocusedWindow, &attrributes);
    return QRect(attrributes.x, attrributes.y, attrributes.width, attrributes.height);
} 

谢谢@Striezel,你的反馈给了我正确的方向。在研究了您的解决方案后,我发现了以下帖子:

稍微调整一下@Doug的答案,我得到了如下结果,似乎如预期的那样工作:

Window getToplevelParent(Display* display, Window window)
{
    Window parentWindow;
    Window rootWindow;
    Window* childrenWindows;
    unsigned int numberOfChildren;

    while (1) {
        if (XQueryTree(display, window, &rootWindow, &parentWindow, &childrenWindows,
                       &numberOfChildren) == 0) {
            qCritical("ImageGrabber::getToplevelParent: XQueryTree Error");
            return 0;
        }
        if (childrenWindows) {
            XFree(childrenWindows);
        }
        if (window == rootWindow || parentWindow == rootWindow) {
            return window;
        } else {
            window = parentWindow;
        }
    }
}

QRect ImageGrabber::getActiveWindowRect()
{

    Display* display = XOpenDisplay(NULL);
    Window focusWindow, parentOfFocusedWindow;
    XWindowAttributes attrributes;
    int revert;

    XGetInputFocus(display, &focusWindow, &revert);
    parentOfFocusedWindow = getToplevelParent(display, focusWindow);
    if (!parentOfFocusedWindow) {
        qCritical("ImageGrabber::getActiveWindowRect: Unable to get window, returning screen.");
        return getCurrectScreenRect();
    }

    XGetWindowAttributes(display, parentOfFocusedWindow, &attrributes);
    return QRect(attrributes.x, attrributes.y, attrributes.width, attrributes.height);
} 
你可以用

你可以用