PDA

View Full Version : یافتن هندل آبجکت های یک window و کنترل آنها



ali190
دوشنبه 08 شهریور 1389, 15:52 عصر
با سلام و عرض خسته نباشيد و با آرزوي قبولي طاعات و عبادات همه شما عزيزان
از مدیران و دست اندرکاران این سایت پرمحتوا خواهش میکنم لطفاً این تایپیک رو حذف نکنند و اجازه بدند که جواب سئوالاتم روبگیرم(ممنون و متشکر)
براي تحت كنترل درآوردن يك پنجره ، فرم ابتدا بايد handle اون پنجره رو يافت كه براي پيدا كردن handle اون پنجره از تابع findwindow استفاده ميكنيم.
بعد از يافتن handle برنامه ميتوانيم با استفاده از تابع sendmessage و postmessage با ارسال پارامترهايي به اون handleمورد نظر اون پنجره رو كنترل كنيم.
دوسئوال:
1)آرگومان دوم تابع sendmessage شامل چه دستورات و پارامترهايي ميشود؟
2)آرگوان دوم و سوم تابع sendmessage چيست؟
در مرحله بعد (بعد از يافتن handle پنجره (فرم والد) نوبت به كنترل آبجكتها و اشياء فرزند اين فرم يا پنجره ميرسد
3) چطور ميتونم handle تمام اشياء داخل يك پنجره رو پيدا كنم؟
4) بعد از يافتن handle آن آبجكت آيا باز هم توسط دستور sendmessae بايد نسبت به كنترل آن اقدام نمود؟
5)آيا ليست پرامترهاي آرگومان دوم اين تابع در كار با اشياء تغيير ميابد؟
6) فرض كنيد يك برنامه داراي يك منو است ، آيا با استفاده از اين متدها ميتوان كنترل كامل منوي يك برنامه را نيز در اختيار گرفت و دستوری رو از منو اجرا کرد؟]یا این مسئله در مورد منوهای ribbon (مثل منوی اکسل یا ورد 2007) هم صادق هست؟
ميشه ازتون خواهش كنم در مورد 6 سئوال بالام يك مثال كامل رو لطف كنيد تا تمامي موارد بالا تحت پوشش قرار بده
مثلاً در مورد كار با نرم افزار word2007
كه ابتدا اين نم افزار باز بشه(شي والد)
سپس يك متن ساده در اين برنامه تايپ بشه (مثلاً توسط تابع sendkeys يا sendmessage )
بعد از تايپ متن هم با ارسال پرامترهايي به اشياء فرزند نرم افزار word (مثلا دستور select all ) كل متن تايپ شده به حال انتخاب درآيد ورنگ متن قرمز شود و سپس پنجره pge setup‌گشوده شود و top ، left ، right و buttom كاغذ (براي همگي آنها ) 5cm ست شود.
دست آخر هم از صفحه پرينت گرفته شود. ونرم افزار فايل word در صفحه دسكتاپ ذخيره شود.
ميخواستم بدونم آيا اين خواسته توسط كار با handle ها امكان پذير هست يا اين خواسته فرارتر از حد توان handle هاست.
ممنون و متشكر

Felony
سه شنبه 09 شهریور 1389, 05:49 صبح
1)آرگومان دوم تابع sendmessage شامل چه دستورات و پارامترهايي ميشود؟
شامل تمامی پیغام های ویندوز ( التبته اونهایی که اجاره دسترسی بهش رو دارید ) ؛ در این لینک (http://wiki.winehq.org/List_Of_Windows_Messages) میتونید مشاهده کنید .


2)آرگوان دوم و سوم تابع sendmessage چيست؟
از این 2 تابع با نام LParam و RParam یاد میشه ، به وسیله این 2 پارامتر میتونید اطلاعاتی رو به هندل مورد نظر بفرستید یا ازش بگیرید .


در مرحله بعد (بعد از يافتن handle پنجره (فرم والد) نوبت به كنترل آبجكتها و اشياء فرزند اين فرم يا پنجره ميرسد
3) چطور ميتونم handle تمام اشياء داخل يك پنجره رو پيدا كنم؟
به وسیله تابع FindWindowEX ، این تابع هندل والد رو میگیره و به دنبال Class و Title مورد نظر شما در محدوده همون والد میگرده .


4) بعد از يافتن handle آن آبجكت آيا باز هم توسط دستور sendmessae بايد نسبت به كنترل آن اقدام نمود؟
بله .


6) فرض كنيد يك برنامه داراي يك منو است ، آيا با استفاده از اين متدها ميتوان كنترل كامل منوي يك برنامه را نيز در اختيار گرفت و دستوری رو از منو اجرا کرد؟]یا این مسئله در مورد منوهای ribbon (مثل منوی اکسل یا ورد 2007) هم صادق هست؟
بله .

در ویندوز تمام کارهایی که انجام میدید ، از کلیک گرفته تا ... همه و همه توسط ارسال و دریافت پیغام ها مدریت و اجرایی میشه ، پس به وسیله پیغام ها میتونید این کارهایی که گفتید رو انجام بدید ، چون خود ویندوز هم از همین روش استفاده میکنه ولی در مورد کارایی که شما میخوای انجام بدی کمی سخت و غیر فنی هست !

این لینک (http://msdn.microsoft.com/en-us/library/ms644927(VS.85).aspx)هم مربوط به MSDN .

ali190
سه شنبه 09 شهریور 1389, 15:41 عصر
باسلام
ممنون از مجتبی تاجیک (http://barnamenevis.org/forum/member.php?u=63881) عزیز به خاطر توضیحاتتون
جناب مجتبی تاجیک (http://barnamenevis.org/forum/member.php?u=63881) من میخواستم یک مقدار از بحثهای تئوری خارج بشم و توسط یک sample یا فایل نمونه درک عمیق تری نسبت به این مسئله پیدا کنم
میشه ازتون یک خواهش کنم در یک مثال ساده توضیح بدید چطور میتونم ابتدا هندل یک شئی والد رو پیدا کنم و بعد چطور میتونم ندل آبجکتهاشو پیدا کنم
من میدونم در مثلاً ماشین حساب ویندوز یک textbox وجود داره که توش محاسبات نمایش داده میشه اما نمیدونم اسمش (هنگام طراحی) چی بوده و چی هست تا بتونم از طریق اون به هندلش دسترسی پیدا کنم.


از این 2 تابع با نام LParam و RParam یاد میشه ، به وسیله این 2 پارامتر میتونید اطلاعاتی رو به هندل مورد نظر بفرستید یا ازش بگیرید .

این پارامترها شامل چه پیغامهاییست و چه بازخوردهایی از برنامه میگیرد؟

به وسیله تابع FindWindowEX ، این تابع هندل والد رو میگیره و به دنبال Class و Title مورد نظر شما در محدوده همون والد میگرده .

چطور از هندل یک شئی والد ، فرزندش رو پیدا میکنیم(مثلاً همین برنامه ماشین حساب)
من که نمیدونم اسم تک تک دکمه ها و منوهاش چیه تا بتونم بهشون دسترسی داشته باشم.



در ویندوز تمام کارهایی که انجام میدید ، از کلیک گرفته تا ... همه و همه توسط ارسال و دریافت پیغام ها مدریت و اجرایی میشه ، پس به وسیله پیغام ها میتونید این کارهایی که گفتید رو انجام بدید ، چون خود ویندوز هم از همین روش استفاده میکنه ولی در مورد کارایی که شما میخوای انجام بدی کمی سخت و غیر فنی هست !

میشه ازتون خواهش کنم یک مثال ساده برام بزنید که بتونم کار با اشیاء فرزند یک شیئ ، دسترسی بهش ، انواع فرستادن پیغم و گرفتن پیام و خلاصه کار با منوها و ... رو درش مشاهده کنم
ممنون میشم ازتون

Felony
سه شنبه 09 شهریور 1389, 16:29 عصر
جناب مجتبی تاجیک من میخواستم یک مقدار از بحثهای تئوری خارج بشم و توسط یک sample یا فایل نمونه درک عمیق تری نسبت به این مسئله پیدا کنم
میشه ازتون یک خواهش کنم در یک مثال ساده توضیح بدید چطور میتونم ابتدا هندل یک شئی والد رو پیدا کنم و بعد چطور میتونم ندل آبجکتهاشو پیدا کنم
من چندان با VB اشنایی ندارم ، اگر نمونه کد دلفی رو میتونید به VB تبدیل کنید براتون قرار بدم در غیر این صورت دوستان دیگه میتونن کمکتون کنن .


این پارامترها شامل چه پیغامهاییست و چه بازخوردهایی از برنامه میگیرد؟
پیغام نیست ، باید یک متغییر رو Typecast کنید و به عنوان پارامتر LParam یا RParam به توابع SendMessage یا PostMessage ارجاع بدید مثلا :
var
Str: String;
begin
Str:= 'Sample Text';
SendMessage(Handle, WM_SetText, 0, Integer(Str));
end;
در کد بالا عنوان پنجره ای که هندلش به تابع SendMessage به عنوان پارامتر اول فرستاده شده به Sample Text تغییر پیدا میکنه .


چطور از هندل یک شئی والد ، فرزندش رو پیدا میکنیم(مثلاً همین برنامه ماشین حساب)
من که نمیدونم اسم تک تک دکمه ها و منوهاش چیه تا بتونم بهشون دسترسی داشته باشم.
برنامه های آماده برای این کار هست ، یه برنامه قبلا نوشته بودم که این کار رو میکرد ( نام کلاس و عنوان پنجره یا کنترلی که اشاره گر موس روش قرار داره رو نشون میداد ) که براتون ضمیمش کردم .


میشه ازتون خواهش کنم یک مثال ساده برام بزنید که بتونم کار با اشیاء فرزند یک شیئ ، دسترسی بهش ، انواع فرستادن پیغم و گرفتن پیام و خلاصه کار با منوها و ... رو درش مشاهده کنم
ممنون میشم ازتون
یه نمونه کد در زیر آوردم ( البته به زبان دلفی هست ولی تبدیلش کار سختی نیست ) :

var
Hand: THandle;
begin
Hand:= FindWindow('TForm1', 'Main Form');
Hand:= FindWindowEx(Hand, 0, 'TEdit', 'ED_UserName');
end;
کد بالا هندل مربوط به شئ Edit ی که اسمش ED_UserName هست و روی فرم Main Form قرار داره رو به دست میاره ، به قسمت های قرمز شده از کد دقت کنید ، ابتدا هندل فرم مورد نظر توسط تابع FindWindow پیادا شده بعد به عنوان هندل والد به تابع FindWindowEX داده شده تا این تابع داخل محدوده این والد به دنبال کنترل مورد نظر شما بگرده ؛ در ضمن دقت داشته باشید که اگر مثلا بخواهید هندل یک Edit تو یه برنامه رو پیدا کنید و اون ادیت خودش داخل یک پنل باشه باید به ترتیب هندل ها رو به دستن بیارید یعنی :
1- پیدا کردن هندل Form با تابع FindWindow
2- پیدا کردن هندل Panel با تابع FindWindowEX ، هندل فرم باید به عنوان والد در نظر گرفته شود .
3- پیدا کردن هندل Edit با تابع FindWindowEX ، هندل Panel باید به عنوان والد در نظر گرفته شود .

موفق باشید .

ali190
سه شنبه 09 شهریور 1389, 18:31 عصر
سلام
میشه ازتون خواهش کنم یک مثال کاربردی تر از کار با اشیاء یک پنجره و نحوه کنترل اونها بری فهم بهتر و بیشتر برام بیارید؟
ممنون میشم ازتون

ali190
دوشنبه 15 شهریور 1389, 16:48 عصر
باسلام
برای درک و فهم بهتر این قضیه میخواستم ازتون خواهش کنم یک مثال خوب در این زمینه برام قرار بدید تا بتونم مطلب رو بگیرم
ممنون

programer1389
سه شنبه 16 شهریور 1389, 12:22 عصر
Private Sub Command2_Click()
Dim MainClass As Long
Dim ChildClass As Long
MainClass = FindWindowa("SciCalc", vbNullString)
ChildClass = FindWindowExa(MainClass, 0&, "Edit", vbNullString)
MsgBox ChildClass ' Message Handle
ret = SendMessageByString(ChildClass, WM_SETTEXT, 0, Text1.Text)
End Sub
نمونه برای کار با ماشین حساب ویندوز