PDA

View Full Version : سوال: چظور بدون دونستن نام کلاس برنامه دیگری یه متن رو تو یه Edit از اون برنامه بریزیم؟



mbshareat
دوشنبه 16 اسفند 1389, 01:26 صبح
سلام علیکم
من می خوام متنی رو داخل Edit برنامه دیگری بریزم که تو اون برنامه متن داده شده من رو جستجو کنم.
اما نه نام پنجره رو می دونم نه نام Edit رو فقط می دونم عنوان پنجره چیه!
آیا چنین کاری امکان داره؟
مثلا من متنی رو از فایل خوندم و می خوام تو برنامه دیگه ای که همزمان در حال اجراست ببینم این متن کجای فلان کتاب اومده! تنها چیزی که میدونم اینه که عنوان پنجره چیه!
آیا میشه چیزی مثل Components داشت که تمام عناصر برنامه دیگه رو بررسی کرد که از چه نوعی هستند و بعد اگه از نوع Edit بود متن رو برای Text اون تنظیم کرد؟

Felony
دوشنبه 16 اسفند 1389, 09:16 صبح
چرا کلاس رو ندارید ؟
اگر کمی وقت بزارید و دقت کنید میبینید که تابع FindWindow میتونه پارامتر nil قبول کنه ، مقدار کلاس رو nil پاس بده و عنوان مورد نظر رو هم که داری .

mbshareat
دوشنبه 16 اسفند 1389, 19:17 عصر
سلام علیکم و رحمة الله و برکاته
جناب استاد تاجیک با اجازه شما من برنامه شما رو که برای تغییر محتوای یک Edit از برنامه دیگر بود تغییرات کوچکی دادم:
دو عنصر به فرم اضافه کردم SpinEdit1 و Edit2.
اسم فرم برنامتون My Application بود من کد شما رو اینطور تغییر دادم:



procedure TForm1.Button1Click(Sender: TObject);
var
Hand: THandle;
begin
Hand:= FindWindow(nil, 'My Application');
Hand:= FindWindowEx(Hand, SpinEdit1.Value, 'TEdit', nil);
SendMessage(Hand, WM_SETTEXT, 0, Integer(Button1.Caption));
end;

حالا وقتی مقدار SpinEdit1 صفره و Button1 رو فشار می دم متن Edit2 تغییر میکنه و با تغییر مقدار SpinEdit1 هم نمی تونم Edit1 که شما گذاشتین دستکاری کنم.
با کد بالا اصلا نمی تونم متن Edit1 رو که شما روی فرم گذاشته بودین بعد از اضافه کردن Edit2 خودم دستکاری کنم!
من برای کار خودم نمی دونم کدوم Edit رو باید دستکاری کنم!
تو صفحه برنامه دیگری که امکان جستجو داره سه کادر متن هست که البته مطمئن هم نیستم از نوع TEdit باشند چون ممکنه قسمتی از کامپوننت سفارشی باشند.
میشه برنامتون رو طوری تغییر بدین که متن هر کدوم از Edit ها رو که بخوایم بتونه تغییر بده؟
در ضمن آیا میشه لیستی از نام کامپوننتهای برنامه دیگر همراه نوع اونها به دست اورد که اون وقت بفهمم روی کدوم کامپوننت باید کار کنم؟
(همانطور که با Self.Components میشه این لیست رو برای برنامه خودمون داشته باشیم)
---خیلی خیلی از لطف و عنایت شما متشکرم.

Felony
دوشنبه 16 اسفند 1389, 22:50 عصر
این کد شما هست :

var
Hand: THandle;
begin
Hand:= FindWindow(nil, 'My Application');
Hand:= FindWindowEx(Hand, SpinEdit1.Value, 'TEdit', nil);
SendMessage(Hand, WM_SETTEXT, 0, Integer(Button1.Caption));
end;

خدایی توقع چه کاری رو دارید ؟!
SpinEdit از کلاس TSpinEdit مشتق شده نه TEdit ، پارامترهای اون تابع FindWindowEX رو هم بخونید بعد بهش چیزی رو پاس بدید ، به جای پارامتر Child مقدار داخل SpinEdit رو به تابع پاس دادید ، این یعنی چی ؟!

کد رو به صورت زیر بنویسید :

var
Hand: THandle;
begin
Hand:= FindWindow(nil, 'My Application');
Hand:= FindWindowEx(Hand, 0, 'TSpinEdit', nil);
SendMessage(Hand, WM_SETTEXT, 0, Integer(Edit1.Text));
end;

یک برنامه هم قبلا نوشته بودم که ضمیمه کردم که نام کلاس و عنوان و هندل کنترلی که نشانه گر موس روش قرار داره رو بهتون میده .

mbshareat
دوشنبه 16 اسفند 1389, 23:33 عصر
سلام علیکم
آقا خدا حفظتون کنه باز اشتباه از من بود.من هنگام بررسی یه Edit دیگه هم تو برنامم گذاشته بودم نمی دونم چی شده که الان تو برنامم نیست.
من دو تا Edit گذاشته بودم و فکر می کردم مقدار صفر برای تابع FindWindowEx شماره کنترل روی فرمه!!!
مقصود من هم این نبود که SpinEdit رو دستکاری کنم ولی خداییش پارامترها رو از Help بررسی نکرده بودم.
راستش من یه کم گیج شدم چرا به Edit هم Window گفتن؟(FindWindowEx)
با اجازه شما دو تا سوال سر راست دارم:
1.اگه تو برنامه دوتا Edit و دوتا Button که هر کدوم بخوان مقدار Caption خود رو تو Edit مربوط به خودشون بریزن چطور باید برای Button1 و Button2 کد نوشت؟
2.آیا راهی هست که برنامم بدون بردن اشاره گر ماوس روی کنترلهای برنامه دیگه لیستی از کنترلهای برنامه دیگه رو به من بده؟(مثل Components)
اگه دوست داشتین و حوصله داشتین لطفا من رو راهنمایی کنین.

Felony
سه شنبه 17 اسفند 1389, 13:05 عصر
1.اگه تو برنامه دوتا Edit و دوتا Button که هر کدوم بخوان مقدار Caption خود رو تو Edit مربوط به خودشون بریزن چطور باید برای Button1 و Button2 کد نوشت؟
به صورت زیر :
دکمه 1 :
var
Hand: THandle;
begin
Hand:= FindWindow('TForm1', 'Form1');
Hand:= FindWindowEx(Hand, 0, 'TEdit', nil);
Hand := GetWindow(Hand, GW_HWNDNEXT);
SendMessage(Hand, WM_SETTEXT, 0, Integer(Button1.Caption));
end;

دکمه 2 :
var
Hand: THandle;
begin
Hand:= FindWindow('TForm1', 'Form1');
Hand:= FindWindowEx(Hand, 0, 'TEdit', nil);
SendMessage(Hand, WM_SETTEXT, 0, Integer(Button2.Caption));
end;


2.آیا راهی هست که برنامم بدون بردن اشاره گر ماوس روی کنترلهای برنامه دیگه لیستی از کنترلهای برنامه دیگه رو به من بده؟(مثل Components)
باید از تابع EnumChildWindow که یک Callback Function هست استفاده کنید ، یک نمونه براتون نوشتم که میتونید از ضمیمه دریافت کنید .

mbshareat
یک شنبه 22 اسفند 1389, 16:29 عصر
سلام
ببخشید من چند روز مسافرت بودم نتونستم تشکر کنم.
آقای تاجیک من کد شما رو کمی تغییر دادم و این خط رو

APPHandle:= FindWindow(Pchar(ED_ClassName.Text), Pchar(ED_Title.Text));
به این شکل

APPHandle:= FindWindow(nil, Pchar(ED_Title.Text));
تغییر دادم.خودم یه برنامه داشتم امتحان کردم خوب جواب داد اما در مورد برنامه دیگری که مد نظرم بود (برنامه جامع الاحادیث) که احتمالا پر از کمپوننت سفارشیه
از نام کلاهای اشیای فرم و Caption اونها نتونستم بفهمم چه چیزی رو باید دستکاری کنم.
جای تعجبه که برنامه Handle Viewer که تو همین تاپیک گذاشتید کمپوننت وارد کردن متن جستجو رو از نوع Edit گزارش میکنه!
این تمام اطلاعات اشیای درون برنامه Noor_2 هستش:

Handle : 132278
Class : AfxWnd42sd
Caption : CCTabWin
---------------------
Handle : 66786
Class : AfxWnd42sd
Caption : CCStatic
---------------------
Handle : 66784
Class : AfxWnd42sd
Caption : CCButton
---------------------
Handle : 66782
Class : AfxWnd42sd
Caption : CCButton
---------------------
Handle : 66780
Class : AfxWnd42sd
Caption : CCButton
---------------------
Handle : 66778
Class : AfxWnd42sd
Caption : CCButton
---------------------
Handle : 66776
Class : AfxWnd42sd
Caption : CCButton
---------------------
Handle : 66774
Class : AfxWnd42sd
Caption : CCButton
---------------------
Handle : 66772
Class : AfxWnd42sd
Caption : CCButton
---------------------

