|
     在网络上搜索的好多资料,没有找到一个能够正确读取其他程序中的SysDateTimePick32控件日期值的源码。经过自己的潜心研究,终于大功告成。现公布源码,与诸位共享!;P
一、模块代码:
Option Explicit
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwsize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwsize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Const MEM_RELEASE = &H8000
Private Const PROCESS_QUERY_INFORMATION = 1024
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_VM_WRITE = &H20
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const MAX_LVMSTRING As Long = 255
Private Const MEM_COMMIT = &H1000
Private Const PAGE_READWRITE = &H4
Private Const DTM_GETSYSTEMTIME = &H1001
Private Const DTM_SETSYSTEMTIME = &H1002
Private Const DTM_SETFORMAT = &H1032
Private Const GDT_VALID = 0
Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type
Private objSYSTIME As SYSTEMTIME
Public Function ReadDTPicker(ByVal hWnd As Long) As Date
Dim result As Long
Dim hProcess As Long
Dim pMyItemMemory As Long
Dim pStrBufferMemory As Long
Dim ProcessID As Long
    If hWnd = 0 Then Exit Function
    GetWindowThreadProcessId hWnd, ProcessID
    '打开进程
    hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, ProcessID)
    '申请内存
    pStrBufferMemory = VirtualAllocEx(hProcess, 0, MAX_LVMSTRING, MEM_COMMIT, PAGE_READWRITE)
    '发送命令送入内存
    SendMessage hWnd, DTM_GETSYSTEMTIME, GDT_VALID, ByVal pStrBufferMemory
    '读内存
    result = ReadProcessMemory(hProcess, pStrBufferMemory, objSYSTIME, Len(objSYSTIME), 0)
    '善后工作
    result = VirtualFreeEx(hProcess, pStrBufferMemory, 0, MEM_RELEASE)
    result = CloseHandle(hProcess)
    '输出
    ReadDTPicker = DateSerial(objSYSTIME.wYear, objSYSTIME.wMonth, objSYSTIME.wDay)
End Function
二、调用举例:
dim hwd as long,d as date
hwd=123 '这是SysDateTimePick32控件的句柄,获取方法很简单,此略
d=ReadDTPicker(hwd)
msgbox  d
|
评分
-
查看全部评分
|