簡體   English   中英

使用XCB獲取活動窗口的WId

[英]Get WId of active window with XCB

用XCB獲取活動窗口(具有輸入焦點的窗口)的正確方法是什么?

reply = xcb_get_input_focus_reply(connection, xcb_get_input_focus(connection), nullptr);
std::cout << "WId: " << reply->focus;

有時這有時是可行的,有時不是。

我還看到有人提到查詢_NET_ACTIVE_WINDOW根窗口屬性,但我不知道該怎么做,並且XCB始終支持它嗎?

編輯: 上面使用xcb_get_input_focus的方法只是一部分,在得到reply-> focus之后,您需要通過xcb_query_tree跟蹤父窗口。

據我所知,符合EWMH的窗口管理器_NET_ACTIVE_WINDOW根窗口的_NET_ACTIVE_WINDOW屬性設置為當前活動窗口的窗口ID。

為了得到它,

  1. 使用xcb_intern_atom得到的原子值_NET_ACTIVE_WINDOW
  2. 獲取根窗口ID,例如,使用xcb_setup_roots_iterator(xcb_get_setup(connection)).data->root
  3. 使用xcb_get_propertyxcb_get_property_replyxcb_get_property_value來獲取根窗口的屬性值。

_NET_ACTIVE_WINDOW具有CARDINAL類型,出於XCB的目的,其大小為32位。

或者,您可以使用libxcb-ewmh將此任務包裝到xcb_ewmh_get_active_window函數中。

該解決方案對我有用,它或多或少是從某些X11代碼遷移到XCB的。 基本上獲取焦點窗口,並跟蹤父窗口的路徑,直到窗口ID等於父ID或根ID,然后才是頂級窗口。

WId ImageGrabber::getActiveWindow()
{
    xcb_connection_t* connection = QX11Info::connection();
    xcb_get_input_focus_reply_t* focusReply;
    xcb_query_tree_cookie_t treeCookie;
    xcb_query_tree_reply_t* treeReply;

    focusReply = xcb_get_input_focus_reply(connection, xcb_get_input_focus(connection), nullptr);
    xcb_window_t window = focusReply->focus;
    while (1) {
        treeCookie = xcb_query_tree(connection, window);
        treeReply = xcb_query_tree_reply(connection, treeCookie, nullptr);
        if (!treeReply) {
            window = 0;
            break;
        }
        if (window == treeReply->root || treeReply->parent == treeReply->root) {
            break;
        } else {
            window = treeReply->parent;
        }
        free(treeReply);
    }
    free(treeReply);
    return window;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM