Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: перехват клавиш ctrl+<цифра или буква>  (Прочитано 9314 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Anonymous
Гость
« : 24-12-2003 08:44 » 

Пожалуйста, если кто знает (срочно нужно), подскажите, как реализовать перехват.
-----
Задача у меня такая:
пользователь сам задает клавишу(цифру или букву), при нажатии которой в сочетании с ctrl будет происходить обработка (неважно какая).
Может надо воспользоваться прерыванием (09)? Но тогда как задать маску указанную пользователем
(или вообще - как формируется (генерируется) сочетание ctrl+" ")?
Ребятя выручайте, самому разбираться нет времени :oops:
Записан
Tema
Гость
« Ответ #1 : 24-12-2003 17:53 » 

Вроде так.

Клавишу, которая используется с Ctrl сохрани в переменную в основном коде программы.
Для начала тебе требуется заменить стандартный обработчик клавы на свой:
; сохранить адрес предыдущего обработчика прерывания 09h
        mov     ax,3509h
        int        21h
        mov     word ptr old_int09h,bx
        mov     word ptr old_int09h+2,es
; установить наш обработчик
        mov     ax,2509h
        mov     dx,offset int09h_handler
        int     21h
Далее пиши свою программу, но в конце добавь:
; восстановить предыдущий обработчик прерывания
        mov     ax,2509h
        mov     dx,word ptr old_int09h+2
        mov     ds,dx
        mov     dx,word ptr cs:old_int09h
        int     21h

Обработчик будет выглядеть так:
int09h_handler  proc    far
        pusha
        push    es      ; сохранить ВСЕ регистры
        push    ds
        push    cs
        pop     ds

        push    0040h
        pop     ds
        mov     di,word ptr ds:001Ah    ; адрес головы буфера клавиатуры
        cmp     di,word ptr ds:001Ch    ; если он равен адресу хвоста,
        je      exit_handler            ; буфер пуст, и нам делать нечего

        mov     ax,word ptr [di]        ; иначе: считать символ
        cmp     ah,byte ptr БУКВА
        jne     exit_handler

        mov     al,byte ptr ds:0017h ; считать байт состояния клавиатуры,
        test    al,04h                      ; если не нажат Ctrl,
        jz      exit_handler             ; выйти,
Потом пиши свой код. А в конце:
        mov     word ptr ds:001Ch,di ;установить адреса
                                        ; головы и хвоста буфера одинаковыми,
                                        ; пометив его тем самым как пустой
exit_handler:
        pop     ds              ; восстановить все регистры
        pop     es
        popa
        jmp     cs:old_int09h ; передать управление предыдущему обработчику
Записан
Anonymous
Гость
« Ответ #2 : 25-12-2003 06:16 » 

Я шокирован!  Да это же, практически готовый - резидент  Показываю язык       Я на это даже не расчитывал.
Tema, спасибо Вам огромное!!!
Записан
Xeysan
Гость
« Ответ #3 : 25-12-2003 10:23 » 

Только я так и понял, кто пишет в буфер до твоего обработчика  Улыбаюсь Предыдущий обработчик делает это в самом конце...Т.е. клавишу ты получишь, только при отпускании.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines