【问题标题】:Passing Structure to Windows API in python ctypes在 python ctypes 中将结构传递给 Windows API
【发布时间】:2011-10-26 21:21:45
【问题描述】:

我正在尝试在 Windows 7 上的应用程序中的 SysDateTimeObject 中设置日期。我正在使用 python 2.7 和 ctypes 库以及以下代码,它尝试将 DTM_SETSYSTEMTIME 消息发送到 SysDateTimeObject:

from ctypes import *
from ctypes.wintypes import BOOL,HWND,RECT,LPCSTR,UINT,INT,DWORD,WORD
import sys
import time

class SYSTEMTIME(Structure):
    _fields_=[('wYear',WORD),
              ('wMonth',WORD),
              ('wDayOfWeek',WORD),
              ('wDay',WORD),
              ('wHour',WORD),
              ('wMinute',WORD),
              ('wSecond',WORD),
              ('wMilliseconds',WORD)]

self.user32 = windll.user32
my_time=SYSTEMTIME(2035,0,0,0,0,0,0,0)
self.user32.SendMessageW(window,c_uint(0x1002),0,byref(my_time))

window 是正确 SysDateTimeObject 的 HWND,0x1002 是 DTM_SETSYSTEMTIME 消息的代码。 SendMessageW 的第三个参数是启用或禁用 DateTimeControl 的常量。我可以将它设置为 1,它会按预期禁用控件。第四个参数是一个指向一个已填充的 SYSTEMTIME 结构的指针。但是,它似乎没有像上面写的那样做任何事情。我可以发送其他消息,但是当函数需要指向结构的指针时,事情开始失败。我在这里使用 ctypes 错误吗?

【问题讨论】:

    标签: python ctypes


    【解决方案1】:

    我使用pywinauto 并遇到了这个需求并设法解决了它。问题的原因是您试图在不同的进程中运行它,而您的 SYSTEMTIME 结构位于您自己进程的私有内存空间中。因此,每当它试图对传递的结构做任何事情时,它都会失败——访问被拒绝。你需要一个远程内存块来解决这个问题。

    pywinauto.controls.common_controls._RemoteMemoryBlock 正是这样做的。

    最终的效果是你会有这样的代码:

    remote_mem = common_controls._RemoteMemoryBlock(window)
    remote_mem.Write(my_time)
    
    user32.SendMessageW(window, win32defines.DTM_SETSYSTEMTIME,
            win32defines.GDT_VALID, remote_mem)
    

    如果您需要使用 DTM_GETSYSTEMTIME,您可以在 SendMessage 调用之后添加my_time = remote_mem.Read(my_time)。

    【讨论】:

    • 在pywinatuo0.4.2,也可以写window.SendMessage(win32defines.DTM_SETSYSTEMTIME, win32defines.GDT_VALID, remote_mem)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多