根据窗口ID获取进程PID
2014-03-06 17:36
375 查看
功能:获取窗口所在进程的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
知识点:
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
相关文章推荐
- VB6 根据进程ID(PID)获取窗体句柄
- VB6 根据进程ID(PID)获取窗体句柄
- 如何根据进程id获取该进程的主窗口句柄
- VB6 根据进程ID(PID)获取窗体句柄
- Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄
- 根据窗口句柄来获取进程ID
- 根据进程id获取主窗口句柄
- C++ Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄
- 根据PID获取进程名&根据进程名获取PID
- 怎样由进程id获取X11窗口id
- linux 下根据进程名字获取进程的进程号PID
- 根据关键词获取进程ID然后杀掉进程
- 例程之九_GUI_获取窗口的进程PID
- 根据进程ID获取经常名字 和 根据进程名字获取进程ID
- 根据进程ID获取进程路径
- Java获取当前进程ID(PID)
- 转:VC:如何根据文件名来获取程序进程和窗口句柄的代码(转载)
- Linux有问必答:如何在脚本中获取进程ID(PID)
- [Win32]获取当前输入焦点窗口所属进程的进程ID
- linux 下根据进程名字获取进程的进程号PID,类似pidof,C函数