繁体   English   中英

在python ctypes中将结构传递给Windows API

[英]Passing Structure to Windows API in python ctypes

我正在尝试在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错误吗?

我当时使用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,则将my_time = remote_mem.Read(my_time)放在SendMessage调用之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM