如何获得其他应用程序上的某个控件如EDIT的值呢?(100分)

  • 主题发起人 主题发起人 foxnt
  • 开始时间 开始时间
F

foxnt

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个程序,想得到其他应用程序上的某个控件如EDIT的值,
以便进行分析。
请问有高人会吗?
有人提示可用钩子做。
愿听其详。
 
如果你知道了,可别忘了告诉我哟
 
用spy++或Winsight32就可以看到
 
function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer; stdcall;
可得Edit中的字串。
 
用“取词”检索一下,可得很多答案。
 
to croco:
这个函数对 edit 没用,得用 WM_GETTEXT,

to foxnt:
先找到另一个程序的主窗口 FindWindow,然后 EnumChildWindows
找到 edit 的句柄,然后发上面那个消息就可以了。
 
to SuperMMX:
怎么没用呢?我试过的可以。
 
小弟笨笨,
SUPERMMX兄能否举个例子?
 
我也用过,没成功,WM_GETTEXT 可以,
根据 msdn, 说, GetWindowText 不能取 Edit 的。

例子已经很多了,在这里查一下。
 
各位大虾把源程序贴出来好吗?
SuperMMX 兄的说法我听说过,但我没试成功。
 
这个问题试了很多次也没通过
学习~~
 
不会吧,可以的,下次来贴上。
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function MyProc(Handle: hwnd; lParam: LParam): boolean; stdcall;
var
s: string;
begin
SetLength(s, 100);
GetClassName(Handle, PChar(s), 100);
if Pos('EDIT', UpperCase(s)) > 0 then
begin
SetLength(s, 200);
SendMessage(Handle, WM_GETTEXT, 200, LongInt(S));
Form1.Memo1.Text := s;
end;
Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
h: THandle;
begin
h := FindWindow(PChar('Notepad'), nil);
EnumChildWindows(h, @MyProc, 0);
end;

end.

已经有人贴过了,我也贴过,
 
不好意思:
SUPERMMX:您的方法是对的。但我是想:
对任意的程序都可得到他上面的EDIT的值。
我看过一些程序,VB写的。
他可对任意的程序都可得到他上面的EDIT的值。
然后加以分析。
指定是写字板当然可用FindWindow(PChar('Notepad'), nil);
但我若是不知道该程序是什么,那该如何写呢?
 
这个可在MouseMove事件中实现,代码如下,我很早以前就试成功了,
但操作时,要在Form中按下鼠标左键不放(记住,不要放开),然后移到要其值的EDIT上面,就成了。
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var hWnd:THandle;
str:PChar;
mPoint:TPoint;
begin
GetCursorPos(mPoint);
hWnd := WindowFromPoint(mPoint);
if hWnd<>0 then
begin
try
GetMem(str,100);
SendMessage(hWnd, WM_GETTEXT, 100, Longint(str));
if str<>'' then Edit1.Text:=str;
finally
FreeMem(str,100);
end;
end;
end;
 
to SuperMMX:
你是对的,我取到的只是Edit的初值。
to foxnt:
想作屏幕取词还是其它?
 
我的只是举个例子,看来大家都很懒呀。

你的所谓的任意的程序是什么意思?是一下子全找出来
还是怎么样?
如果想得到全部,再加上 EnumWindows
 
Slong答的正确。
SUPERMMX兄也不错。
给你门分吧。
 
多人接受答案了。
 
后退
顶部