📄 hclient.c
字号:
TRUE,
FALSE,
TRUE,
FALSE,
&asyncDevice);
if (!doAsyncReads)
{
MessageBox(hDlg,
"Unable to open device for asynchronous reading",
HCLIENT_ERROR,
MB_ICONEXCLAMATION);
}
PostMessage(hDlg, WM_READ_DONE, 0, 0);
break;
case WM_DISPLAY_READ_DATA:
//
// LParam is the device that was read from
//
pDevice = (PHID_DEVICE) lParam;
//
// Display all the data stored in the Input data field for the device
//
pData = pDevice -> InputData;
SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_ADDSTRING,
0,
(LPARAM)"-------------------------------------------");
iLbCounter++;
if (iLbCounter > MAX_LB_ITEMS)
{
SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_DELETESTRING,
0,
0);
}
for (uLoop = 0; uLoop < pDevice->InputDataLength; uLoop++)
{
ReportToString(pData, szTempBuff, sizeof(szTempBuff));
iIndex = (INT) SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_ADDSTRING,
0,
(LPARAM) szTempBuff);
SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_SETCURSEL,
iIndex,
0);
iLbCounter++;
if (iLbCounter > MAX_LB_ITEMS)
{
SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_DELETESTRING,
0,
0);
}
pData++;
}
SetEvent( readContext.DisplayEvent );
break;
case WM_READ_DONE:
EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_READ_SYNCH), doSyncReads);
EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_ONCE), doAsyncReads);
EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_CONT), doAsyncReads);
SetWindowText(GetDlgItem(hDlg, IDC_READ_ASYNCH_ONCE),
"One Asynchronous Read");
SetWindowText(GetDlgItem(hDlg, IDC_READ_ASYNCH_CONT),
"Continuous Asynchronous Read");
readThread = NULL;
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_READ_SYNCH:
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_READ_SYNCH), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_ONCE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_CONT), FALSE);
Read(&syncDevice);
PostMessage(hDlg, WM_DISPLAY_READ_DATA, 0, (LPARAM) &syncDevice);
PostMessage(hDlg, WM_READ_DONE, 0, 0);
break;
case IDC_READ_ASYNCH_ONCE:
case IDC_READ_ASYNCH_CONT:
//
// When these buttons are pushed there are two options:
// 1) Start a new asynch read thread (readThread == NULL)
// 2) Stop a previous asych read thread
//
if (NULL == readThread)
{
//
// Start a new read thread
//
readContext.HidDevice = &asyncDevice;
readContext.TerminateThread = FALSE;
readContext.DoOneRead = (IDC_READ_ASYNCH_ONCE == LOWORD(wParam));
readContext.DisplayWindow = hDlg;
readThread = CreateThread( NULL,
0,
AsynchReadThreadProc,
&readContext,
0,
&threadID);
if (NULL == readThread)
{
MessageBox(hDlg,
"Unable to create read thread",
HCLIENT_ERROR,
MB_ICONEXCLAMATION);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_READ_SYNCH), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_ONCE),
IDC_READ_ASYNCH_ONCE == LOWORD(wParam));
EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_CONT),
IDC_READ_ASYNCH_CONT == LOWORD(wParam));
SetWindowText(GetDlgItem(hDlg, LOWORD(wParam)),
"Stop Asynchronous Read");
}
}
else
{
//
// Signal the terminate thread variable and
// wait for the read thread to complete.
//
readContext.TerminateThread = TRUE;
WaitForSingleObject(readThread, INFINITE);
}
break;
case IDCANCEL:
readContext.TerminateThread = TRUE;
WaitForSingleObject(readThread, INFINITE);
//Fall through!!!
case IDOK:
CloseHidDevice(&asyncDevice);
EndDialog(hDlg,0);
break;
}
break;
} // end switch message
return FALSE;
} // end bReadDlgProc
VOID
ReportToString(
PHID_DATA pData,
PCHAR szBuff,
UINT iBuffSize
)
{
PCHAR pszWalk;
PUSAGE pUsage;
ULONG i;
UINT iRemainingBuffer;
UINT iStringLength;
HRESULT stringReturn;
//
// For button data, all the usages in the usage list are to be displayed
//
if (pData -> IsButtonData)
{
stringReturn = StringCbPrintf (szBuff,
iBuffSize,
"Usage Page: 0x%x, Usages: ",
pData -> UsagePage);
iRemainingBuffer = 0;
iStringLength = strlen(szBuff);
pszWalk = szBuff + iStringLength;
if (iStringLength < iBuffSize)
{
iRemainingBuffer = iBuffSize - iStringLength;
}
for (i = 0, pUsage = pData -> ButtonData.Usages;
i < pData -> ButtonData.MaxUsageLength;
i++, pUsage++)
{
if (0 == *pUsage)
{
break; // A usage of zero is a non button.
}
stringReturn = StringCbPrintf (pszWalk, iRemainingBuffer, " 0x%x", *pUsage);
iRemainingBuffer -= strlen(pszWalk);
pszWalk += strlen(pszWalk);
}
}
else
{
stringReturn = StringCbPrintf (szBuff,
iBuffSize,
"Usage Page: 0x%x, Usage: 0x%x, Scaled: %d Value: %d",
pData->UsagePage,
pData->ValueData.Usage,
pData->ValueData.ScaledValue,
pData->ValueData.Value);
}
}
INT_PTR CALLBACK
bFeatureDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
static PHID_DEVICE pDevice;
static INT iLbCounter;
static rWriteDataStruct rWriteData[MAX_WRITE_ELEMENTS];
static CHAR szTempBuff[1024];
INT iIndex;
INT iCount;
INT iErrorLine;
PHID_DATA pData;
UINT uLoop;
HRESULT stringReturn;
switch(message)
{
case WM_INITDIALOG:
iLbCounter = 0;
pDevice = (PHID_DEVICE) lParam;
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_READ:
GetFeature(pDevice);
pData = pDevice -> FeatureData;
SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_ADDSTRING,
0,
(LPARAM)"------------ Read Features ---------------");
iLbCounter++;
if (iLbCounter > MAX_LB_ITEMS)
{
SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_DELETESTRING,
0,
0);
}
for (uLoop = 0; uLoop < pDevice -> FeatureDataLength; uLoop++)
{
ReportToString(pData, szTempBuff, sizeof(szTempBuff));
iIndex = (INT) SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_ADDSTRING,
0,
(LPARAM) szTempBuff);
SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_SETCURSEL,
iIndex,
(LPARAM) 0);
iLbCounter++;
if (iLbCounter > MAX_LB_ITEMS)
{
SendDlgItemMessage(hDlg,
IDC_OUTPUT,
LB_DELETESTRING,
0,
0);
}
pData++;
}
break;
case IDC_WRITE:
iCount = iPrepareDataFields(pDevice -> FeatureData,
pDevice -> FeatureDataLength,
rWriteData,
MAX_OUTPUT_ELEMENTS);
if (bGetData(rWriteData, iCount, hDlg, "WRITEFEATURE"))
{
if (!bParseData(pDevice -> FeatureData, rWriteData,iCount, &iErrorLine))
{
stringReturn = StringCbPrintf(szTempBuff,
sizeof(szTempBuff),
"Unable to parse line %x of output data",
iErrorLine);
MessageBox(hDlg,
szTempBuff,
HCLIENT_ERROR,
MB_ICONEXCLAMATION);
}
else
{
if ( SetFeature(pDevice) )
{
SendDlgItemMessage(hDlg,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -