c# - oczekiwanie na wciśnięcie klawisza

0

Witam.
Pisząc program natrafiłam na pewien problem.
W programie chcę zawrzeć pętlę, która ma działać w ten sposób, że czeka jakiś czas na wciśnięcie klawisza (wtedy w zależności od rodzaju klawisza wykonuje pewne metody), natomiast jeśli klawisz nie zostanie wciśnięty robi co innego. Problem polega na tym, że jakkolwiek próbuję napisać ten program (było już co najmniej kilka wersji) kończy się tak, że program czeka na naciśnięcie klawisza,czyli instrukcje <jeśli klawisz nie został wciśnięty> nie wykonują się.

1

Może pokaż już co napisałaś ? Ciężko pomóc nie wiedząc z czym masz problem :)

0

a po czym ma byc rozpoznane ze klawisz nie zostal wcisniety? Jakis czas? Czy jaki jest warunek

0

Dodatkowe pytanie - to aplikacja konsolowa, WinForms, czy coś jeszcze innego?

0

Nie mam zapisanych tych nie działających wersji, także ich nie mogę pokazać.
Klawisz powinien zostać wciśnięty po opłynięciu określonego czasu. Próbowałam mierzyć czas, czyli rozpocząć liczenie czasu na początku pętli, a po upływie tego czasu przejść do instrukcji <klawisz nie został wciśnięty>. Tylko, że po drodze program rozpoczynał oczekiwanie na klawisz i na tym etapie się zawieszał. Juhas - piszę w aplikacji konsolowej.

0

Żeby było jaśniejsze o czym mowa, powiedzmy, że mamy prosty programik, który wyświetla kolejne liczby naturalne. Odlicza je w górę, dopóki nie zostanie wciśnięty klawisz DownArrow, wtedy odlicza w dół i tak dalej.

0

int i = 1;
int w = 1;

while (true)
{
i = i + w;
if (downarrow)
{
w = -1;
sleep(300) - tyle mniej wiecej trwa klikniecie
}
if (uparrow)
{
w = 1;
sleep(300)
}

}
coś takiego by ci nie zadzialalo ? ; )

mogłabyś też sprawdzać guzik w osobnym wątku i w tak zmieniać.

Odp na metody.

bool metoda1 = true;
bool metoda2 = false;
while (true)
{
if (metoda1)
{
metoda1();
}
if(metoda2)
{
metoda2();
}
if (downarrowUp)
{
metoda1 = false;
metoda2 = true;

}
if (uparrowUp)
{
metoda1 = true;
metoda2 = false;
}

}

0

Przepraszam, w powyższym poście źle napisałam. To, że klawisz NIE został naciśnięty powinno zostać rozpoznane po upływie czasu.
Czyli program robi swoje (jakaś pętla), natomiast w momencie naciśnięcia klawisza zmienia metodę, z której korzysta.

1

Raczkujaca, Twoje opisy w kazdym poscie mowia co innego.

public class Program
{
    public static void Main()
    {

        ConsoleKeyInfo keyinfo;
        do
        {
            keyinfo = Console.ReadKey();
            Console.WriteLine(keyinfo.Key + " was pressed");
        }
        while (keyinfo.Key != ConsoleKey.X);
    }
}

tu masz kod ktory wyczekuje nacisniecia klawisza (i bedze czekal) jezeli chcesz by program ciagle sie wykonywal i zrobil cos innego gdy cos zostanie wcisniete, to musisz zrobic jedno z

  1. obsluzyc hook do klawiatury
    https://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C
  2. skorzystac z wpf/winforms/innego frameworka ktory juz ten globalny hook ma zaimplementowany
0

Dokładnie tak jak napisał @fasadin. W aplikacji konsolowej raczej tego nie zrobisz za pomocą narzędzi, które tam są. A może napisz, co dokładnie chcesz uzyskać? Tzn. dlaczego uważasz, że potrzebujesz takiego rozwiązania.

0

Przepraszam, rzeczywiście namieszałam w jednym z postów. W ostatnim poście dokładnie wyjaśniłam o co mi chodzi. Zadanie ma być wykonane w aplikacji konsolowej. Tak naprawdę chodzi o grę SNAKE, czyli waż się rusza w danym kierunku, a jeśli użytkownik naciśnie klawisz, waż zmienia kierunek. Mój wąż porusza się tylko po naciśnięciu klawisza (czeka na klawisz). Zrobiłam też wersję, gdzie wąż rusza się (czyli jest wykonywana pętla), ale wtedy nie reaguje na klawisze. Chcę połączyć jedno z drugim, czyli jak pisałam, pętla wykonuje się (program coś robi), a po naciśnięciu klawisza robi co innego.

1

Jeżeli chodzi o snake to nie musisz robić tak jak ty myślisz. Sprawdź ten kod
https://codereview.stackexchange.com/questions/127515/first-c-program-snake-game

1 użytkowników online, w tym zalogowanych: 0, gości: 1