[英]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。
為了得到它,
xcb_intern_atom
得到的原子值_NET_ACTIVE_WINDOW
xcb_setup_roots_iterator(xcb_get_setup(connection)).data->root
xcb_get_property
, xcb_get_property_reply
和xcb_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.