请教关于API向外部程序DTPicker20WndClass控件赋日期值的问题!
如题,请教如何用API向外部程序中的日期控件DTPicker20WndClass中赋值
用
我使用以下代码不成功
his_csrq=FindWindowEx(his_ssyz_1,0,"DTPicker20WndClass",null)
EnableWindow(his_csrq,1)&&出生日期使可编
csrq=VAL(csrq)
?csrq
SendMessage(his_csrq,WM_SETTEXT,255,csrq)
[解决办法]
请参考:
http://topic.csdn.net/u/20081108/11/3b4f957f-29d2-4b7c-8461-f5d6ee660199.html
[解决办法]
如果你找到的控件句柄 his_csrq 没问题的话,发送 DTM_SETSYSTEMTIME 消息,参见 http://msdn.microsoft.com/zh-cn/aa452986
#define DTM_SETSYSTEMTIME 0x1002
Declare Long SendMessage in win32api Long,Long,Long,String
* 设置到 2000-1-1
csrq = bintoc(2000,'2rs')+bintoc(1,'2rs')+bintoc(0,'2rs')+bintoc(1,'2rs') ;
+bintoc(0,'2rs')+bintoc(0,'2rs')+bintoc(0,'2rs')+bintoc(0,'2rs')
SendMessage(his_csrq, DTM_SETSYSTEMTIME, 0, csrq)
[解决办法]
经过细致比较,发现问题出在 DTM_SETSYSTEMTIME 消息所需的最后一个参数,它的地址必须在 DateTimePicker 进程所属的地址范围内,所以才出现我6楼可以成功,而楼主试验却会失败。原因是我测试时的表单与执行 SendMessage 时是用的同一个 vfp 进程,而楼主是需要改变其他进程中的 DatetimePicker 内的值。
经验证,2楼十豆三版主提供的连接中使用方法是不能简化的,除非要改变值的 DatePicker 在同一个进程内,而在同一个进程内时,我们通常是可以通过这个控件对象的 _value 属性来直接修改它的值的。
下面是按照十豆三版主提供的连接改写后的代码,楼主可以测试一下是否可行
*-- vfp9 代码Declare Long GetWindowThreadProcessId In win32api Long,Long @Declare Long OpenProcess In win32api Long,Long,LongDeclare Long CloseHandle In win32api LongDeclare Long VirtualAllocEx In win32api Long,Long @,Long,Long,LongDeclare Long WriteProcessMemory In win32api Long,Long,String,Long,Long @Declare Long VirtualFreeEx In win32api Long,Long,Long,LongDeclare Long SendMessage In win32api Long,Long,Long,Long#Define PROCESS_ALL_ACCESS 0x01F0FFF#Define PAGE_READWRITE 0x04#Define MEM_COMMIT 0x1000#Define MEM_RELEAS 0x8000#Define DTM_SETSYSTEMTIME 0x1002*!* #define DTN_DATETIMECHANGE 0-760+1*!* #define WM_NOTIFY 0x004E_Screen.Caption = Textmerge('<<_Screen.Caption>>(进程ID: <<Application.ProcessId>>)')Try HWnd = Evaluate('0x' + Inputbox('DatetimePicker.hWnd(输入十六进制值)'))Catch HWnd = 0Endtrytt = Datetime() - 100*86400 - 10000 && 要改变到的日期/时间: 当前日期/时间 - 100天10000秒cSysDt = ; BinToC(Year(tt),'2rs') ; + BinToC(Month(tt),'2rs') ; + BinToC(0,'2rs') ; && First day of week + BinToC(Day(tt),'2rs') ; + BinToC(Hour(tt),'2rs') ; + BinToC(Minute(tt),'2rs') ; + BinToC(Sec(tt),'2rs') ; + BinToC(0,'2rs') && MillisecondpId = 0GetWindowThreadProcessId(HWnd, @ pId)hProc = 0pVM = 0Try If pId == 0 Error '无效的 hWnd。' Endif hProc = OpenProcess(PROCESS_ALL_ACCESS, 1, pId) If hProc == 0 Error '无法打开进程写数据。' Endif pVM = VirtualAllocEx(hProc, 0, Len(cSysDt), MEM_COMMIT, PAGE_READWRITE) If pVM == 0 Error '分配写数据的存储区失败。' Endif nWrLen = 0 If 0 == WriteProcessMemory(hProc, pVM, cSysDt, Len(cSysDt), @ nWrLen) Error '写数据到存储区失败。' Endif SendMessage(HWnd, DTM_SETSYSTEMTIME, 0, pVM)Catch To oErr Messagebox(oErr.Message)EndtryIf 0 != pVM VirtualFreeEx(hProc, pVM, 0, MEM_RELEASE)EndifIf 0 != hProc CloseHandle(hProc)Endif