PDA

View Full Version : سوال: یافتن مسیر پوشه



Mohammad.sweets
پنج شنبه 28 دی 1391, 18:04 عصر
سلام به همه ی دوستان و مهندسین عزیز ..... چه جوری میشه یک برنامه ای ساخت که از طریق اون برنامه فهمید که کاربر تو کدوم پوشه در کامپیوتره...؟ مثلا اگه کاربر تو مسیر زیر هست: f:\music تو برنامه تو یه تکس باکس مسیر بالارو نشون بده...بدون اینکه قسمتی از ریجستر رو تغییر بدیم

AbbasVB
پنج شنبه 28 دی 1391, 19:19 عصر
سلام
ابتدا هندل آدرس بار موجود در اکسپلورر رو بدست بیار بعد توی یک تاییمر مرتب تکس داخل اونو بخون
(توی جونیم اینکارو برای نوشتن یه ویروس انجام دادم)

موفق باشید.

Mohammad.sweets
پنج شنبه 28 دی 1391, 19:35 عصر
میشه یه نمونه بزارید

AbbasVB
پنج شنبه 28 دی 1391, 19:49 عصر
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessageByString Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Const WM_GETTEXT = &HD
Dim Address As String

Private Sub Form_Load()

End Sub

Private Sub Timer1_Timer()
On Error Resume Next
Dim Hwnd As Long
Dim i As Integer
Hwnd = FindWindow("CabinetWClass", vbNullString)
If Hwnd <> 0 Then
Hwnd = FindWindowEx(Hwnd, 0, "WorkerW", vbNullString)
Hwnd = FindWindowEx(Hwnd, 0, "ReBarWindow32", vbNullString)
Hwnd = FindWindowEx(Hwnd, 0, "ComboBoxEx32", vbNullString)
Dim r As Long
Dim s As String
s = String(201, Chr(0))
r = SendMessageByString(Hwnd, WM_GETTEXT, 200, s)
If Left(s, r) = "My Computer" Then Exit Sub
Address = Left(s, r)
End If
Text1.Text = Address
End Sub


توی اکس پی جواب می ده ولی توی سون به خاطر عوض شدن کلاس ها نه

Mohammad.sweets
پنج شنبه 28 دی 1391, 19:54 عصر
من میحوام توی همه ی ویندوز ها کار کنه

mehran901
پنج شنبه 28 دی 1391, 19:59 عصر
[QUOTE=AbbasVB;1679001]Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessageByString Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Const WM_GETTEXT = &HD
Dim Address As String

Private Sub Form_Load()

End Sub

Private Sub Timer1_Timer()
On Error Resume Next
Dim Hwnd As Long
Dim i As Integer
Hwnd = FindWindow("CabinetWClass", vbNullString)
If Hwnd <> 0 Then
Hwnd = FindWindowEx(Hwnd, 0, "WorkerW", vbNullString)
Hwnd = FindWindowEx(Hwnd, 0, "ReBarWindow32", vbNullString)
Hwnd = FindWindowEx(Hwnd, 0, "ComboBoxEx32", vbNullString)
Dim r As Long
Dim s As String
s = String(201, Chr(0))
r = SendMessageByString(Hwnd, WM_GETTEXT, 200, s)
If Left(s, r) = "My Computer" Then Exit Sub
Address = Left(s, r)
End If
Text1.Text = Address
End Sub


توی اکس پی جواب می ده ولی توی سون به خاطر عوض شدن کلاس ها نه

دوست عزیز شما از چه راهی کلاس های مورد نیازتون رو شناسایی میکنید ؟ ( هندل رو به دست میاری و از رو هندل کلاس رو پیدا می کنید ؟ ) و واسه به دست آوردن هندل اجزای child راه حل ساده ای هست یا حتما باید بشینیم کد بزنیم ؟

Mohammad.sweets
پنج شنبه 28 دی 1391, 20:08 عصر
من قبلا از این کد استفاده کردم :

Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long

Private Sub Timer1_Timer()
On Error Resume Next
SetDWORDValue "HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Explorer\CabinetState", "FullPath", "1"
Dim c As Long
Dim k As Long
Dim Captions As String
Dim s, st As String

c = GetForegroundWindow 'ÑÝÊä åäÏá äÌÑå ÝÚÇá
Captions = Space$(128)
k = GetWindowText(c, Captions, 128) 'ÚäæÇä äÌÑå ÝÚÇá
Captions = Left(Captions, k)
Capt = Captions

If Mid$(Capt, 2, 2) = ":\" Then
st = Capt

