Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Ctrl+Alt+Shift


Автор: sharq 19.12.2005, 14:10
Есть резидентная программа на асме, как сделать, чтобы некоторая функция активизировалась, только после нажатия комбинации Ctrl+Alt+Shift.

Я пробовал считывать последовательно с порта нажатие и отжатие этих клавиш, но событие не проходило... оставил только по нажатию Ctrl, тогда работает.

Код

        in  AL, 60h ; read port 60h - SCAN code key
        cmp AL, 29 ; ctrl down
        ; je CTRLDOWN
        ; jmp STOP
        
        ; CTRLDOWN:
            ; in  AL, 60h ;
            ; cmp AL, 157 ; ctrl up
            ; je ALT
            ; jmp STOP
            
            ; ALT:
                ; cmp AL, 56 ; alt down
                ; je ALTDOWN
                ; jmp STOP
                
                ; ALTDOWN:
                    ; cmp AL, 184 ; alt down
                    ; je SHIFT
                    ; jmp STOP
                    
                    ; SHIFT:
                        ; cmp AL, 42 ; shift up
                        je PROCESS
                        jmp STOP
        
        PROCESS:
            mov CS:flag, 1
            jmp STOP
        
        STOP:
            ...


В чем ошибка? Может не так надо?

Автор: Akina 19.12.2005, 14:16
Код

xor ax,ax
mov es,ax
mov al, byte ptr es:[417h]
test al,00001100b
jz not_Ctrl_Alt_Shift
and al,00000011b
jz not_Ctrl_Alt_Shift
Ctrl_Alt_Shift:
; .....
not_Ctrl_Alt_Shift:
; .....

Автор: SergeCpp 19.12.2005, 14:19
А чем флаги БИОС не устраивают ?

И на память они мапятся...

Автор: Akina 19.12.2005, 14:22
sharq
Кстати... а ихде ты это вот - in AL, 60h - делаешь? в программе, что ли???

Автор: SergeCpp 19.12.2005, 14:23
Ctrl_Alt_Del — ему Shift нужен...

А для CtrlAltDel перехватчик в INT 9 свой есть — он досюда не пустит
 
Добавлено @ 14:24 
Или ему надо INT 9 перехватывать и делать в памяти свой флаг...
 
Добавлено @ 14:27 
http://sergecpp.mylivepage.ru/file/1/90/

Автор: Akina 19.12.2005, 16:28
Цитата(SergeCpp @ 19.12.2005, 15:23)
Ctrl_Alt_Del — ему Shift нужен...

Спасибо. Опечатка. На автомате. Опять же привычка smile

Автор: sharq 19.12.2005, 17:15
Akina спасибо за решение, но меня интересует, как сделать это через порт, используя in AL, 60h

Цитата(Akina @ 19.12.2005, 15:22)
Кстати... а ихде ты это вот - in AL, 60h - делаешь? в программе, что ли???

Именно, смотри мой пост http://forum.vingrad.ru/index.php?showtopic=74803.

smile

Автор: SergeCpp 19.12.2005, 17:29
Тебе надо INT 9 перехватывать и делать в памяти свой флаг...

http://sergecpp.mylivepage.ru/file/1/90/

Или будет бяка...

INT 9 и твоя прога подерутся!

Сильно!

Автор: Akina 19.12.2005, 18:33
Цитата(sharq @ 19.12.2005, 18:15)
меня интересует, как сделать это через порт, используя in AL, 60h

Что значит как... не хочешь смотреть low memory - сам детекти нажатие-отпускание модификаторов и тести по флагу:

Код

in AL, 60h
cmp al,Left_Shift_ScanCode
jne next_1
or byte ptr cs:Shift_Status,1
next_1:
cmp al,Right_Shift_ScanCode
jne next_2
or byte ptr cs:Shift_Status,1
next_2:
cmp al,Left_Alt_ScanCode
jne next_3
or byte ptr cs:Shift_Status,2
next_3:
cmp al,Right_Alt_ScanCode
jne next_4
or byte ptr cs:Shift_Status,2
next_4:
cmp al,Left_Ctrl_ScanCode
jne next_5
or byte ptr cs:Shift_Status,4
next_5:
cmp al,Right_Ctrl_ScanCode
jne next_6
or byte ptr cs:Shift_Status,4
next_6:
; ...

типа такого... но где смысл?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)