PDA

View Full Version : لیست پتجره های در حال اجرا



volkswagen
دوشنبه 29 فروردین 1390, 21:55 عصر
سلام-می خوام یه برنامه بنویسم که پنجره های در حال اجرا رو در یه لیست باکس نمایش بده.تو سایت سرچ کردم ولی اون چیزی که پیدا کردم پنجره های مخفی را نشون نمیداد.یعنی اگر یه برنامه از کدد:App.taskvisible=false در برنامش استفاده کرده باشه ، این کدی که من پیدا کردم اون پنجره رو نمایش نمی داد.

اگه میشه یه کمکی در این زمینه بکنید.ممنون

محسن واژدی
سه شنبه 30 فروردین 1390, 08:27 صبح
سلام
این برنامه رو بررسی کنین:


' Display the title bar text of all top-level windows. This
' task is given to the callback function, which will receive each handle individually.
' Note that if the window has no title bar text, it will not be displayed (for clarity's sake).

' *** Place this code in a module. This is the callback function. ***
' This function displays the title bar text of the window identified by hwnd.
Public Function EnumWindowsProc (ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim slength As Long, wintext As String ' title bar text length and buffer
Dim retval As Long ' return value
Static winnum As Integer ' counter keeps track of how many windows have been enumerated

winnum = winnum + 1 ' one more window enumerated....
slength = GetWindowTextLength(hwnd) + 1 ' get length of title bar text
If slength > 1 ' if return value refers to non-empty string
buffer = Space(slength) ' make room in the buffer
retval = GetWindowText(hwnd, buffer, slength) ' get title bar text
Debug.Print "Window #"; winnum; " : "; ' display number of enumerated window
Debug.Print Left(buffer, slength - 1) ' display title bar text of enumerated window
End If

EnumWindowsProc = 1 ' return value of 1 means continue enumeration
End Function

' *** Place this code wherever you want to enumerate the windows. ***
Dim retval As Long ' return value

' Use the above callback function to list all of the enumerated windows. Note that lParam is
' set to 0 because we don't need to pass any additional information to the function.
retval = EnumWindows(AddressOf EnumWindowsProc, 0)


همینطور این سورس:
http://www.vbaccelerator.com/home/vb/code/libraries/windows/enumerating_windows/article.asp

و این برنامه:

http://support.microsoft.com/kb/183009 (http://support.microsoft.com/kb/183009%D9%85%D9%88%D9%81%D9%82)

موفق باشید

volkswagen
سه شنبه 30 فروردین 1390, 14:59 عصر
سلام-خیلی ممنون از کدها
اولی که نوشتید رو نتونستم ازش استفاده کنم
دومی هم همینطور

سومی ام متاسفانه هر کاری می کنم که اطلاعات را وارد لیست باکس کنم نمیشه
میشه در کل یه توضیحی بدبد؟
بازم ممنون

محسن واژدی
سه شنبه 30 فروردین 1390, 20:35 عصر
نمونه زیر بر اساس کد پست قبل نوشته شده
موفق باشید

volkswagen
سه شنبه 30 فروردین 1390, 21:54 عصر
عالی بود .خیلی ممنون.
فقط چه چیزی رو از داخل کدها حذف کنم که فقط پنجره های اصلی رو نشون بده؟(یعنی پنجره های فرعی رو نشون نده)
بازم ممنون.

volkswagen
پنج شنبه 01 اردیبهشت 1390, 09:23 صبح
خیلی ممنون-خودم فهمیدم باید چکار بکنم

volkswagen
سه شنبه 13 اردیبهشت 1390, 17:27 عصر
ببخشید مثل اینکه برنامه بازهم یکسری پنجرهای فرعی رو نشون میده.
مثلا wordpad رو که اجرا می کنم ، بیش از 1 نام به لیست اضافه میشه
چطوری این مشکل رو حل کنم؟
بنده می خوام که فقط پنجره های اصلی رو نشون بده.
خیلی ممنون

محسن واژدی
سه شنبه 13 اردیبهشت 1390, 18:45 عصر
سلام علیکم
سورس زیر لیست کل پنجره هایی که بر روی نوار Start ویندوز قرار میگیرند را به همراه hwnd شان بر میگرداند

موفق باشید

volkswagen
سه شنبه 13 اردیبهشت 1390, 19:35 عصر
علیک
متاسفانه ، مثل اینکه منطور بنده رو اشتباه متوجه شدید.
این کدی که شما گذاشتید ، پنجره های مخفی رو نشون نمیده(همون چیزایی که در تاپیک شماره 1 گفتم)
منظور بنده این نبود که پنجره های مخفی رو نشون نده بلکه:
منظورم این بود که پنجره های مربوط به یک برنامه رو که نشون میده ، صرفا پنجره ی main اون رو نمایش بده.پنجره های child (اگه درسته نوشته باشم) او رو نشون نده.
خیلی ممنون.

محسن واژدی
سه شنبه 13 اردیبهشت 1390, 22:59 عصر
این کدها فقط پنجره های اصلی (parent forms) که مخفی نیستند را نشان میدهند
برای نمایش همه نوع فرم اعم از ظاهر ومخفی دستور "If IsWindowVisible(hWnd) Then" موجود در روال GetExplorerWindows را غیر فعال کنید

موفق باشید

volkswagen
سه شنبه 13 اردیبهشت 1390, 23:29 عصر
ببخشید.
شرمنده ، بازم ببخشید.
نمیشه رو همون کد قبلی برام بگید باید چکار کنم(کدی که اول بهم دادید)

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

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

محسن واژدی
سه شنبه 13 اردیبهشت 1390, 23:49 عصر
احتمالا" منظورتون پست شماره 2# باشد
ویرایشش کردم، انشاء الله درسته

قسمت دوم سوالتون: اینگونه خیلی کار سخت میشود چون درصد خطا در آن بسیار بالاست اما میتوانید هندل فرم مورد نظر را در تابع GetParent گذاشته و چک کنید که آیا فرم والد است یا خیر

موفق باشید

volkswagen
چهارشنبه 14 اردیبهشت 1390, 00:05 صبح
خیلی ممنون.
بزارید تستش کنم و خبرش رو بهتون بدم

محسن واژدی
چهارشنبه 14 اردیبهشت 1390, 00:20 صبح
این نمونه همان نمونه پست شماره 2 است که گفتین و اینکه تعداد PID مشترک را برمیگرداند میتواند به این دلیل باشد که PID مورد نظر دارای چندین فرم والد است تابع GetParent در همون نمونه هایی که در بالا عرض کردم چک میکند که آیا هندل اختصاص داده شده مربوط به فرم والد است یا خیر، اگر هندل فرم والد باشد مقدار صفر را برمیگرداند در غیر اینصورت هندل دیگری که مربوط به فرم والد است را برمیگرداند، دستور ان بصورت زیر است: Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long موفق باشید

volkswagen
چهارشنبه 14 اردیبهشت 1390, 00:26 صبح
ببخشید ، من تازه می خوام حرفی رو که شما جوابش رو دادید رو بزنم!!!:متعجب:

تستش کردم
متاسفانه:
مشکلی که داره اینه که ، من PID هر کدوم رو هم می گیریم.بعد نگاه کردم دبدم بعضی ها PID شون مشترک هست.
مثلا:( خودتون بی زحمت رو مدیا پلیر این تست رو انجام بدید.)
می بینید که فقط پنجره ی خود مدیا پلیر نیست ، و یه پنجره تحت عنوان " media event sink window " هم در لیست می بینید که PID اون با PID مدیا پلیر یکی (مساوی) هست.
البته بازم پنجره هایی هست که pid شون با مدیا یکی هست که من ننوشتم

حالا چطوری میشه این اشکال رو برطرف کرد؟
بازم ممنون

volkswagen
چهارشنبه 14 اردیبهشت 1390, 00:28 صبح
حالا راه چاره چیست؟

محسن واژدی
چهارشنبه 14 اردیبهشت 1390, 07:37 صبح
بله درست است، PID های زیادی مشابه همه و این تنها بخاطر این است که یک برنامه دارای چند فرم والد است، به عنوان مثال ما در وی بی یک پروژه جدید بازکرده ام و وقتی که آنرا اجرا میکنیم بر حَسَب ظاهر فقط یک فرم از vb را در صفحه نمایش میبینیم درحالی که چندید فرم بصورت مخفی نیز در حال اجرا هستند همینطور فرم اصلی محیط طراحی vb خود یکی از این چند فرم است، پس وقتی که قصد آشکار سازی همه پنجره ها را داشته باشیم، در اینحال همه پنجره های والد اعم از فرم های عادی ظاهری و مخفی به لیست افزوده میشوند که البته این روال طبیعی موضوع است،
برای اینکه فقط یک ID پروسه به لیست افزوده شود میتوانید لیستی از آخرین ID ها را ذخیره و در هربار ID جدید را با این لیست مقایسه کنید، اگر در لیست موجود نباشد بدان معناست که ID جدید است و به همین منوال
اما توجه داشته باشید که در این روش (عدم اجازه به افزوده شده بیش از یک ID) اولین ID آشکار شده میتواند مربوط به هر کدام از فرم های والد باشد چه بسا اولین نام فرمی که به لیست افزوده مشود آن فرمی نباشد که شما مد نظرتان است، البته یک روش دیگری هم هست که در آن در صورت تکرار تعداد ID ها، آن فرمی به لیست افزوده شود که فرم والد آن ظاهر باشد که در این صورت شانس لیست کردم فرم مورد نظرتان بیشتر خواهد بود

وقت کردم روش کار میکنم و نتیجه را برایتان میگذارم

موفق باشید

محسن واژدی
چهارشنبه 14 اردیبهشت 1390, 08:21 صبح
سورس زیر از میان PIDهای تکرارب فقط آنهایی که ظاهر هستند را به فرم می افزاید
البته اگر بخواهید افزوده شدن PIDها را به لیست با شروطی که در این سورس اضافه شده است همراه کنید تنها تعداد محدودی فرم قابل پذیرش خواهد بود

موفق باشید

volkswagen
چهارشنبه 14 اردیبهشت 1390, 14:37 عصر
ببخشید.
من می گم ، با همون تابع که معرفی کردید ، بیایم ببینیم فرم والد هست یانه.
بنده می خوام همون برنامه ای رو بنویسم که چند وقت پیش مزاحمتون شدم : "گرفتن هندل یا نام پنجره فایل مورد نظر"
نظر تون چیه؟
یعنی PID یک پردازش رو از لیست بگیرم و بعد مقایسه کنم ببینم با pid کدوم از پنجره ها مشترک هست.
اصلا فکر کنم با همون برنامه قبلی هم جواب بده و مشکلی نباشه که چند PID مشترک در لیست هست.اینطور نیست؟

محسن واژدی
چهارشنبه 14 اردیبهشت 1390, 23:08 عصر
من می گم ، با همون تابع که معرفی کردید ، بیایم ببینیم فرم والد هست یانه.

بله اون تابع میتواند برای تشخیص فرم های child از parent نیز مورد استفاده قرار گیرد



بنده می خوام همون برنامه ای رو بنویسم که چند وقت پیش مزاحمتون شدم : "گرفتن هندل یا نام پنجره فایل مورد نظر"
نظر تون چیه؟

گرفتن هندل از روی نام فرم کمی مشکل است اما امکان پذیر است




PID یک پردازش رو از لیست بگیرم و بعد مقایسه کنم ببینم با pid کدوم از پنجره ها مشترک هست.
اصلا فکر کنم با همون برنامه قبلی هم جواب بده و مشکلی نباشه که چند PID مشترک در لیست هست.اینطور نیست؟

بله برنامه قبلی برای این منظور شما بسیار مناسب است، بدلیل آنکه تمامی فرم ها را به همراه PIDشان لیست میکند و شما فقط بایستی عمل جستجو و مقایسه را انجام دهید

موفق باشید

volkswagen
پنج شنبه 15 اردیبهشت 1390, 11:30 صبح
از توضیحاتتون خیلی ممنون
حالا میبینم با اون تابع میشه کاری کرد یا نه.
خیلی ممنون.

volkswagen
جمعه 16 اردیبهشت 1390, 18:27 عصر
سلام من این کد رو پیدا کردم:
اما نمیدونم بقیه توابع کارشون چیه، میشه یه توضیحی ازش بدید ، یا اینکه اگر کدی خودتان دارید جایگزینش کنید(کدی که فقط همون تابع GetParent درش باشه)خیلی ممنون
Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function IsChild Lib "user32" (ByVal hWndParent As Long, ByVal hwnd As Long) As Long

Dim hwnd As Long, hwndch As Long
Dim wn As String, wnch As String
wn = Space(255)
wnch = Space(255)
hwndch = Text1.hwnd '
hwnd = GetParent(hwndch)
GetClassName hwnd, wn, Len(wn)
GetClassName hwndch, wnch, Len(wnch)
If IsChild(hwnd, hwndch) Then
MsgBox wn
MsgBox Text1.Text + "is parent of " + wnch + "."
Else
MsgBox wn
MsgBox Text1.Text + "no parent of" + wnch + "."
End If

Mr'Jamshidy
جمعه 16 اردیبهشت 1390, 21:39 عصر
ترجمش پای خودت
GetParent Function:
The GetParent function retrieves the handle of the specified child window’s parent window.
GetClassName Function:
The GetClassName function retrieves the name of the class to which the specified window belongs.
IsChild Function:
The IsChild function tests whether a window is a child window or descendant window of a specified parent window. A child window is the direct descendant of a specified parent window if that parent window is in the chain of parent windows; the chain of parent windows leads from the original overlapped or pop-up window to the child window.

موفق باشی