LINUX获取当前窗口的ID

简介: LINUX获取当前窗口的ID

代码如下:


#ifndef __WINDOWIDUTIL_H__
#define __WINDOWIDUTIL_H__
// win
#ifdef WIN32
#include <windows.h>
typedef struct
{
    HWND hWnd;
    DWORD dwPid;
}WNDINFO;
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    WNDINFO* pInfo = (WNDINFO*)lParam;
    DWORD dwProcessId = 0;
    GetWindowThreadProcessId(hWnd, &dwProcessId);
    if(dwProcessId == pInfo->dwPid)
    {
     pInfo->hWnd = hWnd;
     return FALSE;
    }
    return TRUE;
}
WId get_win_id_from_pid(DWORD dwProcessId)
{
    WNDINFO info = {0};
    info.hWnd = NULL;
    info.dwPid = dwProcessId;
    EnumWindows(EnumWindowsProc, (LPARAM)&info);
    return (WId)info.hWnd;
}
#else // linux
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <iostream>
#include <list>
#include <stdlib.h>
#include <unistd.h>
class WindowsMatchingPid
{
public:
    WindowsMatchingPid(Display *display, Window wRoot, unsigned long pid)
        : _display(display),
          _pid(pid)
    {
        // Get the PID property atom.
        _atomPID = XInternAtom(display, "_NET_WM_PID", True);
        if(_atomPID == None)
        {
            std::cout << "No such atom" << std::endl;
            return;
        }
        search(wRoot);
    }
    const std::list<Window> &result() const { return _result; }
private:
    unsigned long  _pid;
    Atom           _atomPID;
    Display       *_display;
    std::list<Window>   _result;
    void
    search(Window w)
    {
        // Get the PID for the current Window.
        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 the PID matches, add this window to the result set.
                if(_pid == *((unsigned long *)propPID))
                {
                    _result.push_back(w);
                }
                XFree(propPID);
            }
        }
        // Recurse into child windows.
        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]);
        }
        //XFree(propPID);
    }
};
//getpid()
unsigned long get_win_id_from_pid(int pid)
{
    //std::cout << "Searching for windows associated with PID " << pid << std::endl;
    // Start with the root window.
    Display *display = XOpenDisplay(0);
    WindowsMatchingPid match(display, XDefaultRootWindow(display), pid);
    // Print the result.
    const std::list<Window> &result = match.result();
    long win_id = 0;
#if 0
    for(std::list<Window>::const_iterator pos = result.begin(); pos != result.end(); pos++)
    {
        std::cout << "Window #" << (unsigned long)(*pos) << std::endl;
        win_id = (unsigned long)(*pos);
        break;
    }
#else
    win_id = (long)(*result.begin());
#endif
    cout << "Window id: "<< win_id << endl;
    return win_id;
}
#endif
#endif // __WINDOWIDUTIL_H__


目录
相关文章
|
6月前
|
Linux API C语言
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
156 0
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
|
2月前
|
Linux API
Linux内核中的两种ID分配方式
Linux内核中的两种ID分配方式
|
5月前
|
安全 Linux 数据安全/隐私保护
探索Linux命令newuidmap:用户ID映射的利器
`newuidmap`是Linux工具,用于在用户命名空间中设定UID映射,支持容器安全。它允许限定容器内进程的主机系统权限,确保数据安全和隔离。通过映射文件或命令行参数定义UID映射,提供灵活性和安全性。例如,为Docker容器设置映射,使进程能访问特定UID的数据文件。使用时需注意映射准确性、权限控制和避免映射过多UID。与其他工具如`newgidmap`配合使用以增强用户命名空间支持。
|
5月前
|
Linux 数据处理 数据库
深入解析Linux命令id:理解用户身份与权限
`id`命令在Linux中用于显示用户身份(UID, GID和附加组)。它查看系统用户数据库获取信息。参数如`-u`显示UID,`-g`显示GID,`-G`显示附加组,结合`-n`显示名称而非ID。用于确认命令执行者身份,确保权限正确。在脚本中使用时注意权限管理,遵循最小权限原则。
|
6月前
|
Linux Shell C语言
如何在 Linux 中查找父进程 ID (PPID)?
【5月更文挑战第4天】
858 4
如何在 Linux 中查找父进程 ID (PPID)?
|
5月前
|
Linux 调度
【Linux】线程ID
【Linux】线程ID
|
6月前
|
Oracle 关系型数据库 Linux
Oracle Linux: How To Disable NUMA At OS Level (Doc ID 2193586.1)
Oracle Linux: How To Disable NUMA At OS Level (Doc ID 2193586.1)
68 1
|
6月前
|
Linux
Linux系统之id命令的基本使用
Linux系统之id命令的基本使用
234 5
Linux系统之id命令的基本使用
|
6月前
|
Linux Shell
【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
|
6月前
|
存储 安全 Shell
【Shell 命令集合 系统管理 】Linux 显示当前用户的身份信息 id命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前用户的身份信息 id命令 使用指南
252 0
下一篇
无影云桌面