首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

请问关于API向外部程序DTPicker20WndClass控件赋日期值的有关问题

2012-06-25 
请教关于API向外部程序DTPicker20WndClass控件赋日期值的问题!如题,请教如何用API向外部程序中的日期控件D

请教关于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 属性来直接修改它的值的。

下面是按照十豆三版主提供的连接改写后的代码,楼主可以测试一下是否可行

SQL code
*-- 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 

热点排行