ورود

View Full Version : گرفتن هندل یا نام پنجره فایل مورد نظر



ترانسپورتر
دوشنبه 15 فروردین 1390, 20:44 عصر
باسلام-می خوام برنامه ای بنویسم که وقتی نام و آدرس یه فایل رو بهش میدی نام یا هندل پنجره اصلی فایل مورد نظر رو برگردونه-اگه میشه در این زمینه کمک کنید.

_behnam_
دوشنبه 15 فروردین 1390, 20:56 عصر
فکر نکنم از طریق آدرس فایل اجرایی بشه هندل رو بدست آورد

میتونی از طریق کپشن اون پنجره هندلش رو بدست بیاری


Option Explicit
Private Declare Function FindWindowA Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Form_Load()
Dim Hnd As String
Hnd = FindWindowA(vbNullString, "Yahoo! Messenger")
MsgBox Hnd
End Sub

ترانسپورتر
دوشنبه 15 فروردین 1390, 21:05 عصر
تشکر که جواب دادید ، ولی این کد رو دارم.همون طور که گفتم می خوام از روی نام و آدرس فایل مورد نظر این کار رو بکنم

javadt
دوشنبه 15 فروردین 1390, 23:07 عصر
این کد بر اساس نام برنامه کار می کنه دیگه!!!
اگر این نیست منظورتون رو دقیق تر بگید

_behnam_
سه شنبه 16 فروردین 1390, 12:40 عصر
آقا جواد فکر کنم منظور دوستمون اینه که آدرس برنامرو بدیم و هندل رو بگیریم
مثلا :C:\Program Files\Yahoo\Yahoo.exe
مگه میشه ؟!!! :متعجب:
وقتی که برنامه در حال اجرا نیست پس هندلی به اون اختصاص داده نمیشه که ما بتونیم بدست بیاریم

ترانسپورتر
سه شنبه 16 فروردین 1390, 15:34 عصر
منظورم رو درست متوجه شدید"behnam"-
برای وقتی که برنامه در حال اجراست میگم دیگه!
اگه لطف کنید بفرمایید چکار کنم خیلی عالی میشه.چون یه ساله دارم دنبالش می گردم!

javadt
سه شنبه 16 فروردین 1390, 19:31 عصر
درسته تا قبل از اجرا برنامه هندل نداره
بعد از اجرا هم برنامه یک اسمی داره دیگه!!

ترانسپورتر
سه شنبه 16 فروردین 1390, 21:06 عصر
آقای "javadt" این که نوشتید یعنی چی؟

ترانسپورتر
چهارشنبه 17 فروردین 1390, 10:31 صبح
سلام پس چی شد؟ فکر نمی کردم سوالم انقدر سخت باشه
ما یه برنامه داریم که در حال اجرا است-تنها مشخصه ای هم که از این برنامه داریم نام برنامه و مسیر اونه-حالا می خواهیم با استفاده از این مشخصه به نام یا هندل(فرقی نمیکنه)برنامه مورد نظر دست پیدا کنیم.
باید چکارکنیم؟

محسن واژدی
پنج شنبه 18 فروردین 1390, 18:37 عصر
سلام علیکم
یه راه حلی وجود داره اما ممکنه کمی برنامه تون رو پیچیده کنه، برای اینکار میتوانید از روش زیر استفاده کنید:
1- ابتدا با APIی EnumWindows لیست هنول همه پنجره های باز را بدست بیاورید
2- سپس ID هندل های بدست آمده را با APIی GetWindowThreadProcessId بدست بیارین و جایی لیست کنین (این ID همان ID پروسه اجرا شده است)
3- لیست همه پردازش ها و IDهاشون را بدست بیارین و داخلشون به دنبال آدرس فایل مورد نظر سرچ کنین و ID مسیر مورد نظرتون را بعد از بدست بیارین
4- سپس ID پنجره هایی که بدست آوردین را با ID مسیر فایل موردنظرتون مقایسه کنین که اگر یکی از ID پنجره ها با ID فایلتون یکی بود اون پنجره، پنجره فایل مورد نظر شماست
برای بدست آوردن نام پنجره یافت شده هم از APIی GetWindowText استفاده کنین

البته ممکنه بنظر بیاد راهکار بالا سرعت برنامه را کاهش بدهد، اما وقتی دستورات رو در یکی دوتا حلقه بنویسین نتیجه خیلی سریع برگردانده میشود
ببخشید وقت نداشتم کداشو واستون بنویسم

موفق باشید
یاعلی

ترانسپورتر
جمعه 19 فروردین 1390, 17:34 عصر
و علیکم السلام
خیلی ممنون که جواب دادید.
مورد اول که فرمودید رو میتونم و همچنین لیست پردازش های در حال اجرا را هم می تونم بگیرم
اما معنی ID رو نفهمیدم.اصلا ID چیه؟!!
یعنی هم پنجره ها ID دارند ، و هم فایلها؟
چطوری بهشون دسترسی پیدا کنم؟
بازم ممنون

محسن واژدی
جمعه 19 فروردین 1390, 19:02 عصر
ID یا PID (Process Identifier) یک شناسه هویتی منحصر به فرد هست که هسته ویندوز (kernel) فقط به پروسه یا فایل اجرا شده اختصاص میدهد نه اشیاء موجود در آن یا پنجره ها، بر خلاف هندل ها، همانطور که میدانیم همه اشیاعی که قادر به پاسخ دادن به رویدادها و دستورات هستند خود یک hwnd منحصر به فرد دارند مثلا اگر در یک فرم شامل سه دکمه سرچ کنیم 4تا hwnd پیدا میکنیم (3تاشون مربوط به دکمه ها و یکی هم هندل فرم) اما همه اشیاء موجود دارای یک PID مشترک هستند که آنها را به فرم انتصاب میدهد، برای بدست آوردن PID هر شی یا فرم کافیست هندل فرم یا پروسه یا هرشی ای که بر روی فرم مورد نظر قرار دارد را در APIی GetWindowThreadProcessId قرار بدین تا PID پروسه آن برگردانده شود

موفق باشید
یاعلی

ترانسپورتر
جمعه 19 فروردین 1390, 20:09 عصر
ما باید لیست پردازش های در حال اجرا را بگیریم و همچنین لیست پنجره های در حال اجرا و ID اونها رو با هم مقایسه کنیم ، هر کدام شبیه هم بودند یعنی اون پنجره مال اون فایله؟
اما من نتونستم از این تابع api ای که فرمودید استفاده کنم میشه یه مثالی در این زمینه بنویسید؟
تشکر

محسن واژدی
شنبه 20 فروردین 1390, 07:16 صبح
ما باید لیست پردازش های در حال اجرا را بگیریم و همچنین لیست پنجره های در حال اجرا و ID اونها رو با هم مقایسه کنیم ، هر کدام شبیه هم بودند یعنی اون پنجره مال اون فایله؟

هرکدام از PID های پنجره ها که با PID پروسه مورد نظر یکی باشند 100% پنجره مورد نظر مربوط به همان پروسه است

دستور زیر هندل فرم را به PID معادلش برمیگرداند، برای دیدن لیست ID های پروسه ها داخل TaskManager از داخل منوی View روی SelectColumn کلیک و تیک PID را روشن کنین تا ID همه پروسه ها به لیست TaskManager اضافه شود (البته خودتون واردین)

Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private Sub Command1_Click()
Dim mepid&
GetWindowThreadProcessId Me.hwnd, mepid&
MsgBox "Me PID: " & mepid&
End Sub



موفق باشید

ترانسپورتر
شنبه 20 فروردین 1390, 17:28 عصر
خیلی ممنون از کد ، تستش کردم
حالا به جای me.hwnd هندل هر فرمی را بزاریم ID اون رو بر میگردونه؟
به هندل فایلها چه جوری دسترسی پیدا کنیم؟

محسن واژدی
شنبه 20 فروردین 1390, 21:29 عصر
حالا به جای me.hwnd هندل هر فرمی را بزاریم ID اون رو بر میگردونه؟


چه هندل فرم و چه هندل هر شی ای که رو اون فرم قرار دارد رو قرار بدین همون ID پروسه را برمیگرداند یعنی صرفا" لازم نیست که حتما" هندل فرم را در این دستور قرار بدین



به هندل فایلها چه جوری دسترسی پیدا کنیم؟

هندل فایل ها را لازم ندارین فقط کافیه چک کنین که آیا اون فایله اجراست یا خیر (با همون گرفتن لیست پردازش ها و تست کردنشون)، وقتی که دیدین مسیر فایل مورد نظرتون در لیست پردازش هاست هندل پروسه اش که طبیعتا" همراهش است را گرفنه و مجددا" اون رو هم در همین API قرار بدین تا PID پروسه اش رو برگردونه

موفق باشید
یاعلی

ترانسپورتر
یک شنبه 21 فروردین 1390, 13:09 عصر
ببخشید ، من همه کارو را کردم بجز اینکه این که گفتید "وقتی که دیدین مسیر فایل مورد نظرتون در لیست پردازش هاست هندل پروسه اش که طبیعتا" همراهش است را گرفنه و مجددا" اون رو هم در همین API قرار بدین تا PID پروسه "

هندل پروسه را از کجا پیدا کنم؟

محسن واژدی
دوشنبه 22 فروردین 1390, 09:53 صبح
نمونه زیر را مشاهده کنین،
البته تنها نام پردازش را برمیگرداند (بدون مسیر) اما بهمراه IDشان، سایر دستورات دریافت کننده مسیر و ID هم مشابه این هستند

البته ببخشید پردازش ها به همراه ID شان برگردانده میشوند و برای بدست آوردن هندلشان باید ID اونا رو در API قرار میدادین که در سوال شما hwnd را لازم نیست

موفق باشید

ترانسپورتر
دوشنبه 22 فروردین 1390, 12:22 عصر
از بابت کد ممنون ، ولی ما یه کد می خوایم که آدرس و نام فایل مورد نظرو بهش بدیم و ID اون رو برگردونه ، درسته؟
اگه میشه کدش رو بزارید ، چون این آخرین کدیه که بهش نیاز داریم
بازم تشکر

محسن واژدی
دوشنبه 22 فروردین 1390, 15:59 عصر
کد پست قبل رو فقط از باب نمونه گذاشتم، چون در پست 11 فرموده بودین که میتوانید لیست پردازش ها را بدست آورین :قلب:

کدهای زیر را بررسی کنین (البته ببخشید روی این سیستم vb نصب نبود تستشون نکرده ام، اما اینطور که دیدم مسیر فایل را هم برمیگردانند)


Option Explicit

'General Declarations

