首页 > 解决方案 > XGetWindowProperty 和 ctypes

问题描述

问题

我正在尝试为NET_WM_NAMEX11 报告的每个窗口/客户端查找属性。问题是没有返回任何内容 - 项目数为 0 并且返回的数据导致空字符串。我通过 github 和用 C 和 C++ 编写的示例查看了多个代码示例,特别是为什么 XGetWindowProperty 返回 null?以及Xlib XGetWindowProperty 返回零项,但是我找不到我的代码的问题所在。看起来一切都很好,传递给XGetWindowProperty函数的参数顺序与文档一致,函数返回成功状态,但结果为空。我的代码哪里出了问题?

代码

下面是我正在使用的代码。问题是xgetwindowproperty功能。它下面的其他部分工作正常,只是为了完整性而提供。

#! /usr/bin/env python3
import sys
from ctypes import *

def xgetwindowproperty(display,w):

    actual_type_return   = c_ulong()
    actual_format_return = c_int()
    nitems_return        = c_ulong()
    bytes_after_return   = c_ulong()
    prop_return          = POINTER(c_ubyte)()

    wm_name = Xlib.XInternAtom(display,'_NET_WM_NAME',False)
    utf8atom = Xlib.XInternAtom(display,'UTF8_STRING',False)
    print('_NET_WM_NAME',wm_name, 'UTF8_STRING',utf8atom)

    # AnyPropertyType = c_long(0)
    status = Xlib.XGetWindowProperty(
            display,
            w,
            wm_name,
            0,
            65536, 
            False,
            utf8atom,
            byref(actual_type_return),
            byref(actual_format_return),
            byref(nitems_return),
            byref(bytes_after_return),
            byref(prop_return)
    )
    print(nitems_return.value) # returns 0
    # empty string as result
    print( 'Prop', ''.join([ chr(c) for c in prop_return[:bytes_after_return.value]  ]) ) 

    Xlib.XFree(prop_return)
    print('@'*10)
# -------

Xlib = CDLL("libX11.so.6")
display = Xlib.XOpenDisplay(None)
if display == 0: 
    sys.exit(2)

w = Xlib.XRootWindow(display, c_int(0))

root = c_ulong()
children = POINTER(c_ulong)()
parent = c_ulong()
nchildren = c_uint()

Xlib.XQueryTree(display, w, byref(root), byref(parent), byref(children), byref(nchildren))

for i in range(nchildren.value):
    print("Child:",children[i])
    xgetwindowproperty(display,children[i])

标签: python-3.xctypesx11

解决方案


推荐阅读