Page 1 of 1

Можно ли эмулировать нажатие клавиши?

Posted: Fri Jun 27, 2008 3:34 pm
by Asper
Вобщем одна программа должна посылать сообщение о нажатии клавиши другой программе.
Что-то типа sendkey в Win.

Re: Можно ли эмулировать нажатие клавиши?

Posted: Fri Jun 27, 2008 11:20 pm
by Gluk
Нет, в Колибри такого нет.. можно посылать сообщения о нажатии кнопок в приложении, и клавиши мыши. хотя то что ты сапрашиваешь мне пригодилось бы весьма и весьма..

Re: Можно ли эмулировать нажатие клавиши?

Posted: Sat Jun 28, 2008 10:25 am
by Asper
Мне бы тоже пригодилось для моей программы "Экранная клавиатура". Хотелось бы конечно добавить новую функцию Kolibri, но не знаю как к этому отнесутся разработчики ядра. Все-таки, по-моему, эта функция будет влиять на безопасность системы. :?

Re: Можно ли эмулировать нажатие клавиши?

Posted: Sat Jun 28, 2008 12:26 pm
by Serge
В Колибри нет безопасности системы. Вообще.

Re: Можно ли эмулировать нажатие клавиши?

Posted: Sat Jun 28, 2008 1:59 pm
by Gluk
я тоже хотел бы написать это приложение.. будет хорошо сочетаться с mousEmul)

Re: Можно ли эмулировать нажатие клавиши?

Posted: Thu Jul 03, 2008 4:04 pm
by Asper
Тогда предлагаю добавить эту функцию. Прошу проголосовать.

Вот что-то вроде заготовки: http://narod.ru/disk/1262852000/ZKEY.BIN.html

Re: Можно ли эмулировать нажатие клавиши?

Posted: Thu Jul 03, 2008 4:46 pm
by Serge
Asper

А как она будет реализована ?

Re: Можно ли эмулировать нажатие клавиши?

Posted: Thu Jul 03, 2008 5:14 pm
by Asper
Я не силен в асм, т.к. пишу в основном на С++, но общая идея такая:
Вход:
eax = как всегда номер функции
bl = код клавиши
ecx = PID процесса которому посылаем сообщение о нажатой клавише

1. В KEY_BUFF помещаем код нажатой клавиши
2. Посылаем через функцию proc send_event stdcall pid:dword, event:dword сообщение процессу о нажатии клавиши

Что-то вроде этого.

Re: Можно ли эмулировать нажатие клавиши?

Posted: Thu Jul 03, 2008 6:14 pm
by Gluk
это будет противоречить тому, что сообщения о нажатии (не горячих) клавиш получает только процесс с активным окном..

Re: Можно ли эмулировать нажатие клавиши?

Posted: Thu Jul 03, 2008 6:24 pm
by Asper
Ну что ж, в таком случае от PID готов отказаться.
Функция будет посылать сообщение процессу с активным окном CURRENT_TASK.

Re: Можно ли эмулировать нажатие клавиши?

Posted: Thu Jul 03, 2008 10:52 pm
by Leency
diamond (22:56:51 3/07/2008)
дык есть же такая
72.1 http://wiki.kolibrios.org/wiki/SysFn72/ru

Re: Можно ли эмулировать нажатие клавиши?

Posted: Fri Jul 04, 2008 1:21 am
by Asper
Спасибо Leency! То что надо! :D Скачал k_svn.803 и порывшись там немного действительно нашёл 72 функцию sys_sendwindowmsg. Документацию я к ней к сожалению не нашел (имеющаяся у меня дока заканчивается на 71 функции). Т.к. как я уже говорил в асме не силен, то хотелось бы чтобы кто-нибудь описал входные и выходные её параметры.

Code: Select all

sys_sendwindowmsg:
        dec     eax
        jnz     .ret
        cmp     ebx, 3
        jz      .sendbtn
        cmp     ebx, 2
        jnz     .ret
.sendkey:
...
        jmp     .ok
.overflow:
        popf
        mov     dword [esp+36], 1
        ret
.sendbtn:
...
.ok:
        popf
        and     dword [esp+36], 0
.ret:
Не совсем понял, sendkey получается 72.2, sendbtn 72.3, а 72.1 зачем?
:?

Re: Можно ли эмулировать нажатие клавиши?

Posted: Fri Jul 04, 2008 9:16 am
by Alver
Asper
Документацию я к ней к сожалению не нашел
Плохо смотришь, смотри в 'svn/kernel/trunk/docs/sysfuncr.txt'
Там все функции описаны.

Code: Select all

============================================
==== Функция 72 - послать сообщение окну. =====
============================================
--- Подфункция 1 - послать сообщение с параметром активному окну. ----
Параметры:
  * eax = 72 - номер функции
  * ebx = 1 - номер подфункции
  * ecx = код события: 2 или 3
  * edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3
Возвращаемое значение:
  * eax = 0 - успешно
  * eax = 1 - буфер заполнен

Re: Можно ли эмулировать нажатие клавиши?

Posted: Sat Jul 05, 2008 4:25 pm
by Asper
Спасибо Alver,теперь все стало ясно.

Re: Можно ли эмулировать нажатие клавиши?

Posted: Mon Jul 14, 2008 8:25 pm
by Asper
Вот, что получилось:
http://narod.ru/disk/1464301000/ZKEY%200.3.rar.html
и код, если кому интересно:
http://narod.ru/disk/1464377000/ZKEY%20 ... e.rar.html

Посылает скан коды нажатых(down) клавиш приложениям. Чтобы посылать сообщение нужному окну, нужно это окно активировать, а потом активировать ZKEY.