annibaobei 发表于 2009-7-19 15:31

操纵其他程序的SysDateTimePick32 

因为最近在写操作同花顺的程序,遇到了一个难题。同花顺是MFC程序,操作起来比较困难,特别是修改时间的操作。写了一段代码,成功。
主体代码并不是我写的,原代码运行会出错,我修改了几个地方,可以正常执行了。为方便和我一样遇到类似问题的朋友,特将代码贴在这里。

procedure TForm1.Button1Click(Sender: TObject);
var   
Mwd,Cwd: LongInt;
st: TSystemTime;
pid,phd: thandle;
p: pointer;
l: dword;
b: boolean;
begin   
Mwd := h;// (h是父窗口句柄,事先取不赘述)

GetWindowThreadProcessId(mwd, pid);
phd := openprocess(PROCESS_ALL_ACCESS, true, pid);
VirtualAllocEx(phd,p,sizeof(st), MEM_COMMIT, PAGE_READWRITE);
if p = nil then
begin
    ShowMessage('error1');
    exit;
end;
l:=0;

Cwd := FindWindowEx(Mwd, 0, 'SysDateTimePick32', nil);

DateTimeToSystemTime(Date-6, st);
b:=WriteProcessMemory(phd, p, @st, sizeof(st), l);
if (not b) and (l<>sizeof(st)) then
begin
    ShowMessage('error2');
    exit;
end;
PostMessage(cwd, DTM_SETSYSTEMTIME, GDT_VALID, longint(p));

CloseHandle(phd);// 这两行是重点,必须有
p := nil;

end;   

说明:使用上面的代码操作时,一定不能动态申请内存,比如控件的hint之类,必须事先在全局变量中定义变量,让系统为变量事先分配内存,否则出错。

blowfish 发表于 2009-7-19 15:46

lz,原来是同行阿。。。。。。。。。。

你还在用delphi吗?你们干活用什么。我用delphi很多年了,最近几年单位主要用.net,(vb ,c#),可惜了我的delphi了。

*MM*Cat 发表于 2009-7-19 22:40

挖神啊~~~~~~~~~~~~

annibaobei 发表于 2009-7-20 08:04

俺有个朋友搞这个的,俺偷偷转来了!:em25:

urmygod 发表于 2009-7-21 17:08

女人玩儿delphi
少见少见~~~~~~~~~~~~~~~~~~~~~~~
页: [1]
查看完整版本: 操纵其他程序的SysDateTimePick32