使用XCB获取活动窗口的宽度
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 root window属性属性,但我不知道是如何完成的,并且始终得到XCB的支持吗?
编辑:上面使用XCB_GET_INPUT_FOCUS的方法仅是一个部分,在获得回复 -> focus之后,您需要通过XCB_QUERY_TREE。
据我所知,符合EWMH的窗口管理器有望将root窗口的_NET_ACTIVE_WINDOW
属性设置为当前活动窗口的窗口ID。
为了获得它,
- 使用
xcb_intern_atom
获取_NET_ACTIVE_WINDOW
的原子值 - 获取根窗口ID,例如使用
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位。
或者您可以使用将此任务包裹到xcb_ewmh_get_active_window
函数的Libxcb-Ewmh。
此解决方案对我有用,它或多或少从某些X11代码迁移到XCB。基本上获取焦点窗口并跟踪父窗口的路径,直到窗口ID等于父级或root 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;
}
相关文章:
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 如何按z顺序获取第二个活动窗口?
- 全局挂钩 DLL 仅在 C# 主窗口处于活动状态/前台时调用 C# 回调方法
- 如何在 Ubuntu Qt 中获取活动窗口标题
- 如何在C Winapi中获取活动文件Explorer窗口的路径
- 使用XCB获取活动窗口的宽度
- 如何使用QEvent::WindowBlocked,以便特定窗口始终处于活动状态?
- 如何在窗口上获取活动桌面类型
- 如何使用窗口 API 获取其他应用中的当前活动
- 应该如何检索当前活动窗口的光标下的单词
- 如何在Windows8中获取活动窗口的标题颜色
- 确定窗口是否聚焦/活动/前景
- SDL2窗口是否可以始终处于活动状态,并在DirectX窗口上运行
- 如何在OSX中执行时强制Qt应用程序成为活动/前台窗口
- 如何使用C++更改窗口的活动录制设备?
- 模式对话框处于活动状态时隐藏MFC主窗口
- 以编程方式在窗口中获取活动连接
- 问题:如何在非活动窗口中显示所选文本
- QMainWindow 不再处于活动状态窗口
- 检查窗口是否处于活动状态