z = InStrRev(st, "\", -1) 'ÈÑÇí íÏÇ ˜ÑÏä äÇ㠁æÔå
Path = Left(st, z - 1)

zz = Len(st) - z
s = Right$(st, zz) 'ÑÝÊä äÇ㠁æÔå

SetWindowText c, s 'ÊÛííÑ äÇ㠁äÌÑå

Me.Caption = Path & "\" & s

End If
End Sub

البته ماژول کار با ریجسترشو الان ندارم اما اصل برنامه همینه...

AbbasVB
پنج شنبه 28 دی 1391, 20:22 عصر
این روش که از ریجستری استفاده می کنه یه مقدار رو توی ریجستری عوض می کنه تا مسیر پوشه جاری رو در کپشن پنجره نمایش بده بعد از طریق اون آدرس رو به دست میاره
الآن دارم روش کار می کنم اگه درست شد می گذارم

دوست عزیز شما از چه راهی کلاس های مورد نیازتون رو شناسایی میکنید ؟ ( هندل رو به دست میاری و از رو هندل کلاس رو پیدا می کنید ؟ ) و واسه به دست آوردن هندل اجزای child راه حل ساده ای هست یا حتما باید بشینیم کد بزنیم ؟
کلاس ها رو میشه با استفده از برنامه های ساده ای مثل HookSpy به دست آورد
اول از طریق کلاس هندل رو به دست می یاریم بعد از طبق اون متنش رو می خونیم
ما همیشه دنبال راه های ساده تر هستیم

Hashemvp
پنج شنبه 28 دی 1391, 20:48 عصر
دوستان عزیز
این روش هایی ک گفتید از کیفیت خوبی بر خوردار نیستن من حدودا 2 هفته میشه ک اینکارو میخوام انجام بدم و ب هیچ نتیجه ای رسیدم
و اینکه وقتی میگید توی رجیستری تغییر ایجاد کنه ک کپشن و ادرس بار یکی بشه
اصلا راه خوبی نیست
اگر برنامه کاربردی باشه ممکنه باب میل کاربر نباشه
اگر برنامه برای ویروس باشه ک خیلی سریع لو میره و همین تغییر توی رجیستری باعث میشه ک انتی ویروس ها سریع بهش مشکوک بشن

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

AbbasVB
پنج شنبه 28 دی 1391, 20:56 عصر
این روش هایی ک گفتید از کیفیت خوبی بر خوردار نیستن من حدودا 2 هفته میشه ک اینکارو میخوام انجام بدم و ب هیچ نتیجه ای رسیدم
و اینکه وقتی میگید توی رجیستری تغییر ایجاد کنه ک کپشن و ادرس بار یکی بشه
اصلا راه خوبی نیست
اگر برنامه کاربردی باشه ممکنه باب میل کاربر نباشه
اگر برنامه برای ویروس باشه ک خیلی سریع لو میره و همین تغییر توی رجیستری باعث میشه ک انتی ویروس ها سریع بهش مشکوک بشن
باهات موافقم:لبخند:



تنها راهی ک وجود داره اینکه کسی ک به زبان سی یا سی ++ مسلط هست ی دی ال ال براتون بسازه ک این کاره بکنه
سورس این کار هم با زبان سی توی نت فراوونه
فکر نکنم زبان اینجا مهم باشه ، مهم روش کاره.
در ضمن اگه قرار باشه ویر-وس باشه بهترره فایل ویروس تنها باشه .
اگه ممکنه یه نمونه به زبان سی بذارید شاید بتونم تبدیلش کنم

Hashemvp
پنج شنبه 28 دی 1391, 21:10 عصر
فکر نکنم زبان اینجا مهم باشه ، مهم روش کاره.
در ضمن اگه قرار باشه ویر-وس باشه بهترره فایل ویروس تنها باشه .
اگه ممکنه یه نمونه به زبان سی بذارید شاید بتونم تبدیلش کنم

چرا دوست عزیز ب زبان ربط داره چون ویندوز7 , 8 هسته مرکزیشون تغییرات زیادی کرده
و از چیز های جدید تری استفاده میکنن
من سورس زبان سی رو پاک کردم لینکشو ولی میگردم پیدا کردم میذارم
و خودمم تبدیلش کردم ب وی بی 6
منتها زبان سی تابع های کتابخانه ای و API اش قوی تر هست و بیشتر
ی تابع داشت ک همینکارو میکرد و مقدار ادرس بار اکسپلورر رو میخوند
هرچی توی ویبی گشتم پیدا نبود و دقیقا همون ی تابع کم بود اگه اون تابع بودش راحت میشد این کارو کرد
حالا شاید از روش های دیگه بشه ولی من هرچی سعی کردم نشد
موفق باشید

Mohammad.sweets
پنج شنبه 28 دی 1391, 21:10 عصر
دی ال ال هم باشه مهم نیست

Hashemvp
پنج شنبه 28 دی 1391, 21:33 عصر
دوست عزیز این تیکه کدی ک برای زبان سی ++

HWND l_pExplorerhwnd = ::GetForegroundWindow();

TCHAR l_szTempName[MAX_PATH];
if(l_pExplorerhwnd)

{
::GetWindowModuleFileName(l_pExplorerhwnd, l_szTempName, MAX_PATH);
MessageBox(0, l_szTempName, 0, 0);
if(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL))
{
::GetWindowText(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL), l_szTempName, MAX_PATH);
MessageBox(0, l_szTempName, 0, 0);
}
else
{
MessageBox(0, L"Error Error ", 0, 0);
}
}
else
{
MessageBox(0, L"Error Error Error", 0, 0);
}

و اینکه پیدا کردن ادرس رو این تابع انجام مبده
GetWindowModuleFileName
ک توی ویبی این تابع وجود نداره

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

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

موفق باشید

Mohammad.sweets
جمعه 29 دی 1391, 16:12 عصر
کسی نمیتونه جواب بده........این همه حرفه ای اینجا هست:گریه:

Hashemvp
جمعه 29 دی 1391, 20:12 عصر
دوست عزیز گفتم تا جایی ک من اطلاع دارم توی ویبی نمیشه مگر اینکه کسی رو پیدا کنی ک سی بلد باشه کد بالا رو ک گذاشتم بهش بده بگو دی ال ال شو برات درست کنه
اون وقت با دی ال ال میتونی
موفق باشی

Mohammad.sweets
شنبه 30 دی 1391, 10:45 صبح
یعنی هیچ راهی نیست؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟:گریه:

Mr'Jamshidy
شنبه 30 دی 1391, 12:39 عصر
دوست عزیز این تیکه کدی ک برای زبان سی ++

HWND l_pExplorerhwnd = ::GetForegroundWindow();

TCHAR l_szTempName[MAX_PATH];
if(l_pExplorerhwnd)

{
::GetWindowModuleFileName(l_pExplorerhwnd, l_szTempName, MAX_PATH);
MessageBox(0, l_szTempName, 0, 0);
if(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL))
{
::GetWindowText(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL), l_szTempName, MAX_PATH);
MessageBox(0, l_szTempName, 0, 0);
}
else
{
MessageBox(0, L"Error Error ", 0, 0);
}
}
else
{
MessageBox(0, L"Error Error Error", 0, 0);
}

و اینکه پیدا کردن ادرس رو این تابع انجام مبده
GetWindowModuleFileName
ک توی ویبی این تابع وجود نداره

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

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

موفق باشید

تابعی که شما بهش اشاره کردید با این فرق داره؟


Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long

Hashemvp
شنبه 30 دی 1391, 15:50 عصر
بله دوست عزیز
فکر کنم همین ها باشن:لبخند:
پس من تنبلی کردم خوب نگشتم
ممنون

موفق باشی

AbbasVB
یک شنبه 01 بهمن 1391, 16:14 عصر
این کدی که شما گذاشتی که کار نمیکنه


دوست عزیز این تیکه کدی ک برای زبان سی ++

HWND l_pExplorerhwnd = ::GetForegroundWindow();

TCHAR l_szTempName[MAX_PATH];
if(l_pExplorerhwnd)

{
::GetWindowModuleFileName(l_pExplorerhwnd, l_szTempName, MAX_PATH);
MessageBox(0, l_szTempName, 0, 0);
if(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL))
{
::GetWindowText(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL), l_szTempName, MAX_PATH);
MessageBox(0, l_szTempName, 0, 0);
}
else
{
MessageBox(0, L"Error Error ", 0, 0);
}
}
else
{
MessageBox(0, L"Error Error Error", 0, 0);
}

و اینکه پیدا کردن ادرس رو این تابع انجام مبده
GetWindowModuleFileName
ک توی ویبی این تابع وجود نداره

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

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

موفق باشید



اینم کد برو حال کن



Rem coded by : AbbasVB !

Option Explicit

Private Declare Function FindWindowEx _
Lib "user32" _
Alias "FindWindowExA" (ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Declare Function FindWindow _
Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function SendMessageByString _
Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As String) As Long

