用python ctypes将结构传递给windowsapi

2024-09-28 03:13:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Windows7上的应用程序中的SysDateTimeObject中设置日期。我使用的是python 2.7和ctypes库,其中包含以下代码,它试图向SysDateTimeObject发送DTM_SETSYSTEMTIME消息:

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吗?在


Tags: 代码fromimportself消息timemyctypes
1条回答
网友
1楼 · 发布于 2024-09-28 03:13:03

我在使用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)。在

相关问题 更多 >

    热门问题