如何使用ctypes的errcheck?

2023-12-10

The Python 库参考,版本 3.6.5,第 16.16 段 ctypes - Python 的外部函数库,给出这个例子,证明输出参数,在部分函数原型:

赢32获取窗口矩形功能:

WINUSERAPI BOOL WINAPI GetWindowRect(HWND hWnd, LPCRECT lprect);

The ctypes包装:

from ctypes             import POINTER, WINFUNCTYPE, windll, WinError
from ctypes.wintypes    import BOOL, HWND, RECT

prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))
paramflags = (1, 'hwnd'), (2, 'lprect')
GetWindowRect = prototype(('GetWindowRect', windll.user32), paramflags)

现在,我该如何实际使用获取窗口矩形?

Trying

from ctypes import byref, cast
r = RECT()
h = cast(65552, HWND)   # _65552_ is the return value of _GetDesktopWindow_ on my system
result = GetWindowRect([h, byref(r)])

returns ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type.


[Python]:ctypes - Python 的外部函数库没有提供完整的示例。

code.py:

#!/usr/bin/env python3

import sys
import ctypes
from ctypes import wintypes


def errcheck(result, func, args):
    if not result:
        raise ctypes.WinError()
    rc = args[1]
    return rc.left, rc.top, rc.bottom, rc.right


def test_get_window_rect(desktop_wnd_handle):
    print("\n{:s}\n".format(test_get_window_rect.__name__))
    prototype = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, ctypes.POINTER(wintypes.RECT))
    paramflags = (1, "hwnd"), (2, "lprect")
    GetWindowRect = prototype(("GetWindowRect", ctypes.windll.user32), paramflags)

    print("Without errcheck:\n")
    result = GetWindowRect(ctypes.windll.user32.GetDesktopWindow())
    print("Left: {:d}, Top: {:}, Right: {:d}, Bottom: {:}".format(result.left, result.top, result.right, result.bottom))
    result = GetWindowRect(0)
    print("Left: {:d}, Top: {:}, Right: {:d}, Bottom: {:}".format(result.left, result.top, result.right, result.bottom))

    GetWindowRect.errcheck = errcheck

    print("\nWith errcheck:\n")
    result = GetWindowRect(desktop_wnd_handle)
    print("Left: {:d}, Top: {:}, Right: {:d}, Bottom: {:}".format(*result))
    result = GetWindowRect(0)
    print("Left: {:d}, Top: {:}, Right: {:d}, Bottom: {:}".format(*result))


def test_get_window_rect_old_style(desktop_wnd_handle):
    print("\n{:s}\n".format(test_get_window_rect_old_style.__name__))
    user32_dll = ctypes.WinDLL("user32")
    get_windows_rect_func = user32_dll.GetWindowRect
    get_windows_rect_func.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)]
    get_windows_rect_func.restype = wintypes.BOOL
    rect = wintypes.RECT()
    result = get_windows_rect_func(desktop_wnd_handle, ctypes.byref(rect))
    print("Result: {:d}\nLeft: {:d}, Top: {:}, Right: {:d}, Bottom: {:}".format(result, rect.left, rect.top, rect.right, rect.bottom))
    rect = wintypes.RECT()
    result = get_windows_rect_func(0, ctypes.byref(rect))
    print("Result: {:d}\nLeft: {:d}, Top: {:}, Right: {:d}, Bottom: {:}".format(result, rect.left, rect.top, rect.right, rect.bottom))


def main():
    hwnd = ctypes.windll.user32.GetDesktopWindow()
    test_get_window_rect_old_style(hwnd)
    test_get_window_rect(hwnd)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

Notes:

  • 函数调用正常发生(没有参数处理 - 将它们放在列表中),并且仅input指定参数
  • errcheck“魔法”图解
  • 还包括调用函数的老式方法

Output:

(py35x64_test) e:\Work\Dev\StackOverflow\q050669907>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32


test_get_window_rect_old_style

Result: 1
Left: 0, Top: 0, Right: 1920, Bottom: 1080
Result: 0
Left: 0, Top: 0, Right: 0, Bottom: 0

