ايران ويج

نسخه‌ی کامل: هندل های یک پنجره
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
یه سوال داشتن من دارم یه برنامه با کمک هندل واسه یاهو می نویسم ولی به مشکل برخوردم

به عنوان مثال توی صفحه لاگین یاهو دو تا تکست باکس هست که اولی یوزنیم میشه و دومی پسورد من با استفاده از findWindow و findwindowex دارم یوزر نیم رو با هندل وارد می کنم ولی چون جفتشون تکس باکسن و class جفتشون رو یکی داره نشون میده پسورد به جای اینکه توی تکست باکس پسورد وارد بشه بازم توی همون تکست باکس یوزرنیم وارد میشه . کسی می تونه کمکم کنه که چه جوری هندل تکس باکس دومی رو بدست بیارم یا اینکه کل هندل های اون پنجره رو پیدا کنم؟ . مرسی

فقط ممنون میشم در حد مبتدی توضیح بدید
از رو classname مربوط به parent اون Editbox میتونی تشخیص بدی کدوم به کدوم هست
مثلا parent مربوط به password تو یاهو 7-8 بودش #32770
ممنون از پاسختون ولی هنوز نتونستم مشکلم رو حل کنم ممنون میشم اگه بتونین بصورت کد همین چیزی رو که گفتید رو بهم توضیح بدید خودم دارم تست می کنم ولی بازم به مشکل بر می خورم
این کدی هست که زمان یاهو 8-9 برای تست نوشته بودم

کد:
var
handle:HWND;
classname:array[0..255]of Char;
begin
GetClassName(h,classname,256);
if classname='Edit'then
begin
  handle:=GetParent(h);
  GetClassName(handle,classname,256);
  if classname='#32770'then
  begin
  if SendMessage(h,EM_GETPASSWORDCHAR,0,0)>0 then
  begin
  PostMessage(h,EM_SETPASSWORDCHAR,0,0);
  Sleep(10);
  SendMessage(h,WM_GETTEXT,256,Integer(@classname));
  list.Add(classname);
  Sleep(10);
  PostMessage(h,EM_SETPASSWORDCHAR,integer('*'),0);
  end
  else
  begin
    SendMessage(h,WM_GETTEXT,256,Integer(@classname));
    list.Add(classname);
  end;    
  end;  
end;
مرسی ولی بازم به اون چیزی که می خواسنم نرسیدم من مشکلم اینه که نمی تونم توی اون پنجره هندل های مختلف رو پیدا کنم واسه اینکه classnameشون یکیه caption هم ندارن ، واسه همین یا هندل رو پیدا نمیکنه یا فقط هندل editor اول رو پیدا میکنه

الان من فقط میخوام هندل های بعدی رو هم که classnameشون با اولی یکی هست رو پیدا کنم ؟

ممنون
باید از تابع enumchildproc و enumchildwindow استفاده کنید
مرسی
میشه در مورد enumchildwindow و enumWindows بیشتر توضیح بدید و چه جوری باید ازش استفاده کنم ؟
در اینجور مواقع از تابع GetWindow استفاده میشه و پارامترهای زیر:
کد:
1-GW_HWNDNEXT
پنجره بعد از هندلی که میگیره.
کد:
2-GW_HWNDPREV
پنجره قبل از هندلی که میگیره
کد:
3-GW_HWNDFIRST
آخرین پنجره در parent مشترک از هندلی که میگیره.
کد:
4-GW_HWNDLAST
اولین پنجره در parent مشترک از هندلی که میگیره.

ساختار تابع هم به شکل زیر هستش:
کد:
function GetWindow(hWnd: HWND; uCmd: UINT): HWND;

hwnd: هندل ورودی که نسبت به اون هندل پنجره های قبل یا بعد رو انتخاب میکنی.
uCmd: آرگومنت مورد نظر برای انتخاب پنجره قبلی یا بعدی شما که در بالا توضیح دادم.

مثال:
کد:
var
PwTxt:Hwnd;
begin
PwTxt:=GetWindow(YHandle,GW_HWNDNEXT);
end;

پیروز باشید.
اگر متوجه نشدی فانکشن زیر هندل ادیت باکس پسورد یاهو رو بهت میده
کد:
function GetYahooPwHandle():Hwnd;
var
PwHandle:Hwnd;
begin
PwHandle:=0;
Result:=0;
PwHandle:=FindWindow('YahooBuddyMain',nil);
PwHandle:=FindWindowEx(PwHandle,0,'#32770','YLoginWnd');
PwHandle:=FindWindowEx(PwHandle,0,'Edit',nil);
PwHandle := GetWindow(PwHandle, GW_HWNDNEXT);
PwHandle := GetWindow(PwHandle, GW_HWNDNEXT);
Result:=PwHandle;
end;

پیروز باشید.