Private Declare Function Process32First Lib "kernel32" ( _
ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long

Private Declare Function Process32Next Lib "kernel32" ( _
ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long

Private Declare Function CloseHandle Lib "Kernel32.dll" _
(ByVal Handle As Long) As Long

Private Declare Function OpenProcess Lib "Kernel32.dll" _
(ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, _
ByVal dwProcId As Long) As Long

Private Declare Function EnumProcesses Lib "psapi.dll" _
(ByRef lpidProcess As Long, ByVal cb As Long, _
ByRef cbNeeded As Long) As Long

Private Declare Function GetModuleFileNameExA Lib "psapi.dll" _
(ByVal hProcess As Long, ByVal hModule As Long, _
ByVal ModuleName As String, ByVal nSize As Long) As Long

Private Declare Function EnumProcessModules Lib "psapi.dll" _
(ByVal hProcess As Long, ByRef lphModule As Long, _
ByVal cb As Long, ByRef cbNeeded As Long) As Long

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" ( _
ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long

Private Declare Function GetVersionExA Lib "kernel32" _
(lpVersionInformation As OSVERSIONINFO) As Integer

Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long ' This process
th32DefaultHeapID As Long
th32ModuleID As Long ' Associated exe
cntThreads As Long
th32ParentProcessID As Long ' This process's parent process
pcPriClassBase As Long ' Base priority of process threads
dwFlags As Long
szExeFile As String * 260 ' MAX_PATH
End Type

Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long '1 = Windows 95.
'2 = Windows NT

szCSDVersion As String * 128
End Type

Private Const PROCESS_QUERY_INFORMATION = 1024
Private Const PROCESS_VM_READ = 16
Private Const MAX_PATH = 260
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SYNCHRONIZE = &H100000
'STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
Private Const PROCESS_ALL_ACCESS = &H1F0FFF
Private Const TH32CS_SNAPPROCESS = &H2&
Private Const hNull = 0

Function StrZToStr(s As String) As String
StrZToStr = Left$(s, Len(s) - 1)
End Function

Private Function getVersion() As Long
Dim osinfo As OSVERSIONINFO
Dim retvalue As Integer
osinfo.dwOSVersionInfoSize = 148
osinfo.szCSDVersion = Space$(128)
retvalue = GetVersionExA(osinfo)
getVersion = osinfo.dwPlatformId
End Function

Private Sub Command1_Click()
List1.Clear
Select Case getVersion()

Case 1 'Windows 95/98

Dim f As Long, sname As String
Dim hSnap As Long, proc As PROCESSENTRY32
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If hSnap = hNull Then Exit Sub
proc.dwSize = Len(proc)
' Iterate through the processes
f = Process32First(hSnap, proc)
Do While f
sname = StrZToStr(proc.szExeFile)
List1.AddItem sname
f = Process32Next(hSnap, proc)
Loop

Case 2 'Windows NT

Dim cb As Long
Dim cbNeeded As Long
Dim NumElements As Long
Dim ProcessIDs() As Long
Dim cbNeeded2 As Long
Dim NumElements2 As Long
Dim Modules(1 To 200) As Long
Dim lRet As Long
Dim ModuleName As String
Dim nSize As Long
Dim hProcess As Long
Dim i As Long
'Get the array containing the process id's for each process object
cb = 8
cbNeeded = 96
Do While cb <= cbNeeded
cb = cb * 2
ReDim ProcessIDs(cb / 4) As Long
lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded)
Loop
NumElements = cbNeeded / 4

For i = 1 To NumElements
'Get a handle to the Process
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _
Or PROCESS_VM_READ, 0, ProcessIDs(i))
'Got a Process handle
If hProcess <> 0 Then
'Get an array of the module handles for the specified
'process
lRet = EnumProcessModules(hProcess, Modules(1), 200, _
cbNeeded2)
'If the Module Array is retrieved, Get the ModuleFileName
If lRet <> 0 Then
ModuleName = Space(MAX_PATH)
nSize = 500
lRet = GetModuleFileNameExA(hProcess, Modules(1), _
ModuleName, nSize)
List1.AddItem Left(ModuleName, lRet)
End If
End If
'Close the handle to the process
lRet = CloseHandle(hProcess)
Next

End Select
End Sub

سورس های زیر را هم بررسی کنین
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=22324&lngWId=1

خصوصا" این:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=14899&lngWId=1


موفق باشید
یاعلی

ترانسپورتر
دوشنبه 22 فروردین 1390, 21:27 عصر
کد ها عالی بود مخصوصا ، اون که لیست پنجره ها را بر می گردوند ، اما بازم خبری از ID نبود!

محسن واژدی
دوشنبه 22 فروردین 1390, 22:31 عصر
سلام علیکم
در کدها اگه توجه کرده باشید یک type هست بصورت زیر:

Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long ' This process
th32DefaultHeapID As Long
th32ModuleID As Long ' Associated exe
cntThreads As Long
th32ParentProcessID As Long ' This process's parent process
pcPriClassBase As Long ' Base priority of process threads
dwFlags As Long
szExeFile As String * 260 ' MAX_PATH
End Type

