Source file: /~heha/mb-iwp/NA/MSVC.zip/src/HardwareDlg.cpp

#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
Wrong umlauts? - Assume file is ANSI (CP1252) encoded