Ciągłe otwieranie ścieżki, gdy tego nie chce

0

Cześć, chce napisać łatwy program, program do otwierania zdjęć w zależności od tego co nacisnę. Gdy naciskam D lub A nie otwiera się ścieżka raz tylko w kółko, mógłby ktoś zerknąć i powiedzieć co jest źle? Jeszcze chciałbym dodać zmienną string z całą zawartością folderu w którym znajdują się zdjęcia i ciągle się zmieniają. Mam zamysł w głowie jak mogłoby to wyglądać ale gdy chce zrobić zmienną np. string zawartosc = system("dir/b D:\zdjecia"); to wyskakuje błąd. Kod:

#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>

using namespace std;

int main()
{

    int a=0;
    string command = "explorer D:\\zdjecia\\";
    string s;
    x:
    while(!GetKeyState('X')){
        if(GetKeyState('D')){
            a++;
            s = to_string(a);
            Sleep(1000);
            s+=".jpg";
            command.append(s);
            system(command.c_str());
            goto x;
        }
        if(GetKeyState('A')){
            a--;
            s = to_string(a);
            Sleep(1000);
            s+=".jpg";
            command.append(s);
            system(command.c_str());
            goto x;
        }
    }
    return 0;
}
0

@Kostecko: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeystate

Return value

Type: SHORT

The return value specifies the status of the specified virtual key, as follows:
If the high-order bit is 1, the key is down; otherwise, it is up.
If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.

Czyli, wciskając jeden raz klawisz np. 'D' zostaje mu nadany stan "toggled" zatem funkcja zwraca ciągle '1' czyli true,
dlatego cały czas otwiera się dana ścieżka, chcąc wyłączyć stan "toggled" musisz wcisnąć jeszcze raz ten sam klawisz.

Co do listowania zawartości katalogu:

https://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c

1
  1. sprawdź najstarszy bit z funkcji GetKeyState. Jeżeli 1 to znaczy, że klawisz wciśnięty
   if (GetKeyState('D') & 0x8000) {
  1. zamień goto x; na continue;
0

GetKeyState wymaga pętli komunikatów, jej asynchroniczna koleżanka GetAsyncKeyState działa bez pętli komunikatów, ale obie nie konsumują klawiszy, przez co mogą one trafić do innych programów. Załóżmy, że użytkownik wywoła Twój program z wiersza poleceń i korzystając z niego naciśnie klawisze F O R M A T SPACJA C : ENTER Y ENTER. Dopóki działa Twój program, naciskane klawisze będą kolejkowane przez konsolę, dopiero po zakończeniu, sterowanie wróci do procesora poleceń, który przeczyta format c:. Dlatego, jeśli naciśniecie jakiegoś klawisza ma wywołać jakieś działanie, to należy korzystać z funkcji konsumujących naciśnięcie klawisza.

Masz parę rozwiązań:

  1. Normalne okno Windows z obsługą klawiszy w WM_CHAR lub WM_KEYDOWN.
  2. Przełączenie konsoli w tryb raw SetConsoleMode+ReadConsoleInput.
  3. Jeśli działanie ma być aktywowane niezależnie jakie okno jest aktywne, to gorące klawisze RegisterHotKey.
  4. W ostateczności, jeśli chcesz widzieć wszystkie naciśnięcia i decydować co się z nimi stanie to keyboard hooking SetWindowsHookEx(WH_KEYBOARD_LL, ...), ale to już bardzo zaawansowany poziom.

GetKeyState dobra jest np. do sprawdzenia, czy naciśnięty klawisz strzałki jest razem z Shift, czy Ctrl. Do aktywacji operacji (wraz z asynchroniczną koleżanką) nie powinna być używana.

0

Dziekuje wszystkim za odpowiedzi, juz wszystko dziala

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