test_get_window_rect

Without errcheck:

Left: 0, Top: 0, Right: 1920, Bottom: 1080
Left: 0, Top: 0, Right: 0, Bottom: 0

With errcheck:

Left: 0, Top: 0, Right: 1080, Bottom: 1920
Traceback (most recent call last):
  File "code.py", line 58, in <module>
    main()
  File "code.py", line 53, in main
    test_get_window_rect(hwnd)
  File "code.py", line 30, in test_get_window_rect
    result = GetWindowRect(0)
  File "code.py", line 9, in errcheck
    raise ctypes.WinError()
OSError: [WinError 1400] Invalid window handle.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用ctypes的errcheck? 的相关文章

  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • 如何屏蔽 PyTorch 权重参数中的权重?

    我正在尝试在 PyTorch 中屏蔽 强制为零 特定权重值 我试图掩盖的权重是这样定义的def init class LSTM MASK nn Module def init self options inp dim super LSTM
  • 打印 scrapy 请求的“响应”

    我正在尝试学习 scrapy 在遵循教程的同时 我正在尝试进行细微的调整 我想简单地从请求中获取响应内容 然后我会将响应传递到教程代码中 但我无法发出请求并获取响应内容 建议就好 from scrapy http import Respon
  • 如何使用pycaffe重构caffe网络

    我想要的是 加载网络后 我将分解一些特定的图层并保存新的网络 例如 原网 数据 gt conv1 gt conv2 gt fc1 gt fc2 gt softmax New net 数据 gt conv1 1 gt conv1 2 gt c
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • Python 中 genfromtxt() 的可变列数?

    我有一个 txt具有不同长度的行的文件 每一行都是代表一条轨迹的一系列点 由于每条轨迹都有自己的长度 因此各行的长度都不同 也就是说 列数从一行到另一行不同 据我所知 genfromtxt Python 中的模块要求列数相同 gt gt g
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 如何识别图形线条

    我有以下格式的路径的 x y 数据 示例仅用于说明 seq p1 p2 0 20 2 3 1 20 2 4 2 20 4 4 3 22 5 5 4 22 5 6 5 23 6 2 6 23 6 3 7 23 6 4 每条路径都有多个点 它们

随机推荐

  • 无法在 C# 中解析 Oracle 时间戳

    我有 Oracle 的时间戳 string timestamp 23 JUN 14 09 39 04 000000000 AM 我无法将其解析为系统日期时间对象 我用了 CultureInfo provider CultureInfo In
  • 尝试在一个头文件中使用另一个头文件中的类

    我有一个weightedDirectedGraph类和一个vertex类在他们自己的头文件中 weightedDirectedGraph h 就是这个 ifndef GRAPH define GRAPH include
  • JavaFX:显示简单消息的最佳方式是什么?

    在我的应用程序中 我需要显示警告 信息消息 但我不知道一种简单的方法来做到这一点 因为 JavaFX 上没有 JOptionPane 或类似的组件 有一个 Popup 类 但是您必须设置许多参数才能为简单的消息获得合适的布局 位置 背景颜色
  • iOS:以编程方式在 UITextView 中上下左右移动光标

    我使用以下代码将光标位置移动到距离开头 5 个字符UITextField txtView selectedRange NSMakeRange 5 0 现在 如果我的光标位于任意位置 如下图所示 如何上下左右移动光标 向左和向右应该或多或少容
  • Azure 数据工厂 CI npm 验证步骤突然崩溃

    我们一直在使用 Azure 数据工厂的 新 CI CD 设置 如文档页面所述 https learn microsoft com en us azure data factory continuous integration deliver
  • 如何使用 iOS 5.1 打开首选项/设置?

    看起来 iOS 5 1 已经破坏了用于将用户导航到首选项的标准 URL 编码 例如 UIApplication sharedApplication openURL NSURL URLWithString prefs root TWITTER
  • 特定时间段内的平均值

    我在 python 中有一个来自 h5 文件的相当大的表 表的开头看起来有点像这样 table WIND REL DIRECTION deg WIND SPEED kts 735381 370833 0 0 000000 735381 37
  • 将数据传递给Python中的另一个类

    我正在使用 Twisted 并有几个回调 它们都是不同类型的 因此它们不共享工厂 我正在尝试将数据从一个回调对象获取到另一个回调对象 class CallbackA object def transmit self data self se
  • 在拖动发生时更改 android 中的dragshadow

    面临让dragshaddow 由创建的拖动阴影生成器 在拖动时对某些东西做出反应 有人知道应该如何做吗 这是我的自定义拖动阴影生成器的完整代码 自定义拖动阴影的要点 然而 正如其他人所说 不可能使用 API 11 中引入的本机功能来修改拖动
  • 使用RAWINPUT区分左右Shift键

    RAWINPUT 提供两个标志 RI KEY E0 and RI KEY E1 来检查是否按下了左键或右键 这对于 CTRL 非常有用 但对于左移和右移则不适用 事实上 两者的标志是相同的 VKey 也相同 VK SHIFT 我怎样才能知道
  • 在 MVC 中显示标准数据表

    也许这是完全错误的 但在 Webform 时代 您将返回一个数据集 然后将其绑定到网格 但现在在 MVC 中 您不应该传递数据表 因为您无法序列化它 并且从技术上讲 它是将对象传递到不属于它的视图中 但是我到底要如何在视图上显示数据呢 我无
  • 像堆栈溢出一样获取“相关标签”的查询是什么

    我有 3 张桌子 links id linkName tags id tagName tagsBridge tagID linkID 我正在尝试支持显示相关标签 例如 SOF 中 因此 如果您单击标签 XYZ 现在我将显示带有标签 XYZ
  • 2个系列/df.columns之间的模糊查找

    基于此链接我试图进行模糊查找 在数据框列中应用模糊匹配并将结果保存在新列中2 个 dfs 之间 import pandas as pd df1 pd DataFrame data Brand var Johnny Walker Guines
  • 在bigquery中,您可以在使用format_date时指定语言 - 日期函数中的本地化

    我找不到格式化日期的方法GCP bigquery使用特定语言 select CONCAT FORMAT DATE Semaine du d B au date trunc current date ISOWEEK FORMAT DATE d
  • 使用 PHP -> ODBC -> MS SQL 插入 Unicode 字符?

    我有以下代码 sql update tbl test set category N resum echo sql rs odbc exec conn sql 其中 conn 是到 MSSQL Server 的 DSN ODBC 连接 问题似
  • cloudstack启动主备存储失败

    我使用2台主机建立我的cloudstack集群 我的所有主机都是使用NFSv3的Ubuntu 12 04 我使用host1作为主存储服务器和辅助存储服务器 管理服务器也在host1中 我可以在host2上挂载host1的主存储和辅助存储 我
  • scanf 格式中的空白字符问题

    我使用 scanf 读取输入stdin因为 scanf 被认为比cin 我发现以下意外行为 for int i 0 i lt 3 i scanf d t printf The input was d n t The d 格式为scanf预计
  • 如何取消winform按钮点击事件?

    我有一个继承自 System Windows Forms Button 的自定义按钮类 我想在我的 winform 项目中使用这个按钮 该类称为 确认按钮 它显示带有 是 或 否 的确认消息 但问题是 当用户选择 否 并带有确认消息时 我不
  • 使用带有属性占位符值的 @Profile 注释

    当我们在 spring 中为任何组件定义 profile 时 我们将其声明为 Profile value Prod 但我想从属性文件中给出该值 是否可以 如果是 怎么办 通过查看Spring的源代码 我得出的结论是 你所要求的是不可能的 为
  • 如何使用ctypes的errcheck?

    The Python 库参考 版本 3 6 5 第 16 16 段 ctypes Python 的外部函数库 给出这个例子 证明输出参数 在部分函数原型 赢32获取窗口矩形功能 WINUSERAPI BOOL WINAPI GetWindo