Felony
یک شنبه 22 اسفند 1389, 16:46 عصر
خوب الان مشکل چی هست ؟ مشخصات تمام اشیاء رو که دارید .

Mask
یک شنبه 22 اسفند 1389, 17:27 عصر
آقا مجتبی نمونه برنامه ای رو که گزاشتی .... هندل و کلیه خصوصیات همه پنجره هارو بر میگردونه.
پس اون ادیت که گذاشتی که کپشن برنامه رو واردش کنی به چه درد میخوره؟

mbshareat
یک شنبه 22 اسفند 1389, 18:39 عصر
سلام علیکم
من تو ادیت کپشن برنامه Noor_2 وارد می کنم(قبلا تست کردم چنین برنامه ای رو با FindWindow پیدا می کنه)
برنامه Get Other App Controls هیچ کنترلی از نوع Edit گزارش نمی کنه ولی Handle Viewer کنترل وارد کردن متن جستجو را از این نوع گزارش می کنه.
اگه نگاه کنید توی لیست گزارش Get Other App Controls تمام کنترلها از نوع AfxWnd42sd هستند و Edit توی لیست یافت نمیشه!
آقای تاجیک گرامی لطف کنین علت این امر رو بفرمایین.
اگه اون خط کد رو که گفتم دست نخورده بذارم و کلاس رو AfxWnd42sd تعیین کنم هم اینگار که اصلا اسم برنامه رو ندادم همه چیز رو گرچه تو برنامه Noor_2 نباشه لیست می کنه!

Felony
یک شنبه 22 اسفند 1389, 19:04 عصر
آقا مجتبی نمونه برنامه ای رو که گزاشتی .... هندل و کلیه خصوصیات همه پنجره هارو بر میگردونه.
پس اون ادیت که گذاشتی که کپشن برنامه رو واردش کنی به چه درد میخوره؟
تابع EnumChildWindow یک Callback Function هست و تمام اشیائی که هندل داده شده والدشون باشه لیست میکنه ، وقتی هندل نامعتبری بهش بدید میز کار رو به عنوان والد در نظر میگیره و تمام پنجره هایی که باز هستند رو لیست میکنه ، اگر هندل پنجره خاصی رو بهش بدید لیست اشیاء روی اون پنجره رو برمیگردونه پس با این حساب اون 2 تا Edit که قرار دادم یکی برای وارد کردن کلاس و دیگیری برای عنوان پنجره مورد نظر هست که قصد دارید اشیاء موجود روی اون رو به دست بیارید .


سلام علیکم
من تو ادیت کپشن برنامه Noor_2 وارد می کنم(قبلا تست کردم چنین برنامه ای رو با FindWindow پیدا می کنه)
برنامه Get Other App Controls هیچ کنترلی از نوع Edit گزارش نمی کنه ولی Handle Viewer کنترل وارد کردن متن جستجو را از این نوع گزارش می کنه.
اگه نگاه کنید توی لیست گزارش Get Other App Controls تمام کنترلها از نوع AfxWnd42sd هستند و Edit توی لیست یافت نمیشه!
آقای تاجیک گرامی لطف کنین علت این امر رو بفرمایین.
اگه اون خط کد رو که گفتم دست نخورده بذارم و کلاس رو AfxWnd42sd تعیین کنم هم اینگار که اصلا اسم برنامه رو ندادم همه چیز رو گرچه تو برنامه Noor_2 نباشه لیست می کنه!
این برنامه ای که میگید ( Noor_2 ) رو میتونید قرار بدید ؟
در هر دو برنامه ای که من نوشتم برای به دست آوردن نام کلاس از تابع GetClassName استفاده شده بنابراین نباید خروجی ها متفاوت باشه ، یه چیزی به ذهنم میرسه که باید بررسی کنم ، شما فایل اجرایی برنامه رو بدون مخلفات قرار بدید .

mbshareat
یک شنبه 22 اسفند 1389, 19:26 عصر
سلام علیکم
فایل اجرایی برنامه بدون داده مورد استفاده برنامه 1.39 مگا بایته و من اشتراک DialUp دارم.
این فایل رو توی \:C کپی کردم و اجرا کردم اجرا نشد پیغامی هم نداد.
این هم تصویر برنامه:

Felony
دوشنبه 23 اسفند 1389, 17:33 عصر
با این اطلاعات نمیشه کمک خاصی بهتون کرد .