۱۰-فروردین-۱۳۸۹, ۱۳:۳۳:۲۲
(۱۰-فروردین-۱۳۸۹, ۱۱:۴۶:۴۳)lord_viper نوشته است: [ -> ]شما برای کاری که میخواهید انجام بدین باید تابع deletefile رو هوک کنید اون پروگرس بار رو explorer نشون میده و برای حذف هر فایل از تابع deleteFile استفاده میکنه هر وقت کاربر بخواهد فایلی رو حذف کنه ادرس اون فایل به عنوان پارامتر به تابع DeleteFile ارسال میشه وقتی شما این تابع رو هوک میکنین تابع شما قبل از تابع اصلی اطلاعات رو دریافت میکنه و پردازش میکنه و در صورت تایید تابع شما تابع اصلی DeleteFile رو فراخوانی میکنه
ببینید بزارین یه مثالی اینجا بزارم :
کد php:
Public Class KeyboardHook
''Constants
Private Const HC_ACTION As Integer = 0
Private Const WH_KEYBOARD_LL As Integer = 13
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_SYSKEYUP = &H105
''Keypress Structure
Private Structure KBDLLHOOKSTRUCT
Public vkCode As Integer
Public scancode As Integer
Public flags As Integer
Public time As Integer
Public dwExtraInfo As Integer
End Structure
''API Functions
Private Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Integer, _
ByVal lpfn As KeyboardProcDelegate, _
ByVal hmod As Integer, _
ByVal dwThreadId As Integer) As Integer
Private Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Integer, _
ByVal nCode As Integer, _
ByVal wParam As Integer, _
ByVal lParam As KBDLLHOOKSTRUCT) As Integer
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Integer) As Integer
''Our Keyboard Delegate
Private Delegate Function KeyboardProcDelegate _
(ByVal nCode As Integer, _
ByVal wParam As Integer, _
ByRef lParam As KBDLLHOOKSTRUCT) As Integer
''The KeyPress events
Public Shared Event KeyDown(ByVal Key As Keys)
Public Shared Event KeyUp(ByVal Key As Keys)
''The identifyer for our KeyHook
Private Shared KeyHook As Integer
''KeyHookDelegate
Private Shared KeyHookDelegate As KeyboardProcDelegate
Public Sub New()
''Installs a Low Level Keyboard Hook
KeyHookDelegate = New KeyboardProcDelegate(AddressOf KeyboardProc)
KeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHookDelegate, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
End Sub
Private Shared Function KeyboardProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
''If it is a keypress
If (nCode = HC_ACTION) Then
Select Case wParam
''If it is a Keydown Event
Case WM_KEYDOWN, WM_SYSKEYDOWN
''Activates the KeyDown event in Form 1
RaiseEvent KeyDown(CType(lParam.vkCode, Keys))
Case WM_KEYUP, WM_SYSKEYUP
''Activates the KeyUp event in Form 1
RaiseEvent KeyUp(CType(lParam.vkCode, Keys))
End Select
End If
''Next
Return CallNextHookEx(KeyHook, nCode, wParam, lParam)
End Function
Protected Overrides Sub Finalize()
''On close it UnHooks the Hook
UnhookWindowsHookEx(KeyHook)
MyBase.Finalize()
End Sub
End Class
کد php:
Public Class Form1
Private WithEvents kbHook As New KeyboardHook
Private Sub kbHook_KeyDown(ByVal Key As System.Windows.Forms.Keys) Handles kbHook.KeyDown
TextBox1.Text = TextBox1.Text + Key.ToString + " KeyDown" + vbNewLine
End Sub
Private Sub kbHook_KeyUp(ByVal Key As System.Windows.Forms.Keys) Handles kbHook.KeyUp
TextBox1.Text = TextBox1.Text + Key.ToString + " KeyUp" + vbNewLine
End Sub
End Class
این مثال بالا کیبرد رو داره هوک می کنه .
حالا فرض کنید مثل اون موردی که برای دیلیت کردن گفتم (بعضی فایلها دیلیت کردنشون کنسل بشه بعضیا دیلیت بشن) بخایم عمل کنیم . اینجا راحت می تونیم یه سری از کلیدهای کیبرد رو فیلتر کنیم . برای این کار کافیه کد هر کلید رو بررسی کنیم و اگه خواستیم اونو فیلتر کنیم . به این صورت تابع KeyboardProc رو تغییر میدیم :
کد php:
Private Shared Function KeyboardProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
''If it is a keypress
If (nCode = HC_ACTION) Then
Select Case wParam
''If it is a Keydown Event
Case WM_KEYDOWN, WM_SYSKEYDOWN
''Activates the KeyDown event in Form 1
RaiseEvent KeyDown(CType(lParam.vkCode, Keys))
Case WM_KEYUP, WM_SYSKEYUP
''Activates the KeyUp event in Form 1
RaiseEvent KeyUp(CType(lParam.vkCode, Keys))
End Select
End If
''Next
If CType(lParam.vkCode, Keys) = Keys.A Then
Return 1
Else
Return CallNextHookEx(KeyHook, nCode, wParam, lParam)
End If
End Function
خوب این خیلی سادست ! به همین راحتی کلید A رو از صفحه کلید اجازه عبور نمی دیم بهش ! اما بقیه کلید ها رو می ذاریم عبور کنن . یعنی عملا توی هوکمون فیلتر گذاشتیم . این کار نه نوشتن dll لازم داره و نه اینجکت کردن و نه تغییر تیبل و ... . و در سطح کل سیستم هم جواب می ده . حالا مابه این سناریو رو دقیقا می خام برای تابع delete پیاده سازی کنم . ! و دقیقا مشابه همین هم فیلتر کنم . پس نباید به اینجکت و نوشتن dll احتیاج باشه . آره ؟