[英]Python Ctypes passing pointer to structure containing void pointer array
[英]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.