logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C#] Aplikacja konsolowa, reakcja na naciśnięcie i puszczenie klawisza

mungo 22 Maj 2012 22:02 5795 12
REKLAMA
  • #1 10924662
    mungo
    Poziom 19  
    Posty: 315
    Pomógł: 24
    Ocena: 24
    Witam.
    Mam problem, piszę aplikacje konsolową w C# i potrzebuje zrobić tak aby naciskając klawisz z klawiatury wywoływać 'metode1' a gdy puszcze ten klawisz wywoływała się 'metoda2'. Nic konkretnego nie znalazłem a może ktoś na forum miał podobny problem i mi pomógł, najlepiej łopatologicznie bo to moja pierwsza styczność z C#.
  • REKLAMA
  • #2 10925143
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    A coś więcej na temat tego czemu by to miało służyć?? I czy koniecznie musi być konsola, WinForms się nie sprawdzi?
    Nie możesz wywołać po prostu jednej metody za drugą po naciśnięciu wybranego klawisza?
  • #3 10925360
    mungo
    Poziom 19  
    Posty: 315
    Pomógł: 24
    Ocena: 24
    W sumie to nie tak koniecznie musi być konsola, tylko zaplanowałem sobie że to ma się tylko włączać i nic więcej nie wyświetlać.
    Aplikacja ma sterować "cusiem" przez port szeregowy... Urządzenie odbiorcze ma mniejwięcej takiego swicha:
    
    while(1)
    {
    swich (znak)
       case 'p':
          prawo();
          break;
       case 'l':
          lewo();
          break;
       case 'x':
       default:
          stop();
    }
    


    i to działa na razie tak że przez hyperterinala naciskam-puszczam 'p' i kreci mi się w prawo cały czas aż nie wyśle mu 'x', a chce teraz zrobić aplikacje która sama postawi połączenie i jeśli nacisnę sobie 'p' będzie mi się kręciły tylko tyle czasu ile trzymam ten przycisk... Czyli naciśnięcie wysyła 'p', puszczenie wysyła 'x'.
    Tak że wywołanie jednej metody po drugiej odpada.
  • REKLAMA
  • Pomocny post
    #5 10925767
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Sprawdź, czy coś takiego spełnia Twoje wymagania, ew. rozbuduj o swoje potrzeby:
    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #6 10925774
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    marcinj12 napisał:
    Sprawdź, czy coś takiego spełnia Twoje wymagania, ew. rozbuduj o swoje potrzeby:

    Pod warunkiem, że zostawi aplikacje uruchomioną na pierwszym planie :), prawda?
  • REKLAMA
  • #7 10925779
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    mickpr napisał:
    Pod warunkiem, że zostawi aplikacje uruchomioną na pierwszym planie :), prawda?
    Jak najbardziej :)
  • #8 10926169
    mungo
    Poziom 19  
    Posty: 315
    Pomógł: 24
    Ocena: 24
    To nie przeszkadza żeby aplikacja była na pierwszym planie tylko że to działa tak że wywołuje metody prawo() lewo() cały czas jeśli naciśnięty jest przycisk, tak? Tylko że w takim przypadku niema nigdzie stop() czyli wysłanie np 'x', próbowałem już coś podobnego tylko że dawałem opóźnienie (kilkanaście ms) po swichu i wywołanie stop() ale to nie sprawdziło się.

    @mickpr
    Dzięki za stronki wydaje się że to będzie to o co mi chodziło. :D Wieczorem sprawdzę jak działa.
  • #9 10927974
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Najprościej będzie zrobić to jednak w Windows Forms i wykorzystać zdarzenia KeyDown i KeyUp.
  • REKLAMA
  • #10 10929193
    Defice
    Poziom 25  
    Posty: 698
    Pomógł: 101
    Ocena: 15
    Również przychyliłbym się do Windows Form. Wykorzystaj eventy i podepnij pod nie odpowiednie akcje. W konsoli nie jest to zbyt przejrzyste, natomiast w formatce można zrobić to tak, aby wciśnięcie wywoływało metodę czy nawet osobną formatkę wyświetlającą pożądane efekty.
  • #11 10949232
    polykarp
    Poziom 11  
    Posty: 10
    Pomógł: 3
    Jeżeli kolega nadal woli napisać program w konsoli to polecam takie rozwiązanie:

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Sprawdzamy ile czasu minęło od wciśnięcia ostatniego klawisza ('l' lub 'p') i w zależności o tego odpowiednio reagujemy. Należy pamiętać, że pomimo iż wciskamy cały czas jeden klawisz, to między pierwszym pojawieniem się znaku a drugim w buforze mija niecałe 500ms. Kolejne znaki lecą już w krótszych odstępach czasu. To takie zabezpieczenie Microsoftu przed przypadkowym wpisaniem dwóch znaków obok siebie.
  • #12 10949267
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    polykarp napisał:
    To takie zabezpieczenie Microsoftu przed przypadkowym wpisaniem dwóch znaków obok siebie.

    Sądzę, że zapobieganie powtarzaniu klawiszy i auto-powtarzanie było "wymyślone" długo przed Microsoftem.
  • #13 10955857
    polykarp
    Poziom 11  
    Posty: 10
    Pomógł: 3
    mickpr napisał:
    polykarp napisał:
    To takie zabezpieczenie Microsoftu przed przypadkowym wpisaniem dwóch znaków obok siebie.

    Sądzę, że zapobieganie powtarzaniu klawiszy i auto-powtarzanie było "wymyślone" długo przed Microsoftem.


    Nie będę z kolegą polemizował, ponieważ nie posiadam adekwatnej wiedzy na ten temat. Dodam tylko, że w systemie Windows można ustawić sobie jakie ma być opóźnienie powtarzania i częstotliwość powtarzania wciśniętego klawisza. Będzie to miało wpływ na działanie algorytmu, który napisałem w poprzednim poście, dlatego warto sprawdzić jakie się ma ustawienia w systemie.

    W systemie Windows 7 uruchamiamy:
    Start->Panel Sterowanie->Klawiatura

    [C#] Aplikacja konsolowa, reakcja na naciśnięcie i puszczenie klawisza

    Generalnie zmieniając opóźnienie powtarzania na "Małe" można prawie całkowicie zlikwidować opóźnienie i wówczas sterowanie za pomocą klawiatury będzie bardziej płynne.

Podsumowanie tematu

✨ Użytkownik ma problem z napisaniem aplikacji konsolowej w C#, która reaguje na naciśnięcie i puszczenie klawisza. Chce, aby naciśnięcie klawisza 'p' wywoływało metodę 'prawo()', a puszczenie klawisza 'p' wywoływało metodę 'stop()'. W odpowiedziach zasugerowano użycie hooka na klawiaturę oraz przedstawiono przykłady kodu, które mogą spełniać wymagania użytkownika. Wskazano również, że łatwiejszym rozwiązaniem może być użycie Windows Forms z obsługą zdarzeń KeyDown i KeyUp, co pozwoli na bardziej przejrzyste zarządzanie zdarzeniami klawiatury.
Wygenerowane przez model językowy.
REKLAMA