No więc tak. Parametr jest taki opcjonalny - zresztą dałem domyślny dlatego. Po prostu zrobiłem sobie na potrzeby testów funkcję półuniwersalną. Jak nic nie podasz - czyta wszystko. Jak podasz kod klawisza - sprawdza tylko ten klawisz. Jak potrzeba tylko jednego klawisza, to oszczędzasz na operacjach. Robi się tylko to, co trzeba - nie wypełniasz całej tablicy.
Typ zwracany bool - też niepotrzebny. Możnaby dać void i nic nie zwracać. Po prostu nie lubię voidowych funkcji. IMO każda funkcja powinna brać pod uwagę, że coś może nie wyjść. I albo zwracać true/false (udało się/błąd) albo jakiś numer, albo rzucać wyjątkiem. Nawet taka funkcja, w której bieżącej implementacji błędy nie są zwracane> Może nowsza wersja tej funkcji już będzie mogła popełniać błędy - wtedy deklaracji i dokumentacji nie trzeba zmieniać - bo już dawno byliśmy przygotowani. Podobnie się często robi w języku C dając jakieś parametry/pola w strukutrze typu Reserved for future use (zarezerwowane dla przyszłych zastosowań).
To tak ideowo - masz omówienie pewnych praktyk/konwencji ;)
Konkretnie: dobrze funkcję przerobiłeś. A GetAsyncKeyState zwraca dla każdego klawisza liczbę, w której mogą być zapalone 2 bity: najmniej znaczący (0x01) i najbardziej (0x80). W tablicy masz więc: tablica[kod]. Jeśli:
(tablica[kod] & 0x01) - ktoś nacisnął i puścił klawisza od czasu, kiedy ostatnio sprawdzałeś
(tablica[kod] & 0x08) - klawisz jest wciśnięty teraz
Z czego myk z najmniej znaczącym bitem (0x01) jest niepewny, nie ma co o nim myśleć - bo inny program w Windowsie też może używać GetAsyncKeyState, i to on może dostać info 0x01 - skoro inny dostał, to tobie już on się nie trafi. Z tego względu dla ciebie istotne jest tylko, czy wartość pod danym indeksem (np VK_F11 dla F11) jest różna od zera. Jak jest różna, to ktoś właśnie w tej chwili trzyma wciśnięty.
//crayze: byłem szybszy ;)