Python ctypes:带有 LPCSTR [out] 参数的原型

2024-04-11

我目前正在进入ctypes模块,我正在尝试调用 user32 函数GetWindowText http://msdn.microsoft.com/en-us/library/windows/desktop/ms633520%28v=vs.85%29.aspx with a HWND处理我已经收到的使用FindWindow http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499%28v=vs.85%29.aspx。这次我想进一步处理并使用函数原型而不是调用函数ctypes.windll.user32.GetWindowText。虽然我在声明时遇到问题lpString参数作为输出参数。

我的第一次尝试是这样的:

GetWindowText = cfunc("GetWindowTextA",windll.user32,c_int,
                  ("hWnd",HWND,1),
                  ("lpString",LPCSTR,2),
                  ("nMaxCount",c_int,1)
                  )

(cfunc是我找到的一个小包装纸here http://www.cs.unc.edu/~gb/blog/2007/02/11/ctypes-tricks/)

该原型一旦被调用就会产生以下异常:

    chars,name = user32.GetWindowText(handle,255)
TypeError: c_char_p 'out' parameter must be passed as default value

我认为任何输出变量都必须是POINTER(...)类型,所以我将定义更改为:

GetWindowText = cfunc("GetWindowTextA",windll.user32,c_int,
                      ("hWnd",HWND,1),
                      ("lpString",POINTER(c_char),2),
                      ("nMaxCount",c_int,1)
                      )

但这也会产生一个例外:

    chars,name = user32.GetWindowText(handle,255)
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: wrong type

我希望有人知道如何打电话GetWindowText使用正确功能ctypes原型设计。

Edit:

通过进一步的研究,我可以让它发挥作用,至少以某种方式。我解决的第一个问题是使用cfunc()其中调用说明符错误。我定义了该函数的精确副本并将其命名winfunc()并更换return CFUNCTYPE(result, *atypes)((name, dll), tuple(aflags)) with return WINFUNCTYPE(result, *atypes)((name, dll), tuple(aflags)).

然后我进一步检查了原型设计。看起来如果你通过有点像("someParameter",POINTER(aType),2) to WINFUNCTYPE它将创建一个aType调用时对象并将指向该对象的指针传递给函数。在返回的元组中,您可以访问aType目的。这又带来了另一个问题。 cstring 是一个字符数组;所以需要告诉 ctypes 创建一个c_char array。这意味着:

GetWindowText = winfunc("GetWindowTextA",windll.user32,c_int,
                  ("hWnd",HWND,1),
                  ("lpString",POINTER(c_char*255),2),
                  ("nMaxCount",c_int,1)
                  )

工作得很好。但不幸的是,ctypes 现在将传递一个指向 cstring 的指针,该指针始终为 255 个字符长,忽略指定的大小nMaxCount.

在我看来,我认为没有办法让该函数与定义为输出参数的动态大小的 cstring 一起使用。唯一的可能性似乎就是简单地不使用输出参数功能并定义一个LPCSTR作为输入参数。然后被调用者需要自己创建一个缓冲区ctypes.create_string_buffer()并将其传递给函数(就像在 C 中一样)。


您必须为输出参数创建一个字符串缓冲区。您可以包装该函数以使其有些透明:

# python3
from ctypes import *

_GetWindowText = WinDLL('user32').GetWindowTextW
_GetWindowText.argtypes = [c_void_p,c_wchar_p,c_int]
_GetWindowText.restype = c_int

def GetWindowText(h):
    b = create_unicode_buffer(255)
    _GetWindowText(h,b,255)
    return b.value

FindWindow = WinDLL('user32').FindWindowW
FindWindow.argtypes = [c_wchar_p,c_wchar_p]
FindWindow.restype = c_void_p

h = FindWindow(None,'Untitled - Notepad')
print(GetWindowText(h))

或者在这种情况下你可以使用pywin32 http://sourceforge.net/projects/pywin32/:

import win32gui
h = win32gui.FindWindow(None,'Untitled - Notepad')
print(win32gui.GetWindowText(h))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python ctypes:带有 LPCSTR [out] 参数的原型 的相关文章

随机推荐

  • ES6 WeakMap 类封装

    我试图理解为什么我需要使用 Wea kMaps 来创建私有类成员 而不是仅仅使用普通变量 它们都使用闭包和模块导入来创建封装 function encapsulation const my var My secret info const
  • 使用 MySQL 时,在 NHibernate 中使用 Guid 作为 Id 列会导致格式异常

    当我定义 NHibernate 实体 映射以使用 Guid 作为标识列时 我收到一个异常 Guid 列生成为 varchar 40 但内容似乎是二进制的 有针对这个的解决方法吗 目前我只使用普通的 ol int 但如果知道对于未来的项目会很
  • Django请求GET参数值列表

    我想做一些排序 我想要的是使用名为 ordering 的参数执行 GET 请求 如下所示 该值将是我将用于排序的模型属性 如下所示 order age height 问题是当我尝试接收订单参数时 该值是一个列表 我尝试像这样使用 as if
  • 查看寻呼机 + ImageView + 捏合缩放 + 旋转

    我想在 Imageview 上实现捏缩放 在 View Pager 中类似于默认 Android Gallery 我在 GitHub 上找到了多个源 但缩放和滑动仅适用于第一个图像 我尝试过的 1 触摸图像视图 https github c
  • 如何从缓冲图像中获取子图像

    我们可以使用 BufferedImage 获取子图像getSubimage int int int int 但我的问题是我想通过传递双值来获得精确的子图像 矩形图像 width and height 有什么替代方案吗 将 double 值转
  • FragmentTransation setCustomAnimations 不起作用

    我尝试使用新的 android 兼容性包将片段包含到我的项目中 我试图在添加新片段时包含过渡动画 这只是我的动画作品之一 In 动画有效 但 Out 动画无效 我在某处读到这是兼容性包中的一个错误 但我还了解到该错误已在兼容性包的第三版中修
  • 是否有从 Maven 到 Bazel 的迁移路径?

    现在巴泽尔 http bazel io http bazel io 已经开源了 是否有一个增量过程可以让我逐渐从 Maven 迁移 一个大型存储库 到 Bazel 我在研究巴泽尔 不 据我们所知 没有这样的过程 我希望 我们一直在运行一些从
  • iOS Swift 3 参数前面有下划线

    今天我在Xcode中打开我的项目 需要将当前的Swift转换为Swift 3 转换后 我发现函数的所有参数前面都有一个下划线 例如 func didGetWeather weather Weather 我尝试去掉下划线 效果很好 我想知道这
  • IE9 ReactJs 中未定义“Set”或“Map”

    我使用 React 16 2 0 创建了一个简单的应用程序 当我在 IE9 上执行 运行它时 它显示控制台错误 Set 或 Map 未定义 我发现在 IE9 上运行我的 React 应用程序需要一些填充 我按照以下步骤操作 它对我有用 由于
  • MPL pos 是一个未记录的元函数吗?

    里面有下面的示例代码BOOST MPL 文档find算法 http www boost org doc libs 1 46 1 libs mpl doc refmanual find html typedef vector
  • 什么是部分视图?

    我一直在使用 Codeigniter 来习惯模型 视图 控制器架构 并尝试加快制作和实现网站的过程 我不断看到对 部分视图 的引用 但找不到该术语的定义 谁能告诉我什么是部分视图以及它在哪里使用 部分视图只是可以包含在父视图中的子视图 我们
  • Sonata 管理捆绑包 - 表单类型:sonata_type_collection - 自定义模板?

    是否可以覆盖表单类型的模板 sonata type collection 我已经尝试过以下方法 formMapper gt add slides sonata type collection array array edit gt inli
  • 如何将“element.offsetParent”与 HTML SVG 元素一起使用?

    我正在对一些 javascript 进行维护 它使用 offsetParent http www quirksmode org js findpos html财产 最近的更改现在使应用程序使用 SVG 元素 并且它们破坏了 JavaScri
  • 如何在 Iphone 上显示带有 UIButton 的 UINavigationController?

    在我的应用程序中 第一个视图是一个 UIView 带有几个 uilabel 和一个 uibutton 来进行登录 我想在登录后显示一个带有表格的 uinavigationcontroller 因此可以使用按钮的操作 我知道如何从 Xcode
  • Python 中的(命名)元组字典和速度/RAM 性能

    我正在创建一本字典d一百万个元组项目 理想情况下我想通过以下方式访问它们 d 1634 id or d 1634 id d 1634 name or d 1634 name d 1634 isvalid or d 1634 isvalid
  • 如何使用 vba 将临时记录集导出到 csv 文件

    我有一个 MS Access 表 正在跟踪 50 种产品及其每日销量 我想使用 vba 1 csv 文件 包括标题 导出每个产品 显示记录集中的每日交易量 而不将记录集保存到永久查询 我正在使用下面的代码 但我陷入了下面代码中突出显示的实际
  • 如何在静态服务器上托管 ReactJS 项目

    我已经构建了一个 React 应用程序 它在本地服务器上运行良好 但是 当我运行 npm run build 时 该过程似乎正确执行 创建 build 文件夹 其中包含捆绑的 js 文件和 index html 文件 但是当我在浏览器中打开
  • 每个用户的子域

    我拥有一个网站 为每个注册用户提供一个专用空间 如下所示 www mywebpage com user1 www mywebpage com user2 www mywebpage com user3在这条路径中 用户有他的迷你网站 我想为
  • 自定义内联SeekBarPreference - 如何在第一次运行时设置SeekBar进度?

    我已经准备好了一个简单的测试项目 https github com afarber android newbie tree q19 MyPrefs我在 GitHub 上提出的问题 我的项目中有一个自定义inline 搜索栏首选项 https
  • Python ctypes:带有 LPCSTR [out] 参数的原型

    我目前正在进入ctypes模块 我正在尝试调用 user32 函数GetWindowText http msdn microsoft com en us library windows desktop ms633520 28v vs 85