Воскресенье
02.02.2025
13:53
Форма входа
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    OPEN SOURCE PROJECT

    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Прерывание клавиатуры
    andXreiДата: Четверг, 23.04.2009, 14:09 | Сообщение # 1
    Майор
    Группа: Проверенные
    Сообщений: 95
    Репутация: 2
    Статус: Offline
    ниже приведённым ниже исходником я попытался отследить нажатие клавиши 'пробел,space'
    Доступно только для пользователей
    Но что то он не работает. Мож что то я не допонял??
    И не так все просто??


    Сообщение отредактировал andXrei - Четверг, 23.04.2009, 14:18
     
    fasmДата: Четверг, 23.04.2009, 16:46 | Сообщение # 2
    Admin
    Группа: Заблокированные
    Сообщений: 122
    Репутация: 5
    Статус: Offline
    Прерывания доступны только в дос, из windows легче всего проследить нажатия клавиш на своем окне, но можно еще поставить хук и т.п. Вот исправлены инструкции для DOS приложения, все оч. просто:

    format MZ
    org 100h

    macro invoke fun, par1
    {
    mov ax, par1
    call fun
    }

    start:
    call ReadChar
    cmp ah, 1 ; esc
    je ExitProcess
    cmp ah, 39h
    je metka
    jmp metka1

    metka:
    invoke WriteLn, KLV_PROBEL
    jmp start

    metka1:
    invoke WriteLn, KV_NOPROBEL
    jmp start

    exit:
    call ReadChar
    call ExitProcess

    EOL equ '$'

    KLV_PROBEL db 'Љ« ўЁи  Їа®ЎҐ«', 13, EOL ; Клавиша пробел текст в кодировке IBM DOS
    KV_NOPROBEL db 'ЌҐ Їа®ЎҐ«',20h,20h,20h,20h,20h, 13, EOL ;

    ExitProcess:
    int 20h
    ret

    WriteLn:
    xchg ax, dx
    mov ah, 9h
    int 21h
    ret

    ReadChar:
    mov ah, 00h
    int 16h
    ret

     
    andXreiДата: Четверг, 23.04.2009, 21:56 | Сообщение # 3
    Майор
    Группа: Проверенные
    Сообщений: 95
    Репутация: 2
    Статус: Offline
    Quote (fasm)
    но можно еще поставить хук

    invoke SetWindowsHookEx,WH_KEYBOARD
    так что ли
    А вот как определить то что именно пробел был нажат??

    если не лень можно показать на примере??!

    Сообщение отредактировал andXrei - Пятница, 24.04.2009, 08:52
     
    fasmДата: Пятница, 24.04.2009, 19:18 | Сообщение # 4
    Admin
    Группа: Заблокированные
    Сообщений: 122
    Репутация: 5
    Статус: Offline
    Ну вот написал самый простой пример: http://fasm.moy.su/load/2-1-0-55 на здоровье
     
    andXreiДата: Пятница, 24.04.2009, 19:37 | Сообщение # 5
    Майор
    Группа: Проверенные
    Сообщений: 95
    Репутация: 2
    Статус: Offline
    А что обязательно нужна DLL-ка???
     
    fasmДата: Суббота, 25.04.2009, 18:44 | Сообщение # 6
    Admin
    Группа: Заблокированные
    Сообщений: 122
    Репутация: 5
    Статус: Offline
    да...
     
    andXreiДата: Среда, 29.04.2009, 10:50 | Сообщение # 7
    Майор
    Группа: Проверенные
    Сообщений: 95
    Репутация: 2
    Статус: Offline
    А как определить когда была нажата клавиша (любая)
    Что сравнивать??
    [hhook] c eax это?

    Или куда при нажатии клавиши записывается скан код её??

    Пытался сделать так:
    Доступно только для пользователей

    Сообщение отредактировал andXrei - Среда, 29.04.2009, 10:54
     
    fasmДата: Среда, 29.04.2009, 12:47 | Сообщение # 8
    Admin
    Группа: Заблокированные
    Сообщений: 122
    Репутация: 5
    Статус: Offline
    LoadLibrary - загружаем DLL
    GetProcAddress - ищем адрес нашей процедуры в dll
    SetWindowsHookEx - устанавливаем хук
    __________________________ DLL

    proc KeyboardProc, nCode, wparam, lparam
    invoke MessageBeep, NULL
    xor eax, eax
    invoke CreateFile, szFile, GENERIC_WRITE, FILE_SHARE_WRITE, eax, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, eax
    mov [hfile], eax
    invoke SetFilePointer, [hfile], NULL, NULL, FILE_END
    cinvoke wsprintf, key_buffer, format_buf, [wparam]
    invoke WriteFile, [hfile], key_buffer, 4, BytesOfWritten, 0
    invoke CloseHandle, [hfile]
    ret
    endp

    Если nCode = 0 нужно вообще то вызвать CallNextHookEx, ну думаю ты сам разберешься как...

    wParam - код клавиши... А lparam если возвращает 0 то клавиша отпущена, если 1 то клавиша нажата, точно не могу сказать сам этим делом серьезно не занимался...

     
    andXreiДата: Среда, 29.04.2009, 13:11 | Сообщение # 9
    Майор
    Группа: Проверенные
    Сообщений: 95
    Репутация: 2
    Статус: Offline
    cinvoke для чего нужна?
     
    fasmДата: Четверг, 30.04.2009, 13:34 | Сообщение # 10
    Admin
    Группа: Заблокированные
    Сообщений: 122
    Репутация: 5
    Статус: Offline
    Насколько помню это вызов процедуры методом CDECL, используется при вызове wsprintf и некоторых сишных функций...
     
    plitockiДата: Воскресенье, 07.06.2009, 22:16 | Сообщение # 11
    Рядовой
    Группа: Пользователи
    Сообщений: 1
    Репутация: 0
    Статус: Offline
    Очень интересная и полезная тема. Так держать smile
     
    • Страница 1 из 1
    • 1
    Поиск: