Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.70 KB | None | 0 0
  1. #include "Joy.h"
  2.  
  3. class Joy
  4. {
  5. public:
  6.  
  7.     HRESULT poll(DIJOYSTATE *js)
  8.     {
  9.         HRESULT hr;
  10.  
  11.         if (joystick == NULL)
  12.         {
  13.             return S_OK;
  14.         }
  15.  
  16.         // Ciągłe odczytywanie obecnego statusu urządzenia
  17.         hr = joystick->Poll();
  18.         if (FAILED(hr)) {
  19.  
  20.             hr = joystick->Acquire();
  21.             while (hr == DIERR_INPUTLOST) {
  22.                 hr = joystick->Acquire();
  23.             }
  24.  
  25.             if ((hr == DIERR_INVALIDPARAM) || (hr == DIERR_NOTINITIALIZED)) {
  26.                 return E_FAIL;
  27.             }
  28.  
  29.             // Jeśli inna aplikacja w tym momencie używa joysticka, będziemy musieli
  30.             // poczekać na naszą kolej
  31.             if (hr == DIERR_OTHERAPPHASPRIO) {
  32.                 return S_OK;
  33.             }
  34.         }
  35.         // Odczytanie statusu urządzenia
  36.         if (FAILED(hr = joystick->GetDeviceState(sizeof(DIJOYSTATE), js))) {
  37.             return hr;
  38.         }
  39.         return S_OK;
  40.     }
  41.  
  42.     void GetDesktopResolution(int& horizontal, int& vertical)
  43.     {
  44.         RECT desktop;
  45.  
  46.         // Pobieranie uchwytu HWND do okna Windowsa
  47.         const HWND hDesktop = GetDesktopWindow();
  48.  
  49.         // Zapisanie rozmiaru ekranu do zmiennych
  50.         GetWindowRect(hDesktop, &desktop);
  51.  
  52.         horizontal = desktop.right;
  53.         vertical = desktop.bottom;
  54.     }
  55.  
  56.     // Funkcja umożliwiająca poruszanie myszką. Ustawia ona kursor w odpowiednim miejscu za pomocą odczytanego położenia joysticka
  57.     void moveMouse(int dx, int dy)
  58.     {
  59.         POINT pt;
  60.         int horizontal = 0;
  61.         int vertical = 0;
  62.  
  63.         // Odczytanie rozdzielczości ekranu
  64.         GetDesktopResolution(horizontal, vertical);
  65.         // Odczytanie aktualnej pozycji kursora
  66.         GetCursorPos(&pt);
  67.  
  68.         // Dodanie do aktualnej pozycji kursora odczytanego położenia joysticka
  69.         pt.x += dx;
  70.         pt.y += dy;
  71.  
  72.         // Zapewnienie tego, aby kursor nie uciekał poza ekran
  73.         if (pt.x < 0)
  74.         {
  75.             pt.x = 0;
  76.         }
  77.         if (pt.x > horizontal)
  78.         {
  79.             pt.x = horizontal;
  80.         }
  81.  
  82.         if (pt.y < 0)
  83.         {
  84.             pt.y = 0;
  85.         }
  86.         if (pt.y > vertical)
  87.         {
  88.             pt.y = vertical;
  89.         }
  90.         // Ustawienie nowej pozycji kursora
  91.         SetCursorPos(pt.x, pt.y);
  92.     }
  93.  
  94.     // Funkcja ustawiająca satus lewego klawisza myszki jako wciśnięty
  95.     void clickMouse()
  96.     {
  97.         if (GetKeyState(VK_LBUTTON) >= 0)
  98.         {
  99.             mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  100.         }
  101.     }
  102.  
  103.     // Funkcja ustawiająca satus lewego klawisza myszki jako puszczony
  104.     void unclickMouse()
  105.     {
  106.         mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  107.     }
  108.  
  109.     // Funkcja "zamykająca" joystick
  110.     void close()
  111.     {
  112.         if (joystick)
  113.         {
  114.             joystick->Unacquire();
  115.         }
  116.     }
  117.  
  118.     int start()
  119.     {
  120.         DIJOYSTATE js;          // Struktura stanu joysticka
  121.  
  122.         // Utworznie urządzenia DirectInput
  123.         if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
  124.             IID_IDirectInput8, (VOID**)&di, NULL))) {
  125.             return hr;
  126.         }
  127.  
  128.         if (FAILED(hr = di->EnumDevices(DI8DEVCLASS_GAMECTRL, enumCallback,
  129.             NULL, DIEDFL_ATTACHEDONLY))) {
  130.             return hr;
  131.         }
  132.  
  133.         // Sprawdzenie czy jest joystick
  134.         if (joystick == NULL) {
  135.  
  136.             std::cout << "Joystick not found.\n";
  137.             system("pause");
  138.             return E_FAIL;
  139.         }
  140.  
  141.         // Ustawienia
  142.         DIDEVCAPS capabilities;
  143.  
  144.         // zdefiniowanie formatu danych urzadzenia
  145.         if (FAILED(hr = joystick->SetDataFormat(&c_dfDIJoystick)))
  146.         {
  147.             return hr;
  148.         }
  149.  
  150.         // Powiazanie urzadzenia z oknem aplikacji
  151.         if (FAILED(hr = joystick->SetCooperativeLevel(GetConsoleWindow(), DISCL_NONEXCLUSIVE | DISCL_FOREGROUND))) {
  152.             return hr;
  153.         }
  154.  
  155.         // Wczytanie ustawien joysticka
  156.         capabilities.dwSize = sizeof(DIDEVCAPS);
  157.         if (FAILED(hr = joystick->GetCapabilities(&capabilities))) {
  158.  
  159.             return hr;
  160.         }
  161.  
  162.         // Wyliczanie
  163.         if (FAILED(hr = joystick->EnumObjects(enumAxesCallback, NULL, DIDFT_AXIS))) {
  164.             return hr;
  165.         }
  166.  
  167.         // Odczytanie nazwy podłączonego urządzenia
  168.         info.dwSize = sizeof(DIDEVICEINSTANCE);
  169.         if (FAILED(hr = joystick->GetDeviceInfo(&info)))
  170.         {
  171.             return hr;
  172.         }
  173.         // Wyświetlenie nazwy urządzenia
  174.         int i = 0;
  175.         while (i < MAX_PATH && info.tszProductName[i] != 0)
  176.         {
  177.             std::cout << (char)info.tszProductName[i];
  178.             i++;
  179.         }
  180.         std::cout << std::endl;
  181.         system("pause");
  182.  
  183.         // Nieskończona pętla odczytująca status i położenie urządzenia
  184.         while (1)
  185.         {
  186.             poll(&js);
  187.  
  188.             // Jeśli przyciśnięty przycisk "Fire" wtedy ustaw status lewego przycisku myszy jaki wciśnięty
  189.             // w przeciwnym przypadku ustaw status jako puszczony
  190.             if (js.rgbButtons[0] != 0)
  191.                 clickMouse();
  192.             else
  193.                 unclickMouse();
  194.  
  195.             // Odczytanie, który przycisk na joysticku został przyciśnięty
  196.             for (int i = 0; i < 11; i++)
  197.             {
  198.                 if (js.rgbButtons[i] != 0) std::cout << "Przycisk " << i + 1 << std::endl;
  199.             }
  200.  
  201.  
  202.             std::cout << "X: " << js.lX << std::endl;
  203.             std::cout << "Y: " << js.lY << std::endl;
  204.             std::cout << "Z: " << js.lZ << std::endl;
  205.  
  206.             moveMouse(js.lX, js.lY);
  207.  
  208.             std::cout << std::endl;
  209.             system("cls");
  210.         }
  211.  
  212.         close();
  213.  
  214.         system("pause");
  215.     }
  216. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement