我应当怎么样才能获得另外一个程序对话框中的两个Edit的Handle? 检索了半天什么结果都没有!(100分)

  • 主题发起人 主题发起人 ChenBoy
  • 开始时间 开始时间
C

ChenBoy

Unregistered / Unconfirmed
GUEST, unregistred user!
  用winsight32看是这样的:
  Child 0000091C {Edit} WS32.EXE (260,48)-(482,66) "Edit1"
Child 00000930 {Edit} WS32.EXE (260,72)-(482,90) "Edit2"
其他的控件如ComboBox,Button都能用FindWindow()及FindWindowEx()得到其句柄,但
是就是这两个Edit无法取得。这两个Edit的值分别是"Edit1"、"Edit2",是我为了方便分开
这两个Edit所赋的值,是不能做为FindWindowEx(Hwnd,subHwnd,className,TitleName) 中
TitleName的,因为这两个值可以变化,所以返回的句柄都是0。
  我该用什么方法才能获得这两个Edit各自的句柄呢,请高手帮帮忙吧!
 
固定titlename的值,返回的结果正确吗?
 
To yansh:
固定也是一样的,因为我的目的是要改变它,固定了也是返回句柄为0
 
这个问题是不是太难了,看了好多类似的贴子都没有一个具体的答复!
 
那我就不知道了,明天上单位试验一下[8D]
 
补充一点:好像这个程序是用VC做的。
 
这是我刚刚写的程序:
你看看
Function EnumChildProc(hwnd:HWND;lParam:LPARAM):Boolean;
(回调函数)
var
ClassName:array[0..255]of char;
L:integer;
Buf:pChar;
begin
GetClassName(hwnd,ClassName,255);
Form1.Memo1.Lines.Add('类名:'+ClassName);
L:=SendMessage(hwnd,WM_GETTEXTLENGTH,0,0);
Form1.Memo1.Lines.Add('长度:'+IntToStr(L));
GetMem(Buf,255);
SendMessage(hwnd,WM_GETTEXT,255,LongInt(Buf));

Form1.Memo1.Lines.Add('内容:'+Buf);
Form1.Memo1.Lines.Add('=============');
FreeMem(Buf);
Result:=true;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
hParent:THandle;
begin
hParent:=FindWindow(nil,pChar(Edit1.Text));
(在Edit1中输入窗体名称)
if hParent<>0 then
Memo1.Lines.Add('主窗体句柄:'+IntToStr(hParent));
EnumChildWindows(hParent,@EnumChildProc,0);
end;
 
用ChildWindowFromPointEx可以得到,hParent是窗体句柄,Point(x, y) 是控件的大约
位置,CWP_ALL表示所有控件,也可以制定只取某类控件,函数返回值为控件句柄。
ChildWindowFromPointEx(hParent, Point(x, y) , CWP_ALL);
下面是我写的一个获取别的程序edit的内容的例子
procedure TForm1.Button1Click(Sender: TObject);
var
hParent, hEdit: HWND;
u: pchar;
begin
try
hParent := FindWindow(nil, 'fromB的标题');
if hParent = 0 then
showmessage('窗口没有找到!')
else
begin
hEdit := ChildWindowFromPointEx(hParent, Point(10, 10) //大约位置
, CWP_ALL);
if hEdit = 0 then
showmessage('Edit没有找到!')
else
begin
U := StrAlloc(250);
SendMessage(hEdit, WM_GETTEXT, 249, Integer(U));
edit1.Text := Strpas(u);
end;
end;
except
end;
end;
 
  经过昨天晚上的研究,发现一个窗体内的所有实例的句柄分配好像有一定的规律,是
不是这样,我还不敢肯定,不过根据Winsight32观察,发现确实有这么一回事,试是好几次
都一样,是不是偶然呢?
  比如说,无法直接取得另一程序窗体内的几个Edit的句柄,但可以通过winsight32观察
这几个Edit与一个可以得到句柄的实例(如,Button)句柄值的差值,然后通过加减运算获
得各个Edit的句柄:
  如,HwndBtn:=FindWindowEx(ParentHwnd,0,'Button','ButtonCaption')
HwndEdit1:=HwndBtn + HwndEdit1与HwndBtn的差值(观察Winsight32可以得到)
    HwndEdit2:=HwndBtn + HwndEdit2与HwndBtn的差值(观察Winsight32可以得到)
  是不是这样呢,我还是不敢肯定,尽管我已经试了不下N遍!请教高手!
 
将鼠标移动到Edit上
procedure TForm1.Timer1Timer(Sender: TObject);
var
pMouse:TPoint;
begin
GetCursorPos(pMouse);
label1.caption := IntToStr(WindowFromPoint(pMouse));
end;
 
  根据我上面的判断,得出两个Edit的句柄,但是用
SendWindowText(HWndEdit1,'发过来了'),却老是无法改变两个Edit的内容,是不是因为
句柄找错的原因还是什么地方弄错,有没有其他更好的方法。
 
不能用SendWindowText,对edit 来说,只能用sendmessage ,wm_settext.
大家对你的回答,你好像并不在意.
 
To Yfdciom:
 不是这个意思,上面你和盛利、BDFan提供的方案还没有试过,我试试再说吧,谢谢
大家!谢谢!
   不过我的那个办法实在笨得不能再笨的办法。
 
运行通过,谢谢大家的赐教,已做笔记,再次感谢yfdciom、盛利、BDFan,分别分分!
 
多人接受答案了。
 
后退
顶部