python-3.x - XGetWindowProperty 和 ctypes
问题描述
问题
我正在尝试为NET_WM_NAME
X11 报告的每个窗口/客户端查找属性。问题是没有返回任何内容 - 项目数为 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])
解决方案
推荐阅读
- c++ - 自定义转换不能指定返回类型
- android - Android TV:如何使用 Leanbak 自定义 android TV 的左侧导航面板?
- flutter - 无效的插件规范。无效的“macos”插件规范。在生成应用程序包时
- celery - Celery + Channels:在工作人员中接收消息
- python - 使用 Python Selenium 单击表格元素
- c# - 通过 itextsharp .net 从 pdf 中删除链接
- tomcat - 配置为侦听端口 8081 的 Tomcat 连接器无法启动。端口可能已在使用中或连接器可能配置错误
- php - 将两个关联数组转换为一个多维数组 PHP
- php - 在foreach循环之后如何在php中写入这个变量或那个变量
- c# - SQL密码解密成功但在C#密码中运行项目时无法获取解密密码