در این type آی دی هرپروسه در th32ProcessID ذخیره میشه که میتوانید همزمان با گرفتن نام و مسیر پروسه ID آن را نیز ذخیره کنید، هینطور هندل هر پروسه در hProcess ذخیره میشه که میتوانید همزمان با ذخیره کرده پروسه هندل آنرا در APIیی که قبلا" عرض قرار بدین که این دقیقا" همون ID را برمیگردونه

موفق باشید

ترانسپورتر
سه شنبه 23 فروردین 1390, 19:37 عصر
خیلی ممنون ، عالی بود ، ببخشید انقدر زحمت دادیم!!

volkswagen
پنج شنبه 01 اردیبهشت 1390, 15:45 عصر
سلام-منم از این کد خیلی خوشم اومده-اما این مورد آخرش برام نامفهوم بود.میشه یه مثالی در این زمینه بزنید؟
مرسی

محسن واژدی
پنج شنبه 01 اردیبهشت 1390, 16:47 عصر
سلام علیکم
کدام قسمت را منظورتون هست؟

volkswagen
پنج شنبه 01 اردیبهشت 1390, 17:58 عصر
سلام
اون قسمت که قراره PID پردازش رو بدست بیاریم ، که فرمودید:"در کدها اگه توجه کرده باشید یک type هست بصورت زیر:..."
تشکر

محسن واژدی
پنج شنبه 01 اردیبهشت 1390, 21:09 عصر
سلام علیکم
این Type اطلاعات مختلف مربوط به هرپروسه از جمله ID اونو ذخیره میکند، که برای مقاصد مختلفی از جمله بستن پروسه بکار میرود
توضیحات اجمالی PID را هم میتوانید در پست های اول همین تاپیک مشاهده کنین

موفق باشید

volkswagen
پنج شنبه 01 اردیبهشت 1390, 21:43 عصر
ببخشید ، شرمنده ، میشه یه مثال از PID بزنید؟ یعنی PID پردازش رو هم نشون بده.
خیلی ببخشد.

محسن واژدی
پنج شنبه 01 اردیبهشت 1390, 21:56 عصر
سورس نمونه اش رو میتونین در صفحه 2 پست 18 دانلود کنین یا از کدهای پست 20 استفاده کنین،

موفق باشید

volkswagen
پنج شنبه 01 اردیبهشت 1390, 22:43 عصر
خیلی ببخشید شرمنده ، اگه میشه بگید که چطور می تونم به PID دسترسی داشته باشم؟ یه مثال بزنید.خیلی ببخشید

محسن واژدی
پنج شنبه 01 اردیبهشت 1390, 23:03 عصر
PID هر پروسه در همان زمان که پروسه دریافت شد در Type PROCESSENTRY32
ذخیره میشود که میتوانید در همان لحظه آنرا دریافت کنید
اگر به کدهای نمونه پست 18 توجه کنید بیشتر متوجه منظور بنده میشوید، یعنی کدهای زیر:

Do
List1.AddItem uProcess.th32ProcessID & vbTab & uProcess.szExeFile
Loop While ProcessNext(hSnapShot, uProcess)
همانگونه که در کدهای بالا مشاهده میکنید PID هر پروسه در متغیر uProcess.th32ProcessID ذخیره حواهد شد

volkswagen
جمعه 02 اردیبهشت 1390, 13:00 عصر
خیلی ببخشید شرمنده
من می خوام از کدهای پست 20 استفاده کنم ، ولی مثل اینکه شما این کدها رو براساس کدهای پست 18 نوشتیتد.درسته؟ در نتیجه:
کامپایلر این رو تشخیص نمیده:ProcessNext و ارور میده.درسته؟

محسن واژدی
شنبه 03 اردیبهشت 1390, 18:57 عصر
خیلی ببخشید شرمنده
من می خوام از کدهای پست 20 استفاده کنم ، ولی مثل اینکه شما این کدها رو براساس کدهای پست 18 نوشتیتد.درسته؟


دقیقا" یادم نیست، احتمالا" حق با شماست



کامپایلر این رو تشخیص نمیده:ProcessNext و ارور میده.درسته؟

درسته باید بجای ProcessNext دستور Process32Next را بنویسین

موفق باشید

volkswagen
یک شنبه 04 اردیبهشت 1390, 16:39 عصر
درسته باید بجای ProcessNext دستور Process32Next را بنویسینببخشید ، بازم نشد:گریه:
می خوام در کنار پردازش ها که در لیست قرار می گیرند ، PID اونها هم قرار بگیره تا بتونم این برنامه رو کاملش کنم.
تشکر

محسن واژدی
یک شنبه 04 اردیبهشت 1390, 16:50 عصر
خب سورس پست 18 را دانلود کنین، که همزمان با آشکارسازی پردازش ها PID آنها را نیز در گنارشان لیست میکند هم سورس آماده ایست و هم میتوانید دستورات آنرا به تناسب نیازتون بررسی و براحتی ویرایش کنین، البته قبلا" تستش کرده ام مشکلی ندارد

موفق باشید

volkswagen
یک شنبه 04 اردیبهشت 1390, 16:55 عصر
ببخشید ، من الان گریم می گیره:گریه:
کدهای پست 18 فقط پردازش رو نشون میده ، PID رو نشون نمیده ، لطفا یه کد بزارید که PID رو هم نشون بده ، چون متاسفانه من بلد نیستم که به PID دسترسی پیدا کنم.

محسن واژدی
یک شنبه 04 اردیبهشت 1390, 17:17 عصر
به تصویر زیر نگاه کنین، از همون نمونه ای که عرض کردم گرفته شده است

البته شاید منظورتان این باشد که چگونه باید ID موجود در کنار هر پروسه موجود در لیست را با انتخاب آیتم بگیرید، که البته خودتان بهتر واردید، با توابع Split, InStr و نظیر اینها امکان پذیر است

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

موفق باشید

volkswagen
یک شنبه 04 اردیبهشت 1390, 18:54 عصر
ببخشید ، درسته ولی این که مسیر پردازش ها رو نشون نمیده!

من براساس اون کدی می خوام که مسیر پردازش ها رو هم نشون میده.
بازم ممنون

volkswagen
دوشنبه 05 اردیبهشت 1390, 13:47 عصر
ببخشید ، پس چی شد؟

volkswagen
سه شنبه 06 اردیبهشت 1390, 16:58 عصر
یه بنده خدایی نیست ، جواب مارو بده؟!:ناراحت:

محسن واژدی
جمعه 09 اردیبهشت 1390, 00:07 صبح
سلام علیکم
ببخشید طولانی شد، این چند روز نبودم

بله، این کدها فقط به منظور بدست آوردن ID یک پردازش نوشته شده بودند، برای بدست آوردن مسیر پردازش بایستی بصورتی دیگر استفاده کنید

سورس زیر را ببینین

مواردی که در این سورس قابل بررسی است (همانگونه که در تصویر زیر مشاهده میکنین):
- PID
- هندل
- نام پروسه
- مسیر پروسه
- و نحوه ی Terminate کردن پروسه را نشان میدهد

البته اگر قبلا" به مسیر پروسه اشاره کرده بودین زودتر این سورس را براتون میگذاشتم
اگر بازم مشکلی بود در خدمتیم

موفق باشید
یاعلی

volkswagen
جمعه 09 اردیبهشت 1390, 17:13 عصر
علیک

خیلی ممنون.دیگه بهتر از این نمیشه.
دستتون درد نکنه
x=9
while x>0
print "خیلی ممنون!"
wend