linux下根据进程pid获取对应的window id的方法

本文介绍了如何在QT开发中利用X11框架,根据进程ID获取其对应的UI窗口ID,以便将子进程的窗口嵌入到父进程界面中。作者提供了一个C++代码示例,展示了获取窗口ID的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候我们需要在一个图形化进程中抓取另外一个进程的窗口以嵌入到当前进程的界面里。比如,在QT开发中,在当前的进程界面里启动另外一个进程并将其窗口嵌入到当前进程的界面内。下面的代码示例了如何根据进程的id获取其对应的UI窗口ID(基于x11框架)。

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <iostream>
#include <list>
#include <stdlib.h>
#include <QMainWindow>

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; }
    bool hasBadWinId = false;
private:
    unsigned long  _pid = 0;
    Atom           _atomPID;
    Display       *_display = NULL;
    std::list<Window>   _result;
### 使用Python根据进程ID (PID) 获取窗口 为了实现通过进程 ID (PID) 来获取对应的窗口,在 Windows 平台上可以借助 `psutil` 和 `pygetwindow` 库来完成此操作。首先,确保安装了必要的库: ```bash pip install psutil pygetwindow ``` 下面是一个完整的例子,展示了如何找到特定 Python 进程关联的窗口并对其进行操作。 #### 查找指定 PID 的窗口 ```python import psutil from pygetwindow import getWindowsWithTitle def find_window_by_pid(pid): try: process = psutil.Process(pid) windows = [] for win in getWindowsWithTitle(''): if win.title != '': # 需要额外的方式去确认这个窗口确实属于目标进程, # 因为仅靠标题无法精确匹配到具体进程。 # 此处逻辑可能需要依据实际情况调整。 pass return None except psutil.NoSuchProcess: print(f"No process found with PID {pid}") return None if __name__ == "__main__": target_pid = 12345 # 替换为目标进程的实际PID window = find_window_by_pid(target_pid) if window is not None: print("Found Window:", window.title) # 可以在这里执行更多关于该窗口的操作,比如激活它或改变其大小等 else: print("No matching window was found.") ``` 需要注意的是,上述代码中的 `find_window_by_pid()` 函数尝试遍历所有打开的窗口,并试图找出与给定 PID 对应的那个。然而,由于多个应用程序可能会共享相同的窗口标题,因此这种方法并不总是可靠的。更准确的做法可能是利用操作系统提供的 API 或者其他第三方工具来进行更加精准的过程映射[^1]。 对于 Linux 系统而言,则可以通过读取 `/proc/[pid]/status` 文件以及调用 X11 相关函数来达到相似的效果;而对于 macOS 用户来说,Objective-C 或 Swift 编写的辅助程序或许会提供更好的解决方案。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值