操纵其他程序的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之类,必须事先在全局变量中定义变量,让系统为变量事先分配内存,否则出错。 lz,原来是同行阿。。。。。。。。。。
你还在用delphi吗?你们干活用什么。我用delphi很多年了,最近几年单位主要用.net,(vb ,c#),可惜了我的delphi了。 挖神啊~~~~~~~~~~~~ 俺有个朋友搞这个的,俺偷偷转来了!:em25: 女人玩儿delphi
少见少见~~~~~~~~~~~~~~~~~~~~~~~
页:
[1]