Индикатор клавиатуры

...
  • если у ПО есть интерфейс, неплохо было бы его продемонстрировать на скриншотах.. (напр. именно сейчас мне хотелось бы взглянуть - но нет возможности закинуть файл в образ, а EXT4 и флешки на этой системе не видны)
    а программа нужная, у меня на ноутбуке только капслока лампочка есмь =(
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Я уже упоминал, что как раз интерфейс не проработан. На данный момент программка выглядит так... В заголовке окна - 3 символа. Если символ "о", значит индикатор не горит, если "*" - горит. Программа работает даже когда её окно неактивно.
    Attachments
    003.png
    003.png (694 Bytes)
    Viewed 8906 times
    002.png
    002.png (748 Bytes)
    Viewed 8905 times
    001.png
    001.png (800 Bytes)
    Viewed 8905 times
  • Отлично, осталось только научить её встраиваться в панель, как апплет.
  • там уж проще новую рисовать

    для моей панели требуется чтобы программа умела рисовать в память, в том масштабе, который ей укажут (указывают один из размеров, второй она должна сообщить в ответ), причем, как в вертикальной, так и горизонтальной ориентации. Ну там еще протокол взаимодействия, но это на самом деле мелочи, и протокол пока в разработке.

    P.S. как только закончится реализация хоть чего-то из следующего: SVG, BFG(vs), Flash, программа сможет не беспокоиться о масштабировании, а пока так
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • может быть стоит попробовать для этой программы сделать подключение библиотеки box_lib и использовать для индикации элементы checbox2 ?
    Attachments
    это может выглядеть так
    keybi.png (1.67 KiB)
    это может выглядеть так Viewed 8850 times
  • зачем такой программе окно со скином? сделайте как моя battery, без скина, появляется/исчезает по горячей клавише окно
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • по горячей клавише
    не годится. с таким же успехом можно напечатать символ, убедиться, что зажата клавиша CapsLock, стереть символ и выключить CapsLock. а вот box_lib я бы попробовал (интересно, есть ли на svn примеры и можно ли сделать checkbox2 неактивным). хотя можно просто прямоугольники рисовать...
  • Albom wrote:и можно ли сделать checkbox2 неактивным
    можно, для этого нужно не делать вызовы функций check_box_mouse2
    Albom wrote:хотя можно просто прямоугольники рисовать...
    можно, но если вдруг возникнет необходимость менять состояние клавиатуры при нажатии мышкой в окно программы, тогда лучше всего сделать через checkbox

    Код может быть таким:
    Spoiler:use32
    org 0x0
    db 'MENUET01' ;ид. исполняемого файла всегда 8 байт
    dd 0x1
    dd start
    dd i_end ;размер приложения
    dd mem
    dd stacktop
    dd 0
    dd sys_path

    include 'e:/kolibri/svn/programs/macros.inc'
    include 'e:/kolibri/svn/programs/proc32.inc'
    include 'e:/kolibri/svn/programs/develop/libraries/box_lib/load_lib.mac'
    include 'e:/kolibri/svn/programs/develop/libraries/box_lib/trunk/box_lib.mac'
    include 'mem.inc'
    ;include 'dll.inc'

    @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load
    caption db 'Key',0 ;подпись окна

    align 4
    start:
    load_libraries l_libs_start,l_libs_end
    mcall 48,3,sc,sizeof.system_colors
    mcall 40,0x27

    init_checkboxes2 check_boxes,check_boxes_end


    align 4
    red_win:
    call draw_window


    align 4
    still:
    mcall 10

    cmp al,1 ;изм. положение окна
    jz red_win
    ;cmp al,2
    ;jz key
    cmp al,3
    jz button

    stdcall [check_box_mouse], ch1
    stdcall [check_box_mouse], ch2
    stdcall [check_box_mouse], ch3

    jmp still


    align 4
    draw_window:
    pushad
    mcall 12,1
    xor eax,eax
    mov ebx,(10 shl 16)+100
    mov ecx,(10 shl 16)+80
    mov edx,[sc.work]
    or edx,(3 shl 24)+0x10000000+0x20000000
    mov edi,caption
    int 0x40

    stdcall [check_box_draw], ch1
    stdcall [check_box_draw], ch2
    stdcall [check_box_draw], ch3
    mcall 12,2
    popad
    ret

    ;align 4
    ;key:
    ; mcall 2
    ; jmp still


    align 4
    button:
    mcall 17
    cmp ah,1
    jne still
    .exit:
    mcall -1


    check_boxes:
    ch1 check_box2 (5 shl 16)+15,(5 shl 16)+10,5, 0xffffff,0x8000,0xff,\
    txt_160,0+ch_flag_middle
    ch2 check_box2 (5 shl 16)+15,(17 shl 16)+10,5, 0xffffff,0x8000,0xff,\
    txt_159,0+ch_flag_middle
    ch3 check_box2 (5 shl 16)+15,(29 shl 16)+10,5, 0xffffff,0x8000,0xff,\
    txt_158,0+ch_flag_middle
    check_boxes_end:

    txt_160 db 'Num',0
    txt_159 db 'Caps',0
    txt_158 db 'Scroll',0

    head_f_i:
    head_f_l db 'Системная ошибка',0

    system_dir_0 db '/sys/lib/'
    lib_name_0 db 'box_lib.obj',0
    err_msg_found_lib_0 db 'Не найдена библиотека box_lib.obj',0
    err_msg_import_0 db 'Ошибка при импорте библиотеки box_lib',0

    l_libs_start:
    lib_0 l_libs lib_name_0, sys_path, library_path, system_dir_0,\
    err_msg_found_lib_0,head_f_l,import_box_lib,err_msg_import_0,head_f_i
    l_libs_end:

    align 4
    import_box_lib:
    init dd sz_init
    init_checkbox dd sz_init_checkbox
    check_box_draw dd sz_check_box_draw
    check_box_mouse dd sz_check_box_mouse
    dd 0,0
    sz_init db 'lib_init',0
    sz_init_checkbox db 'init_checkbox2',0
    sz_check_box_draw db 'check_box_draw2',0
    sz_check_box_mouse db 'check_box_mouse2',0

    mouse_dd dd 0x0
    sc system_colors

    align 16
    procinfo process_information

    i_end:
    rb 1024
    stacktop:
    sys_path rb 1024
    library_path rb 1024
    mem:
    Флаг установленного чек бокса:

    Code: Select all

    ch_flag_en = 10b
    Для изменения флага нужно менять 2-й бит. Нумерация битов в bt, bts, btr идет с 0 то 2-й будет под номером 1:

    Code: Select all

    bt dword[ch1.flags],1 ;проверка ( перенесение в cf )
    bts dword[ch1.flags],1 ;установка
    btr dword[ch1.flags],1 ;сброс
  • Albom, а что, действительно возюканье мышью по маршруту Меню-Системные-Железо-Индикаторы_клавиатуры будет быстрее чем Ctrl+Alt+i ?
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • может делать так - когда капс лок включен - индикатор раскладки показывает большими буквами "EN", например, когда выключен - маленькими "en", например
  • Gluk
    возюканья мыши не будет, так как если индикатор будет нужен, он будет постоянно висеть где-нибудь в уголке.

    IgorA
    Спасибо за код! Будет время, скомпоную всё воедино.

    XVilka
    Спасибо! Отличная идея! Для большинства случаев индикации CapsLock достаточно. Будет время - и в код панели залезу. :)
  • Albom, "будет постоянно висеть где-нибудь" - тогда тем более окно со скином ни к чему, раз сворачиваться/закрываться приложение не будет
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Попробовал объединить свой код с файлом keybi.asm,
    сделал несколько упрощений в своем коде. Окно сделал без скина.
    Spoiler:; Keyboard indicators v0.1
    ; by Albom

    use32
    org 0
    db 'MENUET01'
    dd 1
    dd _start
    dd _end
    dd _memory
    dd stacktop
    dd 0
    dd sys_path

    include 'e:/kolibri/svn/programs/macros.inc'
    include 'e:/kolibri/svn/programs/proc32.inc'
    include 'e:/kolibri/svn/programs/develop/libraries/box_lib/load_lib.mac'
    include 'e:/kolibri/svn/programs/develop/libraries/box_lib/trunk/box_lib.mac'
    ;include 'mem.inc'
    ;include 'dll.inc'

    @use_library ;_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load

    align 4
    _start:
    load_libraries l_libs_start,l_libs_end
    mcall 48,3,sc,sizeof.system_colors
    mcall 40,0x27

    init_checkboxes2 check_boxes,check_boxes_end
    check_boxes_set_sys_color2 check_boxes,check_boxes_end,sc
    call _key_set

    align 4
    red_win:
    call draw_window


    align 4
    still:
    mcall 10

    cmp al,1 ;изм. положение окна
    jz red_win
    cmp al,2
    jz key
    cmp al,3
    jz button

    ;stdcall [check_box_mouse], ch1
    ;stdcall [check_box_mouse], ch2
    ;stdcall [check_box_mouse], ch3

    jmp still

    ;установить общесистемные "горячие клавиши"
    align 4
    _key_set:
    mov eax, 66
    mov ebx, 4
    mov edx, 0
    mov cl, 69
    int 0x40

    mov eax, 66
    mov ebx, 4
    mov edx, 0
    mov cl, 58
    int 0x40

    mov eax, 66
    mov ebx, 4
    mov edx, 0
    mov cl, 70
    int 0x40

    ret

    align 4
    draw_window:
    pushad
    mcall 12,1
    xor eax,eax
    mov ebx,(10 shl 16)+100
    mov ecx,(10 shl 16)+75
    mov edx,[sc.work]
    or edx,(2 shl 24)+0x10000000+0x20000000
    mov edi,[sc.grab] ;[sc.frame]
    mov esi,[sc.grab]
    int 0x40

    mov eax,8
    mov ebx,(80 shl 16)+10
    mov cx,-15
    shl ecx,16
    mov cx,10
    mov edx,1
    mov esi,[sc.grab_button]
    int 0x40

    stdcall [check_box_draw], ch1
    stdcall [check_box_draw], ch2
    stdcall [check_box_draw], ch3
    mcall 12,2
    popad
    ret

    align 4
    key:
    mcall 2
    call _indicators_check
    jmp still

    align 4
    _indicators_check:
    pusha
    mov eax, 66
    mov ebx, 3
    int 40h

    test_ins:
    test eax, 0x80
    jz @f
    bts dword[ch1.flags],1
    jmp test_caps
    @@:
    btr dword[ch1.flags],1

    test_caps:
    test eax, 0x40
    jz @f
    bts dword[ch2.flags],1
    jmp test_scroll
    @@:
    btr dword[ch2.flags],1

    test_scroll:
    test eax, 0x100
    jz @f
    bts dword[ch3.flags],1
    jmp test_ok
    @@:
    btr dword[ch3.flags],1

    test_ok:
    call draw_window
    popa
    ret

    align 4
    button:
    mcall 17
    cmp ah,1
    jne still
    .exit:
    mcall -1


    check_boxes:
    ch1 check_box2 (5 shl 16)+15,(5 shl 16)+10,5, 0xffffff,0x8000,0xff,\
    txt_160,0+ch_flag_middle
    ch2 check_box2 (5 shl 16)+15,(17 shl 16)+10,5, 0xffffff,0x8000,0xff,\
    txt_159,0+ch_flag_middle
    ch3 check_box2 (5 shl 16)+15,(29 shl 16)+10,5, 0xffffff,0x8000,0xff,\
    txt_158,0+ch_flag_middle
    check_boxes_end:

    txt_160 db 'Num',0
    txt_159 db 'Caps',0
    txt_158 db 'Scroll',0

    head_f_i:
    head_f_l db 'Системная ошибка',0

    system_dir_0 db '/sys/lib/'
    lib_name_0 db 'box_lib.obj',0
    err_msg_found_lib_0 db 'Не найдена библиотека box_lib.obj',0
    err_msg_import_0 db 'Ошибка при импорте библиотеки box_lib',0

    l_libs_start:
    lib_0 l_libs lib_name_0, sys_path, library_path, system_dir_0,\
    err_msg_found_lib_0,head_f_l,import_box_lib,err_msg_import_0,head_f_i
    l_libs_end:

    align 4
    import_box_lib:
    ;init dd sz_init
    init_checkbox dd sz_init_checkbox
    check_box_draw dd sz_check_box_draw
    check_box_mouse dd sz_check_box_mouse
    dd 0,0
    ;sz_init db 'lib_init',0
    sz_init_checkbox db 'init_checkbox2',0
    sz_check_box_draw db 'check_box_draw2',0
    sz_check_box_mouse db 'check_box_mouse2',0

    ;mouse_dd dd 0x0
    sc system_colors

    _end:
    align 32
    rb 2048
    stacktop:
    sys_path rb 1024
    library_path rb 1024
    _memory:
    Почему то у меня в KlbrInWin программа с окном без скина не запускается, а в Qemu все нормально. Если автор программы не против можно кинуть на svn, предварительно заменив пути к файлам в includ-ах на относительные.
    Можно ли программно менять состояние кнопок Num, Caps, Scroll или это зависит только от клавиатуры ? Если да то можно еще сделать что-бы при нажатии на checkbox в окне программы менялись состояния кнопок.
    Attachments
    окно без скина
    keybi.png (2.25 KiB)
    окно без скина Viewed 8754 times
  • В KlbrInWin (по крайней мере в версии, которая у меня) и состояние клавиш не получится получить. Так что я тоже при разработке использую QEMU.
    Насчёт программного изменения состояния... В учебниках такого не написано (пишут, что можно зажигать индикаторы, но контроллер всё равно переключит их), но думаю, что нужно всё равно документацию почитать.
    Как соавтор я обеими руками за svn, даже спрашивать не нужно было. Сейчас заменил пути, дописал IgorA в соавторы, изменил версию на 0.2 и залил на SVN.
    Так почему все так против окна со скином? :) (не пойму) :)
    А в целом неплохая программка получилась! :)
  • Who is online

    Users browsing this forum: No registered users and 3 guests