sprae :: przygody z programowaniem


Pikanie klawiatury - Skrypt w Pythonie pod Win32

Wpis na 0. poziomie, wysłany 28 kwietnia 2013 o 21:23:51

Komputer Atari?

Przeglądając bezkresne zasoby Youtube'a natrafiłem na ciekawostkę. Podobno dawno, dawno temu, gdy po Ziemi chodziły pająki, znany wydawca gier - Atari produkował komputery.

Miały tak marne możliwości, że programowanie ich dzisiaj to niezłe osiągnięcie na arenie hipsteryzmu.
Wieść gminna niesie, że w Polsce największym hitem na ich wyposażeniu były najgorsze wersje czytników programów, które dzięki niespotykanie niskiej jakości elementów ściągały wszystkie zakłócenia z otoczenia. Niektórzy podobno byli w stanie uwierzyć, że przy "wgrywaniu" programu nie wolno się ruszać, a nawet oddychać.

Piknięcie klawiatury

To co uwiodło mnie w tym dziwnym kawałku elektroniki, to dźwięk piknięcia podczas naciskania klawiszy. Jest bardzo zabawny. Możecie posłuchać go tu:

Zastanawiałem się ile by mi zajęło sprawienie, żeby mój Cepet zaczął wydawać ten dźwięk przy naciskaniu klawiszy. Okazało się, że około 30 minut.

Pikanie klawiszy w PC

Najpierw trzeba załatwić plik z dźwiękiem pikania. Nie było to trudne dla ogarniętego człowieka. Wystarczy ściągnąć filmik, odseparować audio i w jakimś edytorze fonii wyciąć odpowiedni fragment.

Do wykonania dzieła użyłem języka Python w wersji 2.7.4. Niestety Python 3 jest dla mnie tym, czym prawdopodobnie dla ciebie jest Windows 8.
Pythona wyposażyłem w baterie (moduły):

które trzeba instalować właśnie w takiej kolejności.

Program ma zaledwie 18 linii:

import pygame
import pythoncom
import pyHook

def main():
  pygame.mixer.pre_init(44100, -16, 2, 2048)
  pygame.mixer.init()
  sound = pygame.mixer.Sound('akeys.ogg')

  def onKeyDown(event):
    sound.play()

  hook = pyHook.HookManager()
  hook.KeyDown = onKeyDown
  hook.HookKeyboard()
  pythoncom.PumpMessages()

main()

Jak działa program?

Do generowania dźwięku wykorzystałem moduł pygame, który służy do tworzenia pythonowych gier. Jego komponent pygame.mixer, to bardzo łatwe w obsłudze narzędzie do odtwarzania dźwięków zapisanych w plikach.

Do globalnego odczytywania wciśniętych klawiszy użyłem Hook-ów systemu Windows, za które odpowiada moduł pyHook.
Jego zdarzenie obsługi klawiszy wywołuje osadzoną funkcję onKeyDown, która odpowiada za odtworzenie dźwięku przyciśniętego klawisza.

Cały skrypt umieściłem w funkcji main, bo interpreter języka Python odczytuje wydajniej zmienne lokalne, niż globalne. Dzięki temu program mniej ssie.

Po uruchomieniu program zajmuje 5 MB pamięci RAM.

Ciekawy jestem jak by wyglądało rozwiązanie tego problemu na Linuksie?

Pliki:

Poleć wpis


Komentarze do notki Pikanie klawiatury - Skrypt w Pythonie pod Win32

  1. 28 kwietnia 2013 o 23:26:18

    Atari teraz == Infogrames != Atari wtedy

  2. 28 kwietnia 2013 o 23:32:09

    pecet: Racja, ale to chyba w końcu zbankrutowało?
    Na Wiki piszą, że podlega restrukturyzacji.

  3. 29 kwietnia 2013 o 10:15:20

    Czyli udało Ci się osiągnąć jedną z peryferyjnych bzdurek tamtych maszyn, używając tylko dziesięciokrotność całej dostępnej w nich pamięci? :>

  4. 29 kwietnia 2013 o 14:22:10

    Jest nawet zabawniej. W Atari ten dźwięk generowany jest sprzętowo przez układ graficzny GTIA. Wystarczy ustawić odpowiednią wartość w rejestrze w procedurze obsługi klawiatury. To zajmuje zapewne 5 bajtów programu.
    Coś w stylu:

    LDA #8
    STA $d01f
    

    I tyle :-)

  5. 29 kwietnia 2013 o 16:34:39

    Wow! Zapomniałem już o hakach (o Windows też powoli zapominam ;)) - czytałem o nich prawie dziesięć lat temu, kiedy jeszcze nie miałem zielonego pojęcia o językach interpretowanych... Śmiesznie się patrzy, jak ilość kodu się skurczyła, a czytelność i możliwości zwiększyły ^^

  6. 29 kwietnia 2013 o 19:27:27

    d33tah: Aż sprawdziłem jak by to wyglądało w Visual Basicu i wydaje mi się, że nie za dobrze :-).

    Co do Linuksa to podobny interfejs do tego modułu ma pykeylogger, ale trzeba konfigurować Xy, albo dodawać moduł do jądra.

  7. Sławek

    30 kwietnia 2013 o 14:55:22

    np. tak: https://github.com/chrelad/keypress

  8. 30 kwietnia 2013 o 21:43:48

    Sławek: O dzięki! - świetnie wymyślone rozwiązanie :)
    Przedstawię je we wpisie jak tylko dobrze dopracuję.

  9. Scout

    19 sierpnia 2013 o 19:34:12

    Cześć Sprae!
    Pamiętam jak 3 lata temu wspominałeś coś, że bawisz się w modele FPV.
    Bawisz się też teraz, bo też mnie to zainteresowało ostatnio.

  10. 19 sierpnia 2013 o 19:59:52

    Teraz nie, ale możemy porozmawiać o tym jak chcesz :-)
    Z resztą są 2 znakomite fora od spraw technicznych.

Dodaj komentarz: