00001 #include "../ZakiLib.hpp" 00002 00003 using namespace std; 00004 00005 //============================================================================ 00006 //静的メンバ 00007 //============================================================================ 00008 LPDIRECTINPUT8 CDirectInputBase::g_lpDInput; 00009 list<GUID> CDirectInputBase::g_lstUseDeviceGuid; 00010 //list<DIDEVICEINSTANCE> CDirectInputBase::g_lstUseDeviceGuid; 00011 00012 //============================================================================ 00013 //デバイス列挙コールバック関数 00014 //引数 :デバイスのインスタンス(定義済) 00015 //戻り値 :任意の引数(定義済) 00016 //処理内容 : 00017 // デバイスの列挙 00018 // 列挙したデバイスの登録 00019 //============================================================================ 00020 BOOL CALLBACK CDirectInputBase::EnumDeviceCallback(const DIDEVICEINSTANCE *lpDdi,LPVOID lpContext) 00021 { 00022 //テスト表示 00023 //MessageBox(NULL,lpDdi->tszProductName,lpDdi->tszInstanceName,0); 00024 00025 //デバイスの重複チェック 00026 //list<DIDEVICEINSTANCE>::iterator it = g_lstUseDeviceGuid.begin(); 00027 //for(;it != g_lstUseDeviceGuid.end();it++) 00028 //{ 00029 // if(strcmp(lpDdi->tszInstanceName,(*it).tszInstanceName) == 0) 00030 // return DIENUM_CONTINUE; 00031 //} 00032 00033 list<DIDEVICEINSTANCE> *lstInst = (list<DIDEVICEINSTANCE> *)lpContext; 00034 if(lstInst == NULL) 00035 return DIENUM_STOP; 00036 00037 //GUIDの記憶 00038 lstInst->push_back(*lpDdi); 00039 00040 return DIENUM_CONTINUE; 00041 } 00042 /* 00043 //============================================================================ 00044 //デバイス列挙コールバック関数 00045 //引数 :デバイスのインスタンス(定義済) 00046 //戻り値 :任意の引数(定義済) 00047 //処理内容 : 00048 // デバイスの列挙 00049 //============================================================================ 00050 BOOL CALLBACK CDirectInputBase::EmunJoysticksCallback(const DIDEVICEINSTANCE *lpDdi,LPVOID lpContext) 00051 { 00052 HRESULT hr; 00053 CDirectInputBase *lpCDInput = (CDirectInputBase *)lpContext; 00054 00055 if(lpCDInput == NULL) 00056 return DIENUM_STOP; 00057 00058 //デバイスの重複チェック 00059 list<GUID>::iterator it = g_lstUseDeviceGuid.begin(); 00060 for(;it != g_lstUseDeviceGuid.end();it++) 00061 { 00062 if(lpDdi->guidInstance == (*it)) 00063 return DIENUM_CONTINUE; 00064 else 00065 break; 00066 } 00067 00068 //初期化したいデバイスか 00069 if(strcmp(lpCDInput->GetInstanceInfo().tszInstanceName,lpDdi->tszInstanceName) != 0) 00070 return DIENUM_CONTINUE; 00071 00072 //デバイスの作成 00073 // hr = lpDInput->CreateDevice(lpDdi->guidInstance,&lpDIdev,NULL); 00074 hr = lpCDInput->DeviceCreate(lpDdi); 00075 if(FAILED(hr)) 00076 return DIENUM_CONTINUE; 00077 00078 //GUIDの記憶 00079 g_lstUseDeviceGuid.push_back(lpDdi->guidInstance); 00080 // lpCDInput->SetGuid(lpDdi->guidInstance); 00081 // g_lstUseDeviceGuid.push_back(*lpDdi); 00082 00083 return DIENUM_STOP; 00084 } 00085 */ 00086 //============================================================================ 00087 //デバイスのオブジェクト(ボタンなど)の列挙 00088 //引数 :定義済み 00089 //戻り値 :定義済み 00090 //処理概要 : 00091 // デバイスのオブジェクト(ボタンなど)の列挙 00092 //============================================================================ 00093 BOOL CALLBACK CDirectInputBase::EnumAxesCallback(LPCDIDEVICEOBJECTINSTANCE lpDdoi,LPVOID pvRef) 00094 { 00095 HRESULT hr; 00096 00097 CDirectInputBase *lpCDInput = (CDirectInputBase *)(pvRef); 00098 00099 if(lpCDInput == NULL) 00100 return DIENUM_STOP; 00101 00102 //オブジェクトの設定 00103 hr = lpCDInput->DeviceAxes(lpDdoi); 00104 if(FAILED(hr)) 00105 return DIENUM_STOP; 00106 00107 return DIENUM_CONTINUE; 00108 } 00109 00110 //============================================================================ 00111 //記憶したGUIDの削除 00112 //引数 :削除するGUID 00113 //戻り値 :成否 00114 //処理概要 : 00115 // 記憶したGUIDをリストから削除する 00116 //============================================================================ 00117 int CDirectInputBase::RemoveGuid(GUID guid) 00118 { 00119 list<GUID>::iterator it = g_lstUseDeviceGuid.begin(); 00120 for(;it != g_lstUseDeviceGuid.end();it++) 00121 { 00122 if(guid == (*it)) 00123 { 00124 g_lstUseDeviceGuid.erase(it); 00125 return 1; 00126 } 00127 } 00128 00129 return 0; 00130 } 00131 //============================================================================ 00132 //デバイスの列挙 00133 //引数 :インスタンス構造体を集めるリスト 00134 // :列挙するデバイスの種類(DI8DEVCLASS_ALL) 00135 // :列挙するデバイスの状態(DIEDFL_ATTACHEDONLY) 00136 //戻り値 :なし 00137 //処理概要 : 00138 // 列挙されたデバイスをリストへ登録して返す 00139 //============================================================================ 00140 VOID CDirectInputBase::GetDeviceInstance(list<DIDEVICEINSTANCE> *lstInst,DWORD dwDevFilter,DWORD dwEnumFlag) 00141 { 00142 g_lpDInput->EnumDevices(dwDevFilter,EnumDeviceCallback,(LPVOID)lstInst,dwEnumFlag); 00143 } 00144 00145 //============================================================================ 00146 //デバイスの重複チェック 00147 //引数 :チェックするGUID 00148 //戻り値 :重複しているならTRUE 00149 //処理概要 : 00150 // GUIDが既に使用されているか調べる 00151 //============================================================================ 00152 BOOL CDirectInputBase::CheckDeviceGuid(GUID guid) 00153 { 00154 list<GUID>::iterator it = g_lstUseDeviceGuid.begin(); 00155 for(;it != g_lstUseDeviceGuid.end();it++) 00156 { 00157 if((*it) == guid) 00158 return TRUE; 00159 } 00160 00161 return FALSE; 00162 } 00163 00164 /* 00165 //============================================================================ 00166 //デバイスの数の取得 00167 //引数 :数えるデバイスのタイプ 00168 //戻り値 :デバイスの数 00169 //処理概要 : 00170 // デバイスのタイプ別の数を調べる 00171 //============================================================================ 00172 DWORD CDirectInputBase::GetDeviceNum(DWORD dwCntDevType) 00173 { 00174 DWORD dwCnt = 0; 00175 DWORD dwDevType,dwSubDevType; 00176 00177 list<DIDEVICEINSTANCE>::iterator it = g_lstUseDeviceGuid.begin(); 00178 for(;it != g_lstUseDeviceGuid.end();it++) 00179 { 00180 //デバイスタイプ取得 00181 dwDevType = GET_DIDEVICE_TYPE((*it).dwDevType); 00182 dwSubDevType = GET_DIDEVICE_SUBTYPE((*it).dwDevType); 00183 00184 //デバイスがあるか 00185 if(dwCntDevType == dwDevType || dwCntDevType == dwSubDevType) 00186 dwCnt++; 00187 } 00188 00189 return dwCnt; 00190 } 00191 00192 //============================================================================ 00193 //製品名の取得 00194 //引数 :取得する文字列へのポインタ 00195 // :取得するインデックス 00196 //戻り値 :成否 00197 //処理概要 : 00198 // インデックスを元にデバイスの製品名を取得する 00199 //============================================================================ 00200 int CDirectInputBase::GetDeviceName(TCHAR *szDeviceName,DWORD dwGetDevType,UINT uIdx) 00201 { 00202 DWORD dwDevType,dwSubDevType; 00203 00204 if(g_lstUseDeviceGuid.size() <= uIdx) 00205 return 0; 00206 00207 list<DIDEVICEINSTANCE>::iterator it = g_lstUseDeviceGuid.begin(); 00208 if(dwGetDevType) 00209 { 00210 //同一デバイスタイプの中のインデックス 00211 for(;it != g_lstUseDeviceGuid.end();it++) 00212 { 00213 //デバイスタイプ取得 00214 dwDevType = GET_DIDEVICE_TYPE((*it).dwDevType); 00215 dwSubDevType = GET_DIDEVICE_SUBTYPE((*it).dwDevType); 00216 00217 //デバイスがあるか 00218 if(dwGetDevType == dwDevType || dwGetDevType == dwSubDevType) 00219 { 00220 if(!uIdx) 00221 { 00222 //製品名をコピー 00223 strcpy(szDeviceName,(*it).tszProductName); 00224 return 1; 00225 } 00226 uIdx--; 00227 } 00228 } 00229 } 00230 else 00231 { 00232 //全てのデバイスのインデックス 00233 advance(it,uIdx);//itをidx分進める 00234 //製品名をコピー 00235 strcpy(szDeviceName,(*it).tszProductName); 00236 return 1; 00237 } 00238 00239 return 0; 00240 } 00241 00242 //============================================================================ 00243 //デバイス名からインスタンスを取得 00244 //引数 :デバイスインスタンスを受け取るアドレス 00245 // :デバイス名(製品名) 00246 //戻り値 :成否 00247 //処理内容 : 00248 // インスタンスのリストからデバイス名を元にインスタンスを探して返す 00249 //============================================================================ 00250 int CDirectInputBase::GetDevInst(DIDEVICEINSTANCE *lpDdInst,TCHAR *szDeviceName) 00251 { 00252 list<DIDEVICEINSTANCE>::iterator it = g_lstUseDeviceGuid.begin(); 00253 for(;it != g_lstUseDeviceGuid.end();it++) 00254 { 00255 if(strcmp(szDeviceName,(*it).tszProductName) == 0) 00256 { 00257 *lpDdInst = (*it); 00258 return 1; 00259 } 00260 } 00261 00262 return 0; 00263 } 00264 */