2013-10-05 4 views
0

Я пытаюсь отправить через клиент-серверное приложение коды джойстика. После успешного отображения данных джойстика, используя API DirectInput, я не могу понять, в каких переменных хранятся данные из джойстика, чтобы передать их в буфер и отправить их. Любая помощь будет оценена по достоинству.C++ Образец DirectInput извлекает немедленные данные с джойстика

кода блок, который отображает данные джойстика:

//-------------------------------------------------------------------------------------------------- 
// Name: UpdateInputState() 
// Desc: Get the input device's state and display it. 
//-------------------------------------------------------------------------------------------------- 
HRESULT UpdateInputState(HWND hDlg) 
{ 
    HRESULT hr; 
    TCHAR strText[512] = {0}; // Device state text. 
    DIJOYSTATE2 js; // DirectInput joypad state. 

    if(NULL == g_pJoypad) 
     return S_OK; 

    // Poll the device to read the current state. 
    hr = g_pJoypad->Poll(); 
    if(FAILED(hr)) 
    { 
     // DirectInput is telling us that the input stream has been interrupted. We aren't tracking 
     // any state between polls, so we don't have any special reset that needs to be done. We just 
     // re-acquire and try again. 
     hr = g_pJoypad->Acquire(); 
     while(hr == DIERR_INPUTLOST) 
      hr = g_pJoypad->Acquire(); 

     // hr may be DIERR_OTHERAPPHASPRIO or other errors. This may occur when the application is 
     // minimized or in the process of switching, so just try again later. 
     return S_OK; 
    } 

    // Get the input's device state. 
    // GetDeviceState() retrieves immediate data from the device. 
    if(FAILED(hr = g_pJoypad->GetDeviceState(sizeof(DIJOYSTATE2), &js))) 
     return hr; // The device should have been acquired during the Poll(). 

    // Display joypad state to dialog. 

    // Axes. 
    _stprintf_s(strText, 512, TEXT("%ld"), js.lX); 
    SetWindowText(GetDlgItem(hDlg, IDC_X_AXIS_L), strText); 
    _stprintf_s(strText, 512, TEXT("%ld"), js.lY); 
    SetWindowText(GetDlgItem(hDlg, IDC_Y_AXIS_L), strText); 
    _stprintf_s(strText, 512, TEXT("%ld"), js.lZ); 
    SetWindowText(GetDlgItem(hDlg, IDC_X_AXIS_R), strText); 
    _stprintf_s(strText, 512, TEXT("%ld"), js.lRx); 
    _stprintf_s(strText, 512, TEXT("%ld"), js.lRz); 
    SetWindowText(GetDlgItem(hDlg, IDC_Y_AXIS_R), strText); 

    // POV. 
    _stprintf_s(strText, 512, TEXT("%lu"), js.rgdwPOV[0]); 
    SetWindowText(GetDlgItem(hDlg, IDC_POV), strText); 

    // Buttons. 
    // Fill up text with which buttons are pressed. 
    _tcscpy_s(strText, 512, TEXT("")); 
    for(int i = 0; i < 128; i++) 
    { 
     if(js.rgbButtons[i] & 0x80) 
     { 
      TCHAR sz[128]; 
      _stprintf_s(sz, 128, TEXT("%02d"), i); 
      _tcscat_s(strText, 512, sz); 
     } 
    } 
    SetWindowText(GetDlgItem(hDlg, IDC_BUTTONS), strText); 

    return S_OK; 
} 

код блок, который отправляет данные на сервер:

// Send a message. 
    if (send(ConnectSocket, sendbuf, sizeof(sendbuf), 0) == SOCKET_ERROR) 
    { 
     MessageBox(NULL, TEXT("The joypad data could not be sent."), TEXT("Client says"), 
          MB_ICONERROR | MB_OK); 
    } 

ответ

0

Simpler, чем я думал. Данные хранятся в strText (оси и POV) и в sz (кнопки). Однако оба этих буфера были объявлены TCHAR и требуется преобразование в CHAR для передачи в качестве параметра send() (вместо sendbuf).