1. Tải bản cài đặt AutoIT mới nhất

    Chào Khách. Nếu bạn mới tham gia và chưa cài đặt AutoIT.
    Vui lòng vào topic trên để tải bản AutoIT mới nhất nhé
    Dismiss Notice
  2. Quy định và nội quy

    Chào Khách. Vui lòng đọc kỹ nội quy và quy định của diễn đàn
    Để tránh bị ban một cách đáng tiếc nhé!
    Dismiss Notice
  3. Hướng dẫn chèn mã AutoIT trong diễn đàn

    Chào Khách. Vui lòng xem qua bài viết này
    Để biết cách chèn mã AutoIT trong diễn đàn bạn nhé :)
    Dismiss Notice

Hỏi đáp Hỏi về _WinAPI_SetWindowsHookEx

Thảo luận trong 'Thảo luận chung - Hỏi đáp' bắt đầu bởi ChocoboX, 18/12/15.

  1. ChocoboX

    ChocoboX Thành viên mới
    • 1/6

    Tham gia ngày:
    18/12/15
    Bài viết:
    2
    Đã được thích:
    4
    tui mới tập dùng AutoIT, ko hiểu lắm về hàm _WinAPI_SetWindowsHookEx
    Có bác nào rành về cái này làm ơn chỉ bảo giùm
    tui muốn tạm dừng chuỗi Hook, mà làm mãi ko đc. Thử dùng DllCallbackFree, _WinAPI_UnhookWindowsHookEx, mà toàn bị lỗi, dơ luôn, ko chay tiếp đc.

    Ví dụ có chương trình :

    #include <WinAPI.au3>
    #include <String.au3>
    #Include <WindowsConstants.au3>

    Global $sHexKeys, $sMouse, $sString, $hHookKeyboard, $pStub_KeyProc

    HotKeySet("{ESC}", "ExitNow") ; Exit khi nhấn phím Esc

    $pStub_KeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
    $hHookKeyboard = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pStub_KeyProc), _WinAPI_GetModuleHandle(0))

    While 1
    Sleep(10)
    WEnd

    Func ExitNow()
    Exit
    EndFunc ;==>ExitNow

    Func OnAutoITExit()
    DllCallbackFree($pStub_KeyProc)
    _WinAPI_UnhookWindowsHookEx($hHookKeyboard)
    EndFunc ;==>OnAutoITExit

    Func _KeyProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
    Local $KBDLLHOOKSTRUCT = DllStructCreate("dword vkCode;dword scanCode;dword flags;dword time;ptr dwExtraInfo", $lParam)
    Local $vkCode = DllStructGetData($KBDLLHOOKSTRUCT, "vkCode")
    Switch $wParam
    Case $WM_KEYDOWN;, $WM_SYSKEYDOWN

    If (($vkCode > 64) And ($vkCode < 91)) _ ; a -z
    Or (($vkCode > 96) And ($vkCode < 123)) _ ; A - Z
    Or (($vkCode > 47) And ($vkCode < 58)) Then ; 0 - 9 ; Mã Hex của các ký tự nhập vào từ bàn phím

    _keybd_event('', 0) ; Hàm trả về phím rỗng dùng để khóa phím nhập vào , thay đổi mã hex ở trên để tùy chỉnh khóa phím được chỉ định

    ToolTip(Chr($vkCode)) ; Hiển thị các phím nhập vào ở đây

    Return -1

    ElseIf ($vkCode > 159) And ($vkCode < 164) Then ; Các phím hotkey sẽ không được xử lý
    Return

    EndIf
    EndSwitch
    Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
    EndFunc ;==>_KeyProc

    Func _keybd_event($vkCode, $Flag)
    DllCall('user32.dll', 'int', 'keybd_event', 'int', $vkCode, 'int', 0, 'int', $Flag, 'ptr', 0)
    EndFunc; _keybd_event

    Tui muốn tạm dừng nó để chạy hàm khác, rồi chút nữa quay lại chuỗi Hook mà ko biết làm thế nào
     
    kamsamita1 and Phan Dong like this.
  2. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    Không biết ý thým có phải như vậy không hay sao ?

    Mã (AutoIt):
    #include <WinAPI.au3>
    #include <String.au3>
    #include <WindowsConstants.au3>

    Global $Stop = 0 ;Thêm cái này
    Global $sHexKeys, $sMouse, $sString, $hHookKeyboard, $pStub_KeyProc

    HotKeySet("{ESC}", "ExitNow") ; Exit khi nhấn phím Esc

    $pStub_KeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
    $hHookKeyboard = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pStub_KeyProc), _WinAPI_GetModuleHandle(0))

    While 1
        Sleep(10)
    WEnd

    Func ExitNow()
        Exit
    EndFunc

    Func OnAutoITExit()
        DllCallbackFree($pStub_KeyProc)
        _WinAPI_UnhookWindowsHookEx($hHookKeyboard)
    EndFunc

    Func _KeyProc($nCode, $wParam, $lParam)
        If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
        Local $KBDLLHOOKSTRUCT = DllStructCreate("dword vkCode;dword scanCode;dword flags;dword time;ptr dwExtraInfo", $lParam)
        Local $vkCode = DllStructGetData($KBDLLHOOKSTRUCT, "vkCode")
        Switch $wParam
            Case $WM_KEYDOWN;, $WM_SYSKEYDOWN

                Switch $vkCode
                    Case 65 To 90, 97 To 122, 48 To 57 ; a -z ; A - Z ; 0 - 9
                        If Not $Stop Then ;Thêm chỗ này
                            _keybd_event('', 0)
                            ToolTip(Chr($vkCode)) ; Hiển thị các phím nhập vào ở đây
                            Return -1
                        EndIf
                    Case 160 To 163 ; Các phím hotkey sẽ không được xử lý
                        Return
                    Case 0x7B ;phím F12 = Dừng/Tiếp tục hiện Tooltip hoặc không
                        $Stop = Not $Stop
                        ToolTip('')
                EndSwitch

        EndSwitch
        Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
    EndFunc

    Func _keybd_event($vkCode, $Flag)
        DllCall('user32.dll', 'int', 'keybd_event', 'int', $vkCode, 'int', 0, 'int', $Flag, 'ptr', 0)
    EndFunc
     
    kamsamita1 and Phan Dong like this.
  3. ChocoboX

    ChocoboX Thành viên mới
    • 1/6

    Tham gia ngày:
    18/12/15
    Bài viết:
    2
    Đã được thích:
    4
    ko phải bác ah. Ý tui là muốn nó thoát khỏi hẳn cái vòng Hồi quy : SetWindowsHookEx - CallNextHookEx - SetWindowsHookEx - ...cơ. Giống như là nhấn phím ESC vậy, nhưng ko thoát hẳn, mà chỉ chuyển qua 1 hàm khác, chút nữa cần thì gọi lại hàm Main. Ý tui là kiểu

    Mã (AutoIt):
    #include <WinAPI.au3>
    #include <String.au3>
    #include <WindowsConstants.au3>

    Global $Stop = 0 ;Thêm cái này
    Global $sHexKeys, $sMouse, $sString, $hHookKeyboard, $pStub_KeyProc

    HotKeySet("{ESC}", "ExitNow") ; Exit khi nh?n phím Esc
    HotKeySet("{F1}", "Main") ; F1 thì khởi động lại hàm Main

    Main()


    Func Main()

    $pStub_KeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
    $hHookKeyboard = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pStub_KeyProc), _WinAPI_GetModuleHandle(0))

    While 1
        Sleep(10)
    WEnd

    EndFunc


    Func ExitNow()
        Exit
    EndFunc

    Func OnAutoITExit()
        DllCallbackFree($pStub_KeyProc)
        _WinAPI_UnhookWindowsHookEx($hHookKeyboard)
    EndFunc

    Func _KeyProc($nCode, $wParam, $lParam)
        If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
        Local $KBDLLHOOKSTRUCT = DllStructCreate("dword vkCode;dword scanCode;dword flags;dword time;ptr dwExtraInfo", $lParam)
        Local $vkCode = DllStructGetData($KBDLLHOOKSTRUCT, "vkCode")
        Switch $wParam
            Case $WM_KEYDOWN;, $WM_SYSKEYDOWN

                Switch $vkCode
                    Case 65 To 90, 97 To 122, 48 To 57 ; a -z ; A - Z ; 0 - 9
                        If Not $Stop Then ;Thêm ch? này
                            _keybd_event('', 0)
                            ToolTip(Chr($vkCode)) ; Hi?n th? các phím nh?p vào ? đây
                            Return -1
                        EndIf
                    Case 160 To 163 ; Các phím hotkey s? không đư?c x? l?
                        Return
                    Case 0x7B ;phím F12 = D?ng/Ti?p t?c hi?n Tooltip ho?c không
                        $Stop = Not $Stop
                        ToolTip('')
                     Case {F2} đại loại vậy
                          DllCallbackFree($pStub_KeyProc)
                         _WinAPI_UnhookWindowsHookEx($hHookKeyboard)
                         HamABC()
                EndSwitch

        EndSwitch
        Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
    EndFunc

    Func HamABC()

    While 1
        Sleep(10)
    WEnd
    ABCXYZ gì đó
    EndFunc


    Func _keybd_event($vkCode, $Flag)
        DllCall('user32.dll', 'int', 'keybd_event', 'int', $vkCode, 'int', 0, 'int', $Flag, 'ptr', 0)
    EndFunc
    cơ mà nó ko chạy. Dù sao cũng thank bác
     
    kamsamita1 and Phan Dong like this.
  4. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    Ủa, cái Hook chạy đâu có ảnh hưởng đến các hàm khác đâu :p , nó không chạy là do cái vòng lặp While 1 Sleep(10) WEnd đó mà :autoit:
     
    kamsamita1 and Phan Dong like this.

Chia sẻ trang này

Đang tải...