找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6682|回复: 2

获取SysDateTimePick32控件的日期值(原创)

[复制链接]

11

主题

36

回帖

0

精华

铂金会员

积分
1417
发表于 2010-5-9 10:37:13 | 显示全部楼层 |阅读模式
     在网络上搜索的好多资料,没有找到一个能够正确读取其他程序中的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

评分

参与人数 1 +20 收起 理由
阿杰 + 20 支持开源

查看全部评分

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-5-9 10:43:52 | 显示全部楼层
谢谢分享,学习了!
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-5-9 21:26:12 | 显示全部楼层
好思路.

发送DTM_GETSYSTEMTIME将数据存在本地,再远程读取.
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表