Const WM_GETTEXT = &HD

Dim Address As String

Dim handle As Long

Function Retrieval_Full_Path() As String
On Error Resume Next
Dim path As String

Dim PathLen As Long

Dim TempPath As String

path = String$(128, Chr$(0))
handle = FindWindow("CabinetWClass", vbNullString)

If handle <> 0 Then
handle = FindWindowEx(handle, ByVal 0&, "WorkerW", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "ReBarWindow32", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "Address Band Root", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "msctls_progress32", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "Breadcrumb Parent", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "ToolbarWindow32", vbNullString)

TempPath = String(200, Chr(0))
PathLen = SendMessageByString(handle, WM_GETTEXT, 200, TempPath)

Address = Left(TempPath, PathLen)
Address = Right(Address, Len(Address) - Len("address :"))
Retrieval_Full_Path = Address
Else
Retrieval_Full_Path = "No Path"
Exit Function

End If

End Function
Rem Example of use
Private Sub Timer1_Timer()
txtText1.Text = Retrieval_Full_Path
End Sub

Mr'Jamshidy
یک شنبه 01 بهمن 1391, 18:10 عصر
این کدی که شما گذاشتی که کار نمیکنه

اینم کد برو حال کن



Rem coded by : AbbasVB !

Option Explicit

Private Declare Function FindWindowEx _
Lib "user32" _
Alias "FindWindowExA" (ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Declare Function FindWindow _
Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function SendMessageByString _
Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As String) As Long

Const WM_GETTEXT = &HD

Dim Address As String

Dim handle As Long

Function Retrieval_Full_Path() As String
On Error Resume Next
Dim path As String

Dim PathLen As Long

Dim TempPath As String

path = String$(128, Chr$(0))
handle = FindWindow("CabinetWClass", vbNullString)

If handle <> 0 Then
handle = FindWindowEx(handle, ByVal 0&, "WorkerW", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "ReBarWindow32", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "Address Band Root", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "msctls_progress32", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "Breadcrumb Parent", vbNullString)
handle = FindWindowEx(handle, ByVal 0&, "ToolbarWindow32", vbNullString)

TempPath = String(200, Chr(0))
PathLen = SendMessageByString(handle, WM_GETTEXT, 200, TempPath)

Address = Left(TempPath, PathLen)
Address = Right(Address, Len(Address) - Len("address :"))
Retrieval_Full_Path = Address
Else
Retrieval_Full_Path = "No Path"
Exit Function

End If

End Function
Rem Example of use
Private Sub Timer1_Timer()
txtText1.Text = Retrieval_Full_Path
End Sub


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

Mohammad.sweets
یک شنبه 01 بهمن 1391, 19:23 عصر
مرسی همونی بود که میخواستم.....:قلب::تشویق:

Hashemvp
یک شنبه 01 بهمن 1391, 20:08 عصر
AbbasVB (http://barnamenevis.org/member.php?205103-AbbasVB) آقا دمت گرم:چشمک:
منم همین امروز صبح درستش کردم خواستم DLL رو بسازم بعد بذارم توی فروم ک شما زحمتشو کشیدی
موفق باشید

hd2010hd
یک شنبه 01 بهمن 1391, 20:26 عصر
این باشه جواب اونایی که میگن ویبی بدرد نمیخوره
حالا که اینطور شد من میرم الان با ویبی سیستم عامل مینویسم:بامزه:

داداش واقعا دمت گرم این کد رو چند ماهه دنبالشم واقعا حرف نداره و درست کار مینه ;)

Mr'Jamshidy
یک شنبه 01 بهمن 1391, 22:33 عصر
داداش واقعا دمت گرم این کد رو چند ماهه دنبالشم واقعا حرف نداره و درست کار مینه ;)

عزیز مگر کد از من بود که از من تشکر میکنی؟

Mohammad.sweets
سه شنبه 03 بهمن 1391, 19:31 عصر
عزیز دمت گرم ولی تو اکس پی کار نکرد:گریه::متفکر::ناراحت:

AbbasVB
سه شنبه 03 بهمن 1391, 19:42 عصر
عزیز دمت گرم ولی تو اکس پی کار نکرد:گریه::متفکر::ناراحت:
عزیز من این کد مال ویندوز 7 هست
مال اکس پی رو قبلا گذاشتم

Mohammad.sweets
سه شنبه 03 بهمن 1391, 19:50 عصر
من میخوام با هم تو یه کد باشه ..... یه کد برای هر ویندوزی...