Я пытаюсь отправить через приложение клиент-сервер коды джойстика. Успешно отобразив данные джойстика с помощью DirectInput API, я не могу понять, в каких переменных хранятся данные с джойстика, чтобы передать их в буфер и отправить их. Любая помощь будет оценена.
Блок кода, который отображает данные джойстика:
//--------------------------------------------------------------------------------------------------
// 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);
}
Проще, чем я думал. Данные хранятся в strText (оси и POV) и в sz (кнопки). Однако оба этих буфера объявлены как TCHAR, и для передачи в качестве параметра в send () требуется преобразование в CHAR (вместо sendbuf).
Других решений пока нет …