2009年,×××交易契税实行新的政策,在系统录入的时候,需要实现交易价格和基准交易价格进行比对。但契税软件是VB程序开发的,已经很久没有更新,也没有源代码。要实现该功能,只能通过外挂的方式实现。
主要思路是用hook原系统的录入界面,当输入交易价格的时候,通过热键呼叫外挂软件,进行基准价格比对。比对过程需要读取原系统界面上的录入信息,并根据这些信息,如房屋朝向、楼层、建造年份、区域等综合因素查询事先录入数据库的基准价格,比对计算。大于等于基准价格的保留原价格,小于基准价格的,把外挂查询的总价发送到原系统录入界面的相应控件。
主要程序代码如下:
procedure TFrmMain.tm1Timer(Sender: TObject);
var
hts, hw: LongInt;
lsh: string;
buffer:array[0..255] of char;
begin
//cooling qq:21156410 http://xu-laoshi.cn
//判断
hw := FindWindow(nil, '契税纳税申报');
hts := FindWindow(nil ,'提示');
if (hw <> 0) then
begin
if hts <> 0 then
begin
//取流水号
ClearList1;
EnumChildWindows(hts, @EnumChildWndProc1, 0);
SendMessage(LongInt(List1.Items[n_lsh]^), WM_GETTEXT, 255, longint(@buffer));
lsh := buffer;
lsh := Copy(lsh, 9, 15);
savexz(lsh);
end;
end else
begin
tm1.Enabled := false;
if self.Visible then self.Visible := false;
end;
end;
procedure TFrmMain.btQdClick(Sender: TObject);
var
buffer:array[0..255] of char;
pgj, cjj: real;
pgjstr, cjjstr: String;
begin
//发送到vb程序
SendMessage(LongInt(List.Items[c_cjj]^), WM_GETTEXT, 255, longint(@buffer));
try
cjjstr := buffer;
if cjjstr = '' then cjjstr := '0';
cjj := strToFloat(cjjStr);
pgjstr := edZj.Text;
if pgjstr = '' then pgjstr := '0';
pgj := strToFloat(pgjstr);
if cjj > pgj then
begin
pgj := cjj;
end;
except
exit;
end;
pgjstr := Format('%.2f', [pgj]);
SendMessage(LongInt(List.Items[c_pgj]^), WM_SETTEXT, 0, longint(pgjstr));
Self.Visible := false;
tm1.Enabled := true;
end;