根据窗口ID获取进程PID

本文介绍了如何利用X11库中的函数获取窗口所属进程的PID。通过XOpenDisplay获取display指针,XInternAtom得到_NET_WM_PID的AtomID,再用XGetWindowProperty获取窗口PID属性。示例代码展示了具体实现过程,包括编译和执行步骤。

功能:获取窗口所在进程的PID
知识点:
1、得到默认的display指针:XOpenDisplay
2、通过字串取对应的AtomID:XInternAtom
3、获取窗的某一属性:XGetWindowProperty

       

知识补充:

display: 由键盘,鼠标和一个或多个屏幕组成的一个工作站
screen:一个display可以有多个screen

property是每个window拥有的一组属性。atom用来标识每个property,可通过XInternAtom()获得atom。XA_为前坠的宏代表内置的atom


源码:
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <string.h>
 
#define MAX_PROPERTY_VALUE_LEN 4096    //取得属性值最大长度
 
int main(int argc, char **argv)
{
        Display *disp = XOpenDisplay(NULL);       //获取默认的display指针
        Window win = NULL;
        int ret = -1;
        Atom xa_prop_name;
        Atom xa_ret_type;
        int ret_format;
        unsigned long ret_nitems;
        unsigned long ret_bytes_after;
        unsigned long tmp_size;
        unsigned char *ret_prop;
        int id;
 
        if (argc < 2)
        {
                 printf("please input windowID, such as: ./main 0x240001e (use command xwininfo)\n");
                 return -1;
        }
 
        ret = sscanf(argv[1], "0x%0x", &win);         // 从程序参数中获取xwindow id
        if (ret < 1)
        {
                 printf("please input windowID, such as: ./main 0x240001e (use command xwininfo)\n");
                 return -1;
        }
 
        printf("xwindow id: 0x%0x\n", win);
 
        xa_prop_name = XInternAtom(disp, "_NET_WM_PID", False);  // 取对应字串的AtomID
 
        if (XGetWindowProperty(disp, win, xa_prop_name, 0,           // 获取窗口属性
                                    MAX_PROPERTY_VALUE_LEN / 4,
                                    False, XA_CARDINAL, &xa_ret_type,         // XA_CARDINAL为数值类型
                                    &ret_format, &ret_nitems, &ret_bytes_after,
                                    &ret_prop) != Success)       // 后五个参数是返回值
        {
                 printf("Cannot get %s property.\n", "_NET_WM_PID");
                 return NULL;
        }
        else
        {
                 memcpy(&id, ret_prop, 4);// 类型传换
                 printf("window pid: %d\n", id);
        }
}
编译
$ g++ main.cpp -o main ` pkg-config glib-2.0 --libs --cflags` -lX11
执行结果
在一个终端打开一个带窗口界面的程序
使用以下命令获得窗口的xwindow id
$ xwininfo | grep “Window id”
运行命令后用鼠标点击程序窗口
运行我们编写的程序,并将十六进程的xwindow id作为参数传给程序
$ ./main 0x240001e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值