#include "PiezoMess.h"
#include <setupapi.h>
#include <devguid.h>
//extern "C" {
//#include <hidsdi.h>
//#include <hidpi.h>
//}
INT_PTR CALLBACK HardwareDlgProc(HWND Wnd,UINT Msg,WPARAM wParam,LPARAM lParam) {
static SP_CLASSIMAGELIST_DATA ild;
switch (Msg) {
case WM_INITDIALOG: {
ild.cbSize=sizeof ild;
SetupDiGetClassImageList(&ild);
SendDlgItemMessage(Wnd,13,CBEM_SETIMAGELIST,0,(LPARAM)ild.ImageList);
SetDlgItemInt(Wnd,14,Config.GuiDelay,FALSE);
SendMessage(Wnd,WM_TIMER,1,0);
}return TRUE;
case WM_DEVICECHANGE: SetTimer(Wnd,1,1500,0); break;
case WM_TIMER: {
HWND hCombo=GetDlgItem(Wnd,13);
KillTimer(Wnd,wParam);
// serielle Schnittstellen (neu) listen (bei jedem WM_DEVICECHANGE bspw. für USB)
COMBOBOXEXITEM cbei;
cbei.mask=CBEIF_TEXT|CBEIF_IMAGE|CBEIF_SELECTEDIMAGE|CBEIF_LPARAM|CBEIF_OVERLAY;
cbei.iItem=0;
SetupDiGetClassImageIndex(&ild,(LPGUID)&GUID_DEVCLASS_PORTS,&cbei.iImage);
cbei.iSelectedImage=cbei.iImage;
ComboBox_ResetContent(hCombo);
TCHAR s[16];
cbei.pszText=s;
HANDLE devs=SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS,NULL,0,DIGCF_PRESENT);
if (devs!=INVALID_HANDLE_VALUE) {
SP_DEVINFO_DATA devInfo;
devInfo.cbSize=sizeof devInfo;
for (UINT i=0; SetupDiEnumDeviceInfo(devs,i,&devInfo); i++) {
HKEY hKey;
DWORD slen=sizeof s;
*s=0;
if ((hKey=SetupDiOpenDevRegKey(devs,&devInfo,DICS_FLAG_GLOBAL,0,DIREG_DEV,KEY_READ))
==INVALID_HANDLE_VALUE) continue;
RegQueryValueEx(hKey,T("PortName"),NULL,NULL,(LPBYTE)s,&slen);
RegCloseKey(hKey);
if (*s=='C') { // Fehlschläge und LPTx ausfiltern
cbei.iOverlay=0;
cbei.lParam=_ttoi(s+3)-1; // nullbasiert
SendMessage(hCombo,CBEM_INSERTITEM,0,(LPARAM)&cbei);
if (!(Config.flags&1) && LOBYTE(cbei.lParam)==Config.SerialNo)
ComboBox_SetCurSel(hCombo,cbei.iItem);
cbei.iItem++;
}
}
SetupDiDestroyDeviceInfoList(devs);
}
SetupDiGetClassImageIndex(&ild,(LPGUID)&GUID_DEVCLASS_USB,&cbei.iImage);
devs=SetupDiGetClassDevs(&GUID_DEVCLASS_HIDCLASS,NULL,0,DIGCF_PRESENT);
if (devs!=INVALID_HANDLE_VALUE) {
SP_DEVINFO_DATA devInfo;
devInfo.cbSize=sizeof devInfo;
for (UINT i=0; SetupDiEnumDeviceInfo(devs,i,&devInfo); i++) {
if (true) { // TODO: Ausfiltern!!
_sntprintf(s,elemof(s),T("USB%d"),i+1);
cbei.lParam=MAKEWORD(i,1);
SendMessage(hCombo,CBEM_INSERTITEM,0,(LPARAM)&cbei);
if (Config.flags&1 && LOBYTE(cbei.lParam)==Config.HidNo)
ComboBox_SetCurSel(hCombo,cbei.iItem);
cbei.iItem++;
}
}
SetupDiDestroyDeviceInfoList(devs);
}
}break;
case WM_COMMAND: switch (LOWORD(wParam)) {
case IDOK: {
HWND hCombo=GetDlgItem(Wnd,13);
int i=ComboBox_GetCurSel(hCombo);
if (i<0) {
MBox(Wnd,(LPCTSTR)2,MB_OK);
SetFocus(hCombo);
break;
}
Config.SerialNo=(BYTE)ComboBox_GetItemData(hCombo,i);
Config.GuiDelay=GetDlgItemInt(Wnd,14,NULL,FALSE);
}nobreak;
case IDCANCEL: EndDialog(Wnd,wParam); break;
}break;
case WM_DESTROY: {
SetupDiDestroyClassImageList(&ild);
}break;
}
return FALSE;
}
| Detected encoding: ANSI (CP1252) | 4
|
|
|