Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Joy.h"
- class Joy
- {
- public:
- HRESULT poll(DIJOYSTATE *js)
- {
- HRESULT hr;
- if (joystick == NULL)
- {
- return S_OK;
- }
- // Ciągłe odczytywanie obecnego statusu urządzenia
- hr = joystick->Poll();
- if (FAILED(hr)) {
- hr = joystick->Acquire();
- while (hr == DIERR_INPUTLOST) {
- hr = joystick->Acquire();
- }
- if ((hr == DIERR_INVALIDPARAM) || (hr == DIERR_NOTINITIALIZED)) {
- return E_FAIL;
- }
- // Jeśli inna aplikacja w tym momencie używa joysticka, będziemy musieli
- // poczekać na naszą kolej
- if (hr == DIERR_OTHERAPPHASPRIO) {
- return S_OK;
- }
- }
- // Odczytanie statusu urządzenia
- if (FAILED(hr = joystick->GetDeviceState(sizeof(DIJOYSTATE), js))) {
- return hr;
- }
- return S_OK;
- }
- void GetDesktopResolution(int& horizontal, int& vertical)
- {
- RECT desktop;
- // Pobieranie uchwytu HWND do okna Windowsa
- const HWND hDesktop = GetDesktopWindow();
- // Zapisanie rozmiaru ekranu do zmiennych
- GetWindowRect(hDesktop, &desktop);
- horizontal = desktop.right;
- vertical = desktop.bottom;
- }
- // Funkcja umożliwiająca poruszanie myszką. Ustawia ona kursor w odpowiednim miejscu za pomocą odczytanego położenia joysticka
- void moveMouse(int dx, int dy)
- {
- POINT pt;
- int horizontal = 0;
- int vertical = 0;
- // Odczytanie rozdzielczości ekranu
- GetDesktopResolution(horizontal, vertical);
- // Odczytanie aktualnej pozycji kursora
- GetCursorPos(&pt);
- // Dodanie do aktualnej pozycji kursora odczytanego położenia joysticka
- pt.x += dx;
- pt.y += dy;
- // Zapewnienie tego, aby kursor nie uciekał poza ekran
- if (pt.x < 0)
- {
- pt.x = 0;
- }
- if (pt.x > horizontal)
- {
- pt.x = horizontal;
- }
- if (pt.y < 0)
- {
- pt.y = 0;
- }
- if (pt.y > vertical)
- {
- pt.y = vertical;
- }
- // Ustawienie nowej pozycji kursora
- SetCursorPos(pt.x, pt.y);
- }
- // Funkcja ustawiająca satus lewego klawisza myszki jako wciśnięty
- void clickMouse()
- {
- if (GetKeyState(VK_LBUTTON) >= 0)
- {
- mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
- }
- }
- // Funkcja ustawiająca satus lewego klawisza myszki jako puszczony
- void unclickMouse()
- {
- mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
- }
- // Funkcja "zamykająca" joystick
- void close()
- {
- if (joystick)
- {
- joystick->Unacquire();
- }
- }
- int start()
- {
- DIJOYSTATE js; // Struktura stanu joysticka
- // Utworznie urządzenia DirectInput
- if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
- IID_IDirectInput8, (VOID**)&di, NULL))) {
- return hr;
- }
- if (FAILED(hr = di->EnumDevices(DI8DEVCLASS_GAMECTRL, enumCallback,
- NULL, DIEDFL_ATTACHEDONLY))) {
- return hr;
- }
- // Sprawdzenie czy jest joystick
- if (joystick == NULL) {
- std::cout << "Joystick not found.\n";
- system("pause");
- return E_FAIL;
- }
- // Ustawienia
- DIDEVCAPS capabilities;
- // zdefiniowanie formatu danych urzadzenia
- if (FAILED(hr = joystick->SetDataFormat(&c_dfDIJoystick)))
- {
- return hr;
- }
- // Powiazanie urzadzenia z oknem aplikacji
- if (FAILED(hr = joystick->SetCooperativeLevel(GetConsoleWindow(), DISCL_NONEXCLUSIVE | DISCL_FOREGROUND))) {
- return hr;
- }
- // Wczytanie ustawien joysticka
- capabilities.dwSize = sizeof(DIDEVCAPS);
- if (FAILED(hr = joystick->GetCapabilities(&capabilities))) {
- return hr;
- }
- // Wyliczanie
- if (FAILED(hr = joystick->EnumObjects(enumAxesCallback, NULL, DIDFT_AXIS))) {
- return hr;
- }
- // Odczytanie nazwy podłączonego urządzenia
- info.dwSize = sizeof(DIDEVICEINSTANCE);
- if (FAILED(hr = joystick->GetDeviceInfo(&info)))
- {
- return hr;
- }
- // Wyświetlenie nazwy urządzenia
- int i = 0;
- while (i < MAX_PATH && info.tszProductName[i] != 0)
- {
- std::cout << (char)info.tszProductName[i];
- i++;
- }
- std::cout << std::endl;
- system("pause");
- // Nieskończona pętla odczytująca status i położenie urządzenia
- while (1)
- {
- poll(&js);
- // Jeśli przyciśnięty przycisk "Fire" wtedy ustaw status lewego przycisku myszy jaki wciśnięty
- // w przeciwnym przypadku ustaw status jako puszczony
- if (js.rgbButtons[0] != 0)
- clickMouse();
- else
- unclickMouse();
- // Odczytanie, który przycisk na joysticku został przyciśnięty
- for (int i = 0; i < 11; i++)
- {
- if (js.rgbButtons[i] != 0) std::cout << "Przycisk " << i + 1 << std::endl;
- }
- std::cout << "X: " << js.lX << std::endl;
- std::cout << "Y: " << js.lY << std::endl;
- std::cout << "Z: " << js.lZ << std::endl;
- moveMouse(js.lX, js.lY);
- std::cout << std::endl;
- system("cls");
- }
- close();
- system("pause");
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement