Python ctypes的byref和pointer区别

15 篇文章 0 订阅

参考:https://www.cnblogs.com/fendou-999/p/3527449.html?utm_source=tuicool&utm_medium=referral

byref(n)返回的相当于C的指针右值&n,本身没有被分配空间:

>>> from ctypes import *
>>> n = c_int(0)
>>> p = byref(n)
>>> pp = byref(p)
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    pp = byref(p)
TypeError: byref() argument must be a ctypes instance, not 'CArgObject'

 

pointer返回的相当于指针左值T* p=&n,可以改变,可以取地址:

>>> from ctypes import *
>>> n = c_int(0)

>>> q = pointer(n)
>>> q.contents = c_int(1)
>>> qq = byref(q)
>>> dir(qq)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_obj']
>>> type(qq)
<class 'CArgObject'>                  #'CArgObject'是什么对象???

>>> qq
<cparam 'P' (010AD238)>
>>> q
<__main__.LP_c_long object at 0x010AD210>
>>> q.contents
c_long(1)

对于T**参数,通常你得构造一个pointer,然后byref传进去

 

以__开头并以__结束的属性(__class__、__dir__ 等)都是为内置方法(built-in method),唯独_obj不是

>>> qq._obj
<__main__.LP_c_long object at 0x010B8120>
>>> q
<__main__.LP_c_long object at 0x010B8120>

由以上执行代码可知,二维指针qq的_obj属性就是该二维指针的首地址,即指向q指针的地址

 

PS: addressof返回一个Python整数,不能直接传给C那边

使用Python ctypes库可以实现控制鼠标并单击左键的功能。下面是一个简单的示例代码: ```python import ctypes # 定义一些常量 MOUSEEVENTF_LEFTDOWN = 0x0002 # 左键按下 MOUSEEVENTF_LEFTUP = 0x0004 # 左键释放 MOUSEEVENTF_MOVE = 0x0001 # 移动鼠标 # 定义MOUSEINPUT结构体 class MOUSEINPUT(ctypes.Structure): _fields_ = [("dx", ctypes.c_long), ("dy", ctypes.c_long), ("mouseData", ctypes.c_ulong), ("dwFlags", ctypes.c_ulong), ("time", ctypes.c_ulong), ("dwExtraInfo", ctypes.POINTER(ctypes.c_ulong))] # 定义INPUT结构体 class INPUT(ctypes.Structure): _fields_ = [("type", ctypes.c_ulong), ("mi", MOUSEINPUT)] # 获取user32.dll user32 = ctypes.windll.user32 # 定义鼠标操作函数 def click(x, y): # 移动鼠标 user32.SetCursorPos(x, y) # 模拟鼠标左键按下 input_down = INPUT(ctypes.c_ulong(0), MOUSEINPUT(x, y, 0, MOUSEEVENTF_LEFTDOWN, 0, None)) user32.SendInput(1, ctypes.byref(input_down), ctypes.sizeof(input_down)) # 模拟鼠标左键释放 input_up = INPUT(ctypes.c_ulong(0), MOUSEINPUT(x, y, 0, MOUSEEVENTF_LEFTUP, 0, None)) user32.SendInput(1, ctypes.byref(input_up), ctypes.sizeof(input_up)) # 调用鼠标操作函数 click(100, 100) ``` 在上面的示例代码中,用户可以调用click(x, y)函数来模拟鼠标在屏幕上点击坐标为(x, y)的位置。该函数通过调用user32库的SetCursorPos函数将鼠标移动到指定位置,然后使用SendInput函数发送模拟鼠标左键按下和释放的消息,从而实现鼠标单击左键的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值