Fa چطور x,y سایر پنجره ها را به دست بیارم؟

محمدمهدی

Well-Known Member
سلام.
چطور x,y سایر پنجره ها را به دست بیارم؟ بدونم اان چند تا پنجره توی دسکتاپ بازه و مختصاتشون چیه؟

تا اینجای موضوع معلومه که باید PID اون صفحه رو داشته باشم که از فایل tasklist.exe میگیرم اما باید بدونم که آیا پنجره داره یا نه؟ آیا minimize هست یا نه؟ x,y,w,h اون چقدر هست؟

خواهشا اگه میشه پلاگین معرفی کنید یا بنویسید یا فایلی مثل tasklist معرفی کنید که با commandline بهش دستور بدم و یه جایی اینا رو ذخیره بکنه. و یا کلا راهنمایی که با سایر برنامه ها از کدوم dll ویندوز این لیست رو دریافت می کنند؟

با تشکر!
 

the_king

مدیرکل انجمن
سوال تون رو در انجمن MMB مطرح کردید اما پاسخ مربوط به انجمن برنامه نویسی است.

توابع API زیر همگی در user32.dll قرار دارند :

با تابع ()GetDesktopWindow پنجره Desktop رو بدست می آورید. پنجره ها با یک شماره handle مشخص می شوند،
مثلا با شماره 65552
کد:
desktop = GetDesktopWindow

با استفاده از تابع ()GetWindow پنجره های فرزند این پنجره Desktop را بدست می آورید. این تابع دو پارامتر دارد
که پارامتر دوم عملکرد تابع را تعیین می کند. از GW_CHILD برای بدست آوردن اولین فرزند پنجره Desktop و
از GW_HWNDNEXT برای بدست آوردن فرزند های بعدی استفاده می کنیم. زمانی که همه فرزند ها پیدا شدند
مقدار 0 را بر می گرداند تا بدانیم دیگر فرزندی وجود ندارد.

برای بدست آوردن اولین پنجره فرزند Desktop شبه کد زیر بکار می رود :
کد:
window = GetWindow(desktop, GW_CHILD)

برای بدست آوردن پنجره های فرزند بعدی :
کد:
window = GetWindow(window, GW_HWNDNEXT)

برای هر پنجره ای که پیدا می شود با تابع ()GetWindowText عنوان پنجره را بدست می آوریم :
کد:
length = GetWindowText (window, text, Len(text))

و با تابع ()GetWindowRect موقعیت و ابعاد پنجره را بر حسب پیکسل بدست می آوریم :
کد:
GetWindowRect window, location
 

محمدمهدی

Well-Known Member
مثال : تا جایی که فهمیدم...

سلام مجدد.
خیلی ممنون آقای کینگ.

برای بدست آوردن هندل پنجره ها زیاد مشکل ندارم و تقریبا متوجه شدم. اما الان می خوام اینها رو توسط مثال این پلاگین:

http://xax.do.am/mmb_plugins/mmbdll.zip

فراخونی بکنم.

با فانکشنهایی که توی پارامتراشون فقط input دارن زیاد مشکل ندارم. اما توی این فانکشن(GetWindowRect) پارامتر دوم که باید RECT باشه output هست.

یه مثال از اونی که فهمیدم با VB6 نوشتم و کار میکنه و مشکلی ندارم اما چطوری توسط این پلاگین بخونمش. و یا چطوری این مثال VB رو تبدیل به یه API DLL بکنم که با ام ام بی بخونمش یا چطوری یه فایل exe پارمتریک پیدا بکنم(یا بسازم) که اینکار رو برام بکنه.

مثالش با VB6:


کد:
Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Private Declare Function CopyRect Lib "user32" (lpDestRect As RECT, lpSourceRect As RECT) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Sub Form_Load()
    Dim rectWindow As RECT, rectCopy As RECT
    GetWindowRect Me.hwnd, rectWindow
    CopyRect rectCopy, rectWindow
    MsgBox "Left is" + Str$(rectCopy.Left) + " pixels"
    MsgBox "Right is" + Str$(rectCopy.Right) + " pixels"
    MsgBox "Top is" + Str$(rectCopy.Top) + " pixels"
    MsgBox "Bottom is" + Str$(rectCopy.Bottom) + " pixels"
End Sub

'PARS BIR RAYAN CO. (PAPION)

ممنون!
 

the_king

مدیرکل انجمن
یک نگاهی به نمونه پیوستی بندازید. یک فایل اجرایی با ویژوال بیسیک ساختم که اگه پارامتری با مشخصات
زیر به آن ارسال بشه، ابعاد پنجره ای با عنوان My Sample را خوانده و در فایل C:\Test.txt ذخیره می کند :
کد:
My Sample|C:\Test.txt

مثلا این نمونه از ابعادی است که در فایل C:\Test.txt ذخیره می شود :
کد:
216|129|444|451|

اگر برای نام فایل خروجی مسیر پوشه را مشخص نکنید، از مسیر پوشه %Temp% (معادل <Temp> در MMB)
استفاده می کند. مثلا مسیر فایل output.txt به مسیر کامل C:\Users\User\AppData\Local\Temp\output.txt تبدیل می شود.

پروژه نمونه پیوستی ابعاد پنجره Calculator را اعلام می کند.
 

پیوست ها

  • GetWindowRect.zip
    6.4 کیلوبایت · بازدیدها: 71

محمدمهدی

Well-Known Member
خیلی خیلی ممنون.

واقعا تشکر با یک کلید کافی نبود.

راستی با mmbdll هر کاری کردم که این نمونه رو دوباره بسازم نتونستم. فانکشن GetWindow رو فراخونی کردم اما بقیه فانکشنهای رو نتونستم. علتش چیه؟
خب اولین مشکل اینه که نمی دونم چطوری با این dll بهش RECT بدم.

اگر میشه یک نگاه به این پلاگین بندازید و ببینید میتونه این کار رو در سطح خیلی ساده انجام بده یا نه؟

اگه این پلاگین نمی تونه این کار رو انجا بده فکر کنم بشه یه پلاگین نوشت که api dll ها رو ساپورت بکنه:
اگه خاصیت های این پلاگین رو با چند تا دستور جدید، دوباره بنویسیم و کامل بکنیم. یک پلاگین عالی و بسیار مفید نوشته میشه که قابلیتهای بسیار بسیار زیادی داره و تقریبا نیمه ی ناقص ام ام بی باهاش کامل میشه.
به این صورت که فراخونی فانکشنهای حاوی input رو مثل همین پلاگین انجام بدیم. و دستورهای دارای output رو به دو قسمت تقسیم بکنیم.
1. output هایی که باید حاوی متغیری برای دریافت پاسخ باشن و در نهایت تبدیل به String بشن که ما توسط PluginGet هر وقت خواستیم اونها رو بخونیم.
2. output هایی که باید Handle داشته باشن و برای اونها باید یک Script برای Eventhandler مشخص بشه.

من تا به حال پلاگین خاصی ننوشتم اما فکر کنم با کمک دوستان بتونم. مثلا مثال EventHandler رو توی سایر پلاگینهایی که دوستان نوشتن داریم و فقط ارتباط اون با user32.dll (یا هر dll دیگه ای) مطرحه...
مثلا من یک فاکشن دیدم که XP Button می ساخت و من نتونستم اون رو فراخونی بکنم چون باید یه Handle برای کلیک شدنش می دادم که با این پلاگین نشد.

به هر حال لطفا اگر اطلاعاتی دارید من رو راهنمایی بکنید خیلی ممنون!
 

the_king

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

جدیدترین ارسال ها

بالا