เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเปƒเบซเบกเปˆเบ‚เบญเบ‡ Punto Switcher เบชเปเบฒเบฅเบฑเบš linux: xswitcher

เบเบฒเบ™เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ xneur เป„เบ”เป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เป‰เบญเบเบ—เบธเบเบ—เปเบฅเบฐเบกเบฒเบ™เปƒเบ™เป„เบฅเบเบฐเบซเบปเบเป€เบ”เบทเบญเบ™เบœเปˆเบฒเบ™เบกเบฒ. (เบเบฑเบšเบเบฒเบ™เบกเบฒเป€เบ–เบดเบ‡เบ‚เบญเบ‡ OpenSUSE 15.1 เปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ•เบฑเป‰เบ‡เป‚เบ•เบฐเบ‚เบญเบ‡เบ‚เป‰เบญเบ: เบ”เป‰เบงเบ xneur เป€เบ›เบตเบ”เปƒเบŠเป‰, windows เบชเบนเบ™เป€เบชเบเบˆเบธเบ”เบชเบธเบกเปเบฅเบฐ flicker เบ•เบฐเบซเบฅเบปเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เป‰เบญเบ™เปเบ›เป‰เบ™เบžเบดเบก).

"เป‚เบญเป‰, เบ‚เปเบญเบฐเป„เบž, เบ‚เป‰เบญเบเป€เบฅเบตเปˆเบกเบžเบดเบกเบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡" - เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ‚เป‰เบญเบเบกเบฑเบ™เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป€เบฅเบทเป‰เบญเบเป†เป€เบฅเบทเป‰เบญเบเป†. เปเบฅเบฐเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เป€เบžเบตเปˆเบกเบซเบเบฑเบ‡เปƒเบ™เบ—เบฒเบ‡เบšเบงเบ.

เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเปƒเบซเบกเปˆเบ‚เบญเบ‡ Punto Switcher เบชเปเบฒเบฅเบฑเบš linux: xswitcher
เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบ‚เป‰เบญเบ (เป€เบ›เบฑเบ™เบงเบดเบชเบฐเบงเบฐเบเบญเบ™เบญเบญเบเปเบšเบš) เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™. เปเบ•เปˆเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™ (เบ—เปเบฒเบญเบดเบ”เบˆเบฒเบ Punto Switcher, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เบญเบšเปƒเบˆเบเบฑเบš Windows Vista, เบชเบธเบ”เบ—เป‰เบฒเบเป„เบ”เป‰เบ›เปˆเบฝเบ™เป„เบ› Linux, เบˆเบฒเบ xneur) เบชเบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เปเบ—เป‰เป†. เป‚เบ”เบเบฎเบนเป‰เบงเปˆเบฒเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเปƒเบ™เบซเบ™เป‰เบฒเบˆเปเปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡ (เบกเบฑเบ™เบกเบฑเบเบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบžเบดเบกเบ„เปเบฒเปƒเบซเบกเปˆ), เบขเบธเบ”เบขเบนเปˆ "เบขเบธเบ”เบŠเบปเปˆเบงเบ„เบฒเบง / เบขเบธเบ”". เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบžเบดเบก.

เปƒเบ™เป€เบงเบฅเบฒเบ™เบตเป‰, เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบกเบตเบญเบฑเบ”เบ•เบฒเบชเปˆเบงเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ / เบ„เบงเบฒเบกเบŠเบฑเบšเบŠเป‰เบญเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ” (เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ‚เบญเบ‡เบ‚เป‰เบญเบ). เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเปเบšเปˆเบ‡เบ›เบฑเบ™.

TL.DR

เบกเบฑเบ™เบˆเบฐเบกเบตเบ—เบธเบเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™เบ•เปเปˆเบกเบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปเบฒเบญเบดเบ” - เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ "เปเบ•เบฐ" เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เบงเบฒเบกโ€‹เบญเบปเบ”โ€‹เบ—เบปเบ™โ€‹เป„เบ”เป‰โ€‹.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบถเบ”เบ•เบดเบเปเบฒเบ•เปเปˆเป„เบ›เบ™เบตเป‰เปเบกเปˆเบ™ hardcoded:

  • โ€œPause/Breakโ€: backspaces เบ„เปเบฒเบชเบธเบ”เบ—เป‰เบฒเบ, เบชเบฐเบซเบผเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบงเบฒเบ‡เบขเบนเปˆเปƒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ—เบตเปˆเปƒเบŠเป‰เป„เบ”เป‰ (เบฅเบฐเบซเบงเปˆเบฒเบ‡ 0 เปเบฅเบฐ 1) เปเบฅเบฐเป‚เบ—เบซเบฒเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡.
  • โ€œCtrl เบŠเป‰เบฒเบเป‚เบ”เบเบšเปเปˆเบกเบตเบญเบฑเบ™เปƒเบ”เป€เบฅเบตเบโ€: เบชเบฐเบซเบผเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบงเบฒเบ‡เบขเบนเปˆเปƒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ—เบตเปˆเปƒเบŠเป‰เบ‡เบฒเบ™ (เบฅเบฐเบซเบงเปˆเบฒเบ‡ 0 เปเบฅเบฐ 1).
  • โ€œเบŠเป‰เบฒเบ Shift เป‚เบ”เบโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบซเบเบฑเบ‡โ€: เป€เบ›เบตเบ”โ€‹เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบงเบฒเบ‡โ€‹เป€เบฅเบ 0 เปƒเบ™โ€‹เบ›เปˆเบญเบ‡โ€‹เบขเป‰เบฝเบกโ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹.
  • โ€œเบ‚เบงเบฒ Shift เป‚เบ”เบโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบซเบเบฑเบ‡โ€: เป€เบ›เบตเบ”โ€‹เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบงเบฒเบ‡โ€‹เบญเบฑเบ™โ€‹เบ”เบฑเบš 1 เปƒเบ™โ€‹เบ›เปˆเบญเบ‡โ€‹เบขเป‰เบฝเบกโ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹.

เบˆเบฒเบเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเบ›เบฑเบšเปเบ•เปˆเบ‡เบžเบถเบ”เบ•เบดเบเปเบฒ. เบ–เป‰เบฒเบšเปเปˆเบกเบตเบ„เปเบฒเบ•เบดเบŠเบปเบก, เบกเบฑเบ™เบšเปเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ (เบ‚เป‰เบญเบเบ”เบตเบเบฑเบšเบกเบฑเบ™เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก). เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบŠเบทเปˆเบญเบงเปˆเบฒเปƒเบ™Habรฉเบˆเบฐเบกเบตเบญเบฑเบ”เบ•เบฒเบชเปˆเบงเบ™เบžเบฝเบ‡เบžเปเบ‚เบญเบ‡เบœเบนเป‰เบŠเบปเบกเบ—เบตเปˆเบกเบตเบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™.

NB เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เปƒเบ™เบชเบฐเบšเบฑเบšเบ›เบฐเบˆเบธเบšเบฑเบ™, keylogger เปเบกเปˆเบ™เบ•เบดเบ”เบเบฑเบš "/dev/input/", xswitcher เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ”เป‰เบงเบเบชเบดเบ”เบ—เบดเบ‚เบญเบ‡เบฎเบฒเบ:

chown root:root xswitcher
chmod +xs xswitcher

เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”: เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบต suid เบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™เบฎเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒ เปƒเบœเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบˆเบฐเบ–เบทเบเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ suid เปƒเบ™เป€เบงเบฅเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

Paranoids (เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบกเบตเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™) เบชเบฒเบกเบฒเบ” clone เบˆเบฒเบ GIT เปเบฅเบฐเบ›เบฐเบเบญเบšเบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠ. เป€เบŠเบฑเปˆเบ™เบงเปˆเบฒ:

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev

cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go

เป€เบžเบตเปˆเบก autostart เบเบฑเบšเบฅเบปเบ”เบŠเบฒเบ” (เบ‚เบถเป‰เบ™เบเบฑเบš DE).

เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, "เบšเปเปˆเป„เบ”เป‰เบ‚เป porridge" (โ‰ˆ30 เบงเบดเบ™เบฒเบ—เบต CPU เบ•เปเปˆเบกเบทเป‰, โ‰ˆ12 MB เปƒเบ™ RSS).

เป€เบšเบดเปˆเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ - เบฅเบฒเบเบฅเบฐเบญเบฝเบ”.

เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ—เบฑเบ‡เปเบปเบ”เปเบกเปˆเบ™เป„เบ”เป‰เบญเบธเบ—เบดเบ”เบ•เบปเบ™เป€เบžเบทเปˆเบญเป‚เบ„เบ‡เบเบฒเบ™เบชเบฑเบ”เบฅเป‰เบฝเบ‡เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เปเบฅเบฐเบ‚เป‰เบญเบเบ‚เบตเป‰เบ„เป‰เบฒเบ™เป€เบเบตเบ™เป„เบ›เบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบญเบฑเบ™เบญเบทเปˆเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ–เบทเบเบฅเบงเบšเบฅเบงเบก (เบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™เป‚เบŸเบ™เป€เบ”เบต) เปเบฅเบฐเบเบงเบกเป€เบญเบปเบฒเป‚เบ”เบ AGPL ("เบชเบดเบ”เบ—เบดเบšเบฑเบ”เบเป‰เบญเบ™เบเบฑเบš").

เบฅเบฐเบซเบฑเบ” xswitcher เบ–เบทเบเบ‚เบฝเบ™เป€เบ›เบฑเบ™ golang, เบกเบตเบเบฒเบ™เบฅเบงเบกเป€เบญเบปเบฒ C. เบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”, เบกเบฑเบ™เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบตเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ” (เบกเบฒเบฎเบญเบ”เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบฑเบ™เบกเบต). เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เบฒเบ”เบซเบฒเบเป„เบ›เป‚เบ”เบเปƒเบŠเป‰ cgo.

เบ‚เปเป‰เบ„เบงเบฒเบกเบกเบตเบ„เปเบฒเป€เบซเบฑเบ™เบเปˆเบฝเบงเบเบฑเบšเบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบ–เบทเบเบขเบทเบกเบกเบฒเบˆเบฒเบเปเบฅเบฐเบเป‰เบญเบ™เบซเบเบฑเบ‡. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบฅเบฐเบซเบฑเบ” xneur "เบšเปเปˆเป„เบ”เป‰เบ”เบปเบ™เปƒเบˆเบ‚เป‰เบญเบ", เบ‚เป‰เบญเบเป€เบญเบปเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ loloswitcher.

เบเบฒเบ™เปƒเบŠเป‰ "/dev/input/" เบกเบตเบ—เบฑเบ‡เบ‚เปเป‰เบ”เบตเบ‚เบญเบ‡เบกเบฑเบ™ (เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เป€เบซเบฑเบ™เป„เบ”เป‰, เบฅเบงเบกเบ—เบฑเบ‡เบ›เบธเปˆเบกเบเบปเบ”เบŠเป‰เบณเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”) เปเบฅเบฐเบ‚เปเป‰เป€เบชเบ. เบ‚เปเป‰เป€เบชเบเปเบกเปˆเบ™:

  • เป€เบฎเบฑเบ”เบŠเป‰เบณเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” (เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ” โ€œ2โ€) เบšเปเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบŠเปเป‰เบฒเบ„เบทเบ™เบเบฑเบš x.
  • เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบœเปˆเบฒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบŸเบ” X11 เปเบกเปˆเบ™เบšเปเปˆเป€เบซเบฑเบ™เป„เบ”เป‰ (เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡ VNC, เบ•เบปเบงเบขเปˆเบฒเบ‡).
  • เบ•เป‰เบญเบ‡เบเบฒเบ™เบฎเบฒเบ.

เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบˆเบญเบ‡เป€เบซเบ”เบเบฒเบ™ X เบœเปˆเบฒเบ™ "XSelectExtensionEvent()". เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰ เบฅเบฐเบซเบฑเบ” xinput. เบ‚เป‰เบญเบเบšเปเปˆเบžเบปเบšเบซเบเบฑเบ‡เปเบšเบšเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเป„เบ›, เปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบซเบเบฒเบšเบ„เบฒเบเบ—เบฑเบ™เบ—เบตเป„เบ”เป‰เป€เบญเบปเบฒเบฅเบฐเบซเบฑเบ” C เป€เบ›เบฑเบ™เบฎเป‰เบญเบเป€เบชเบฑเป‰เบ™. เป€เบญเบปเบฒเบกเบฑเบ™เบซเบฅเบตเบเป„เบ›เบ—เบฒเบ‡เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™.

เบœเบปเบ™เบœเบฐเบฅเบดเบ” "เบ›เบตเป‰เบ™เบเบฑเบšเบเบฑเบ™" เบ›เบฐเบˆเบธเบšเบฑเบ™เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™ screwing เปเบ›เป‰เบ™เบžเบดเบก virtual. เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเบœเบนเป‰เบ‚เบฝเบ™เบ‚เบญเบ‡ keybd_event, เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบšเปเปˆเบกเบตเบ•เบปเบงเบ•เบปเบ™เบกเบตเบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เป€เบเบตเบ™เป„เบ›เปเบฅเบฐเบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเป€เบฎเบฑเบ”เปƒเบซเบกเปˆเบ•เบทเปˆเบกเบญเบตเบ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ‚เป‰เบญเบเปƒเบŠเป‰เบ›เบธเปˆเบก Win เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เป€เบžเบทเปˆเบญเป€เบฅเบทเบญเบเปเบ–เบงเบ—เบต 3. เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆ Win เบŠเป‰เบฒเบเบ–เบทเบเบชเบปเปˆเบ‡เบเบฑเบšเบ„เบทเบ™.

เบšเบฑเบเบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบ

  • เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบฎเบนเป‰เบซเบเบฑเบ‡เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™ "เบ›เบฐเบเบญเบš" (เบ•เบปเบงเบขเปˆเบฒเบ‡: ยฝ). เบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™.
  • เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบซเบผเบตเป‰เบ™ Win เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบกเบฑเบ™เบ—เปเบฒเบฅเบฒเบเบเบฒเบ™เป€เบ™เบฑเป‰เบ™เบซเบ™เบฑเบเปƒเบชเปˆ.
  • เบšเปเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบงเบดโ€‹เป€เบ„เบฒเบฐโ€‹เบเบฒเบ™โ€‹เบ›เป‰เบญเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เปเบˆเป‰เบ‡โ€‹. เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เบกเบตเบซเบผเบฒเบเบซเบ™เป‰เบฒเบ—เบตเปˆ: เบ›เบฝเบšเบ—เบฝเบš(), CtrlSequence(), RepeatSequence(), SpaceSequence(). ะกะฟะฐัะธะฑะพ nsmcan เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบนเปเบฅเบ‚เบญเบ‡เบ—เปˆเบฒเบ™: เปเบเป‰เป„เบ‚เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบ—เบตเปˆเบ™เบตเป‰. เบ”เป‰เบงเบเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบšเปเบกเบ‡เป„เบกเป‰เปƒเบ™เป€เบงเบฅเบฒเบ›เปˆเบฝเบ™เปเบ—เบ™.
    เปƒเบ™เบˆเบธเบ”เบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบฎเบนเป‰ "เบงเบดเบ—เบตเบเบฒเบ™" เปเบฅเบฐเบเบดเบ™เบ”เบตเบ•เป‰เบญเบ™เบฎเบฑเบšเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ”เป†.
  • (เป‚เบญเป‰โ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒ) เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™ (keyboardEvents, miceEvents).

เบชเบฐเบซเบฅเบธเบš

เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”. เปเบฅเบฐเป‚เบ‡เปˆเบ„เบทเบ‚เป‰เบญเบ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบปเบเบเป‰เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบ”เป‰เบงเบเบ„เบงเบฒเบกเบซเบงเบฑเบ‡เบงเปˆเบฒเป€เบเบทเบญเบšเบงเปˆเบฒเบ™เบฑเบเบงเบดเบŠเบฒเบเบฒเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบชเบดเปˆเบ‡เบ—เบตเปˆเบฅเบฒเบงเบ•เป‰เบญเบ‡เบเบฒเบ™. เปเบฅเบฐเบ‚เปเบ‚เบญเบšเปƒเบˆเบ™เบตเป‰, เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ™เบตเป‰เบˆเบฐเบšเปเปˆเบ•เบฒเบเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบกเปˆเบงเบ™เบ—เบตเปˆเบชเบธเบ”.

เป‚เบŠเบเบ”เบต!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™