悬奖 1139 分!想请前辈帮忙想想。如果这个问题解决了,以后扩展某些无源码的程序就方便多了。 (对这问题感兴趣的请UP一下) (100分)

  • 主题发起人 主题发起人 Pc 狂迷
  • 开始时间 开始时间
To xwchen0:
如果方便的话,请到 http://www.mmkeji.com/temp/demo.zip 下一个帮忙看一下。
 
看过了老弟的demo.zip。我很糊涂。
1)TF_sfdj即收费类,无权利自己释放自己,谁创建和调用之,该由谁来释放之;明显的原因是
TF_sfdj在释放之前,它的创建可能需要某些特殊处理,如你目前的要求;
2)我的示例
procedure TForm1.Button1Click(Sender: TObject);
var
frm:TF_sfdj;
frmshowcnt,moneys:integer;
begin
{
MessageDlg('要捕捉的是下一个 Form ,最好能获得“应收现金金额”中的内容,谢谢.',mtInformation ,[mbOk],0);
Application.createform(TF_sfdj,F_sfdj);
F_sfdj.edit5.text:= '888.00';
F_sfdj.Showmodal;
}
try
frm:=TF_sfdj.Create(self);
frm.ShowModal;
finally
inc(frmshowcnt);
moneys:=strtoint(frm.Edit6.Text);
frm.Free;
//freeandnil(frm);
end;
end;
3)说明:还是老问题
a.如果你用临时变量:永远只能临时取得一定生命周期内的次数和金额;
b.如果你要求的是该记费窗体的全部信息,必须存储之,至于是ini文件还是database则看你的需求而定;
c.建议以后发问:最好说清楚点,否则你不可能迅速得到钟意的答复。我也不会再在该类问题上浪费时间。
祝你好运。
 
现在提到1018分,另注: DemoB 是不可以修改的。大侠们帮帮忙吧!
 
很厉害哦,可惜我还没看,我马上看看,或许能得分哦!
 
你可以试试这样做!
前提是这个Edit内容的变量不是动态的每次打开窗口在内存中的位置都一样,
改变Edit中的内容,用金山游侠一类的软件搜索该Edit内容的变量的内存地址。
是数值的话按数值搜索,要是字符串的话则按串搜索。
得到地址后用OpenProcess,ReadProcessMemory等函数读该地址的值,就行了
 
前几天刚好做过,我在ID=1187288帖里谈的比较详细,你去看看,里面还有一个小工具的
源码,对调试这类程序很有帮助。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
EditNo: integer;
fTextHandle: HWND;
implementation
{$R *.DFM}
function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
bufClass: array[0..255] of Char;
bufstr:array[0..255] of Char;
begin
Result := True;
GetClassName(hwnd,bufClass,256);
if StrPas(BufClass)='TEdit' then
begin
inc(EditNo);
if EditNo=3 then //你关心的Edit序号=3
begin
GetWindowText(hwnd,bufstr,100);
form1.memo1.lines.add(strpas(bufstr));
PInteger(lparam)^ := hwnd;
Result:=False;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Handle: Integer;
tmpHandle: Integer;
begin
Handle:=0 ; tmpHandle:=0;
EditNo:=0;
Handle := FindWindow(nil,'收费窗口');
if Handle<>0 then
begin
EditNo:=0;
tmpHandle := Handle;
EnumChildWindows(tmpHandle,@GetEditHandle,Integer(@tmpHandle));
end;
end;
end.
 
麻烦你把程式改成程序,我听见这个自演就烦。
 
对收费窗口的弹出计数,我没有好方法。不过,如果通过鼠标拖拽得到窗体的handle,
倒是还好实现。以下程序可以得到能拖拽的窗体(包括TEdit)handle。不妨参考一下。
==============
project1.dpr
==============
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

==============
unit1.pas
==============
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
StatusBar1: TStatusBar;
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
MousePoint : TPoint;
PassWordHwnd : Hwnd;
PassWordContent : array [0..255] of char;
begin
MousePoint := Self.ClientToScreen(point(x,y));
PassWordHwnd := WindowFromPoint(MousePoint);
if (GetWindowLong(PassWordHwnd,GWL_STYLE) and es_password ) = 0 then
begin
StatusBar1.Panels[0].Text := '不是有效的密码框!';
end;
SendMessage( PassWordHwnd, WM_GETTEXT, 100, LongInt(@PassWordContent));
Edit1.Text := PassWordContent;
Edit2.Text := IntToStr(PassWordHwnd);
MessageBeep(0);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
StatusBar1.Panels[0].Text := '正在查询...';
end;

end.
 
用HOOK进入DemoB进程,截获WM_SHOWWINDOW,WM_CLOSE,WM_DESTROY等消息,
判断窗口类或标题是不是所要监视的窗口(收费窗口),是则记录之!(根据
消息判断是打开还是关闭)
至于应收现金金额,都已经到DemoB的进程空间了,不要说得到它的值,就是
修改它都可以了!
 
问题尚未解决,散分结贴。
 
多人接受答案了。
 
感谢天真的帮助,共1372分 在以下 6 贴中送出。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1213258
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1213260
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1213262
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1213264
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1213268
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1213270

 
后退
顶部