簡體   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