通过Xlib枚举指定进程下所有窗体
在windows系统下如果想要枚举指定进程的窗体,我们可以通过EnumWindows加上自己实现的回调函数进行实现,那么在linux下该如何做呢?
其实也很简单,在linux下,我们可以通过xlib中提供的API进行实现,关于xlib后面会专门写一篇文章讲解。
一、实现思路
从root窗体开始逐层遍历每一个窗体,将这些窗体所属进程与给定进程比较从而进行筛选。
二、实现代码
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <QList> class WindowsMatchingPid
{
public:
WindowsMatchingPid(Display *display, Window wRoot, unsigned long pid)
: _display(display)
, _pid(pid)
{
_atomPID = XInternAtom(display, "_NET_WM_PID", True);
if(_atomPID == None)
{
return;
} search(wRoot);
} const QList<Window> result() const { return _result; } private:
unsigned long _pid;
Atom _atomPID;
Display *_display;
QList<Window> _result; void search(Window w)
{
Atom type;
int format;
unsigned long nItems;
unsigned long bytesAfter;
unsigned char *propPID = 0;
if(Success == XGetWindowProperty(_display, w, _atomPID, 0, 1, False, XA_CARDINAL,
&type, &format, &nItems, &bytesAfter, &propPID))
{
if(propPID != 0)
{
if(_pid == *((unsigned long *)propPID))
_result.append(w);
XFree(propPID);
}
} Window wRoot;
Window wParent;
Window *wChild;
unsigned nChildren;
if(0 != XQueryTree(_display, w, &wRoot, &wParent, &wChild, &nChildren))
{
for(unsigned i = 0; i < nChildren; i++)
search(wChild[i]);
}
}
};
这里主要使用XGetWindowProperty和XQueryTree进行窗体树遍历以及窗体属性获取。
XGetWindowProperty:获取目标窗体属性信息
XQueryTree:获取目标窗体的窗体树结构
接着就利用这个类去获取进程窗体
int pid = getpid();
Display *display = XOpenDisplay(0);
WindowsMatchingPid match(display, XDefaultRootWindow(display), pid);
const QList<Window> result = match.result();
for(int i=0; i<result.count();i++)
{
unsigned long winId = (unsigned long)(result.at(i));
QWidget* win = QWidget::find(winId);
if(win!=NULL&&win->isWindow()&&win->isVisible()){
m_pformList->append((QObject*)win);
}
}
XCloseDisplay(display);
PS:每次调用XOpenDisplay获取x-server连接之后要记得调用XCloseDisplay关闭连接,否则连接泄露会导致程序异常退出。
通过Xlib枚举指定进程下所有窗体的更多相关文章
- shell脚本杀掉指定进程下所有子进程(包括子进程的子进程)
搜索了网上好像并没有杀掉指定进程下所有子进程(包括子进程的子进程)的脚本,自己琢磨写了一版,虽说比较简单,但希望分享大家,帮助需要的人 #!/bin/sh # 递归找到进程最底层子进程并杀除. mai ...
- Windows下如何枚举所有进程
要编写一个类似于 Windows 任务管理器的软件,首先遇到的问题是如何实现枚举所有进程.暂且不考虑进入核心态去查隐藏进程一类的,下面提供几种方法.请注意每种方法的使用局限,比如使用这些 API 所需 ...
- Win8下枚举任意进程的句柄表。。。(VB6 Code)
添加一个Command1.一个List1,代码: Private Type PROCESS_HANDLE_TABLE_ENTRY_INFO HandleValue As Long HandleCoun ...
- iOS案例:读取指定目录下的文件列表
// // main.m // 读取指定目录下的文件列表 // // Created by Apple on 15/11/24. // Copyright © 2015年 Apple. All rig ...
- 使用VC++通过远程进程注入来实现HOOK指定进程的某个API
前阵子读到一篇关于<HOOK API入门之Hook自己程序的MessageBoxW>的博客,博客地址:http://blog.csdn.net/friendan/article/detai ...
- Android Studio怎样选择查看指定进程的log?
今天说一个简单的东东,关于Android Studio在logcat中怎样查看指定进程的log. 关于过滤你自己所开发的应用的log.在这篇文章中:Android Studio怎样给log加入过滤项( ...
- linux:如何指定进程运行的CPU
coolshell最新的文章<性能调优攻略>在"多核CPU调优"章节,提到"我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为 ...
- [转] 指定进程运行的CPU
转自:https://www.cnblogs.com/liuhao/archive/2012/06/21/2558069.html coolshell最新的文章<性能调优攻略>在“多核CP ...
- 通过zipfile解压指定目录下的zip文件
代码: # -*- coding: utf-8 -*- import os import zipfile import platform import multiprocessing # 解压后的文件 ...
随机推荐
- Centos7拓展磁盘(逻辑增加)
目录 第一步 第二步 第三步 以107.4G的Centos操作系统拓展20G磁盘空间,并将此20G磁盘空间分别分配给/home为例. 第一步 首先查看操作系统分区状况和磁盘占用情况.发现磁盘sda空间 ...
- 空指针的解决方案Optional包装类
有道云笔记地址 (建议有道云打开,markdown文档,直接拷贝过来有一些问题) 引言 在java的开发中,有一个问题始终会伴随着开发的进程.记得我第一个项目的时候,有一个同事在评论我的代码的时候说到 ...
- drf-序列化器serializer
目录 一.序列化器-serializer 二.序列化器的使用 简单使用 高级使用 source **SerializerMethodField( ) ** 通用参数 三.反序列化数据校验 字段属性 局 ...
- 关于使用Draw.io画数据库E-R图的说明
背景简介 E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. diagrams.net是用于构建图表 ...
- 15、mysql事物和引擎
15.1.数据库事物介绍: 1.什么是数据库事物:
- mapboxgl 互联网地图纠偏插件(二)
前段时间写的mapboxgl 互联网地图纠偏插件(一)存在地图旋转时瓦片错位的问题. 这次没有再跟 mapboxgl 的变换矩阵较劲,而是另辟蹊径使用 mapboxgl 的自定义图层,重新写了一套加载 ...
- flex发生错误积累。每次遇到错误记录一点点
error #2044: 未处理的 ioerrorevent: text=error #2036: 加载未完成 出现这个问题,因为我是要实现图片编辑裁剪,然后上传.没有上传成功,出现上面的这个错误, ...
- Spring源码编译一次性通过&遇到的坑解决方法
前言 spring源码本地编译,按网上的博客参考资料的操作步骤,总是会出现各种莫名其妙的错误.根据错误信息找解决方案,但在自己的环境下又总是编译不过去.结合参加培训学习Jack老师提供的方法,自己多种 ...
- 1、springboot2新建web项目
1.添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...
- 查看python的安装版本,位数及安装路径
一.想要查看ubuntu中安装的Python路径 方法一:whereis python (用来快速查找任何文件,是一个文件搜索命令,与locate的功能一样.执行whereis python 会将所有 ...