在python ctypes中将结构传递给Windows API
我正试图在Windows7上的应用程序中的SysDateTimeObject中设置日期。我正在使用python 2.7和ctypes库,其中包含以下代码,试图将DTM_SETSYSTEMTIME消息发送到SysDateTimeObject:在python ctypes中将结构传递给Windows API,python,ctypes,Python,Ctypes,我正试图在Windows7上的应用程序中的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 SYSTEMTI
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))
窗口是指向正确SysDateTimeObject的HWND,0x1002是DTM_SETSYSTEMTIME消息的代码。SendMessageW的第三个参数是一个常量,用于启用或禁用DateTimeControl。我可以将其设置为1,它将禁用控件,如预期的那样。第四个参数是指向填充的SYSTEMTIME结构的指针。然而,它似乎没有做上面写的任何事情。我可以发送其他消息,但当函数需要指向结构的指针时,事情就开始失败。我在这里使用的ctypes错误吗?我使用了ctypes,遇到了这种需要,并设法解决了它。问题的原因是您试图在另一个进程中运行它,而您的SYSTEMTIME
结构位于您自己进程的私有内存空间中。因此,每当它试图对所传递的结构执行任何操作时,它都会失败并拒绝访问。您需要一个远程内存块来解决此问题
pywinauto.controls.common\u控件。\u 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)
。在pywinatuo
0.4.2中,您还可以编写window.SendMessage(win32defines.DTM\u SETSYSTEMTIME,win32defines.GDT\u VALID,remote_mem)