#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: UTF-8 | 0
|