获取SysDateTimePick32控件的日期值(原创)
在网络上搜索的好多资料,没有找到一个能够正确读取其他程序中的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
谢谢分享,学习了! 好思路.
发送DTM_GETSYSTEMTIME将数据存在本地,再远程读取.
页:
[1]