Source file: /~heha/ewa/Motor/cdesk.zip/settingsdlg.cpp

#include "cdesk.h"
#include <setupapi.h>
#include <devguid.h>
#include <tchar.h>

static SP_CLASSIMAGELIST_DATA ild;

static void FillComboExSerial(HWND hCombo,int ComNr) {
  ComboBox_ResetContent(hCombo);
  SendMessage(hCombo,CBEM_SETIMAGELIST,0,(LPARAM)ild.ImageList);
  COMBOBOXEXITEM cbei;
  cbei.mask=CBEIF_IMAGE|CBEIF_SELECTEDIMAGE|CBEIF_TEXT|CBEIF_LPARAM;
  TCHAR s[16];
  cbei.iItem=-1;	// anhängen
  cbei.pszText=s;
  SetupDiGetClassImageIndex(&ild,(LPGUID)&GUID_DEVCLASS_PORTS,&cbei.iImage);
  cbei.iSelectedImage=cbei.iImage;
  HDEVINFO devs=SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS,0,0,DIGCF_PRESENT);
  if (devs!=INVALID_HANDLE_VALUE) {
    SP_DEVINFO_DATA devinfo;
    devinfo.cbSize=sizeof devinfo;
    for (int i=0; SetupDiEnumDeviceInfo(devs,i,&devinfo); i++) {
      DWORD size=sizeof s;
      int k;
      HKEY hKey;
      if ((hKey=SetupDiOpenDevRegKey(devs,&devinfo,DICS_FLAG_GLOBAL,0,DIREG_DEV,KEY_READ))
       ==INVALID_HANDLE_VALUE) continue;
      if (!RegQueryValueEx(hKey,TEXT("PortName"),NULL,NULL,(LPBYTE)s,&size)
      && _stscanf(s,TEXT("COM%d"),&k)==1) {	// LPTs herauswerfen
        cbei.lParam=--k;			// numerisch wie bei Linux mit 0 beginnend
        int idx=(int)SendMessage(hCombo,CBEM_INSERTITEM,0,(LPARAM)&cbei);	// PortName-Wert, so wie er ist
        if (k==ComNr) ComboBox_SetCurSel(hCombo,idx);
      }
      RegCloseKey(hKey);
    }
    SetupDiDestroyDeviceInfoList(devs);
  }
}


INT_PTR CALLBACK SettingsDlgProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
  switch (Msg) {
    case WM_INITDIALOG: {
      ild.cbSize=sizeof(ild);
      SetupDiGetClassImageList(&ild);
      SendMessage(Wnd,WM_DEVICECHANGE,0,0);
    }return TRUE;
    case WM_COMMAND: switch (wParam) {
      case MAKELONG(20,CBN_SELCHANGE): {
       int idx=ComboBox_GetCurSel((HWND)lParam);
       config.ComNr=(BYTE)ComboBox_GetItemData((HWND)lParam,idx);
      }break;
      case IDOK:
      case IDCANCEL: {
        EndDialog(Wnd,LOWORD(wParam));
      }break;
    }break;
    case WM_DESTROY: {
      SetupDiDestroyClassImageList(&ild);
    }break;
    case WM_DEVICECHANGE: {
      FillComboExSerial(GetDlgItem(Wnd,20),config.ComNr);
    }break;
  }
  return FALSE;
}

Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded