-void CProfile::LoadScanCodeMap(const HKEY_TYPE hkeyType)\r
-{\r
- memset(m_ScanCodeMap[hkeyType], 0, sizeof(m_ScanCodeMap[hkeyType]));\r
- memset(m_CurrentScanCodeMap[hkeyType], 0, sizeof(m_CurrentScanCodeMap[hkeyType]));\r
-\r
- CString szSubKey;\r
- CString szValueName;\r
- HKEY hKey = HKEY_LOCAL_MACHINE;\r
- if (IsNT()) {\r
- switch (hkeyType) {\r
- case CURRENT_USER:\r
- hKey = HKEY_CURRENT_USER;\r
- szSubKey.LoadString(IDS_REGSUBKEY_KEYBOARD_LAYOUT);\r
- break;\r
- case LOCAL_MACHINE:\r
- szSubKey.LoadString(IDS_REGSUBKEY_KEYBOARD_LAYOUT_ANY_USER);\r
- break;\r
- default:\r
- return;\r
- }\r
- szValueName.LoadString(IDS_SCANCODE_MAP);\r
- } else if (Is9x()) {\r
- szSubKey.LoadString(IDS_REGSUBKEY_KEY_REMAP);\r
- szValueName.LoadString(IDS_0);\r
- } else {\r
- return;\r
- }\r
-\r
- HKEY hkResult = NULL;\r
- if (RegOpenKeyEx(hKey, szSubKey, 0, KEY_QUERY_VALUE, &hkResult) == ERROR_SUCCESS) {\r
- // get data size\r
- DWORD dwType = REG_BINARY;\r
- DWORD dwData = 0;\r
- RegQueryValueEx(hkResult, szValueName, NULL, &dwType, NULL, &dwData);\r
-\r
- // get data\r
- LPBYTE lpData = new BYTE[dwData];\r
- if (lpData) {\r
- RegQueryValueEx(hkResult, szValueName, NULL, &dwType, lpData, &dwData);\r
- }\r
- RegCloseKey(hkResult);\r
-\r
- if (IsNT()) {\r
- if (lpData && dwData) {\r
- DWORD offset = 0;\r
- offset += 8; // skip Version Information and Flags\r
- DWORD *pdwMappings = (DWORD *)(lpData + offset);\r
- offset += 4; // skip Number of Mappings\r
- DWORD *pdwNullTerminator = (DWORD *)(lpData + dwData - 4);\r
-\r
- if (4 * *pdwMappings + 12 != dwData) {\r
- // illegal data\r
- } else if (*pdwNullTerminator != 0) {\r
- // illegal data\r
- } else {\r
- while (offset < dwData - 4) {\r
- ScanCodeMapping_t *pScanCodeMapping = (ScanCodeMapping_t *)(lpData + offset);\r
- offset += 4; // go to next data\r
-\r
- m_CurrentScanCodeMap[hkeyType][PrefixedScanCode2ID(pScanCodeMapping->original.nPrefixedScanCode)][pScanCodeMapping->original.nScanCode].nPrefixedScanCode = pScanCodeMapping->current.nPrefixedScanCode;\r
- m_CurrentScanCodeMap[hkeyType][PrefixedScanCode2ID(pScanCodeMapping->original.nPrefixedScanCode)][pScanCodeMapping->original.nScanCode].nScanCode = pScanCodeMapping->current.nScanCode;\r
- m_ScanCodeMap[hkeyType][PrefixedScanCode2ID(pScanCodeMapping->original.nPrefixedScanCode)][pScanCodeMapping->original.nScanCode].nPrefixedScanCode = pScanCodeMapping->current.nPrefixedScanCode;\r
- m_ScanCodeMap[hkeyType][PrefixedScanCode2ID(pScanCodeMapping->original.nPrefixedScanCode)][pScanCodeMapping->original.nScanCode].nScanCode = pScanCodeMapping->current.nScanCode;\r
- }\r
- }\r
- }\r
- }\r
- delete[] lpData;\r
- lpData = NULL;\r
- }\r
-}\r
-\r
-int CProfile::LostKeyWarning(const HKEY_TYPE hkeyType)\r
-{\r
- if (!ChangedKeyboardLayout(hkeyType)) {\r
- return IDOK;\r
- }\r
-\r
- CString szLostKeysList;\r
-\r
- for (int nPrefixedScanCodeID = 0; nPrefixedScanCodeID < 3; ++nPrefixedScanCodeID) {\r
- for (int nScanCode = 0; nScanCode < 256; ++nScanCode) {\r
- if (m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode) {\r
- BOOL lostKey = TRUE;\r
-\r
- for (int i = 0; i < 3 && lostKey; ++i) {\r
- for (int j = 0; j < 256 && lostKey; ++j) {\r
- if (m_ScanCodeMap[hkeyType][i][j].nPrefixedScanCode == nPrefixedScanCodeID\r
- && m_ScanCodeMap[hkeyType][i][j].nScanCode == nScanCode) {\r
- lostKey = FALSE;\r
- }\r
- }\r
- }\r
-\r
- if (lostKey) {\r
- for (int i = 0; i < sizeof(KeyboardLayouts)/sizeof(KeyboardLayouts[0]); ++i) {\r
- if (KeyboardLayouts[i].scancode.nScanCode == nScanCode\r
- && KeyboardLayouts[i].scancode.nPrefixedScanCode == nPrefixedScanCodeID) {\r
- CString szLostKey;\r
- szLostKey.Format(IDS_ERR_LOST_KEY, CString(MAKEINTRESOURCE(GetToolTipID(KeyboardLayouts[i].nToolTipID))));\r
- szLostKeysList += szLostKey;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (szLostKeysList.IsEmpty()) {\r
- return IDOK;\r
- }\r
-\r
- return AfxMessageBox(szLostKeysList, MB_OKCANCEL | MB_ICONEXCLAMATION);\r
-}\r
-\r
-void CProfile::SaveScanCodeMap(const HKEY_TYPE hkeyType)\r
-{\r
- CString szSubKey;\r
- CString szValueName;\r
- HKEY hKey = HKEY_LOCAL_MACHINE;\r
- if (IsNT()) {\r
- switch (hkeyType) {\r
- case CURRENT_USER:\r
- hKey = HKEY_CURRENT_USER;\r
- szSubKey.LoadString(IDS_REGSUBKEY_KEYBOARD_LAYOUT);\r
- break;\r
- case LOCAL_MACHINE:\r
- szSubKey.LoadString(IDS_REGSUBKEY_KEYBOARD_LAYOUT_ANY_USER);\r
- break;\r
- default:\r
- return;\r
- }\r
- szValueName.LoadString(IDS_SCANCODE_MAP);\r
- } else if (Is9x()) {\r
- szSubKey.LoadString(IDS_REGSUBKEY_KEY_REMAP);\r
- szValueName.LoadString(IDS_0);\r
- } else {\r
- return;\r
- }\r
-\r
- HKEY hkResult = NULL;\r
- if (RegCreateKeyEx(hKey, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hkResult, NULL) == ERROR_SUCCESS) {\r
- if (IsNT()) {\r
- DWORD cbData = GetScanCodeLength(hkeyType);\r
- if (cbData <= 16) {\r
- RegDeleteValue(hkResult, szValueName);\r
- } else {\r
- LPBYTE lpData = new BYTE[cbData];\r
- memset(lpData, 0, sizeof(BYTE) * cbData);\r
-\r
- {\r
- DWORD dwMappings = (cbData - 12) / 4;\r
- memmove(lpData + 8, &dwMappings, 4);\r
- }\r
-\r
- int offset = 12;\r
- for (int nPrefixedScanCodeID = 0; nPrefixedScanCodeID < 3; ++nPrefixedScanCodeID) {\r
- for (int nScanCode = 0; nScanCode < 256; ++nScanCode) {\r
- if (m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode) {\r
- ScanCodeMapping_t sScanCodeMapping = {'\0'};\r
- sScanCodeMapping.original.nPrefixedScanCode = PrefixedScanCodeID2Code(nPrefixedScanCodeID);\r
- sScanCodeMapping.original.nScanCode = (BYTE)nScanCode;\r
- sScanCodeMapping.current.nPrefixedScanCode = m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nPrefixedScanCode;\r
- sScanCodeMapping.current.nScanCode = m_ScanCodeMap[hkeyType][nPrefixedScanCodeID][nScanCode].nScanCode;\r
- memcpy(lpData + offset, &sScanCodeMapping, sizeof(sScanCodeMapping));\r
- offset += sizeof(sScanCodeMapping);\r
- }\r
- }\r
- }\r
- RegSetValueEx(hkResult, szValueName, 0, REG_BINARY, lpData, cbData);\r
-\r
- delete[] lpData;\r
- lpData = NULL;\r
- }\r
- }\r
- RegCloseKey(hkResult);\r
- }\r
-\r
- // Do you want to restart computer?\r
- if (ChangedKeyboardLayout(hkeyType)) {\r
- if (AfxMessageBox(CString(MAKEINTRESOURCE(IDS_RESTART_OR_NOT)), MB_YESNO | MB_ICONQUESTION) == IDYES) {\r
- RestartComputer();\r
- }\r
- }\r
-}\r
-\r
-// Return True if Windows 95, Windows 98, or Windows Me. \r
-BOOL CProfile::Is9x()\r
-{\r
- OSVERSIONINFO info = {sizeof(OSVERSIONINFO)};\r
- GetVersionEx(&info);\r
-\r
- if (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {\r
- return TRUE;\r
- }\r
- return FALSE;\r
-}\r
-\r
-// Return True if Windows NT 4.0, Windows 2000, Windows XP, Windows 2003 or Windows Vista.\r
-BOOL CProfile::IsNT()\r
-{\r
- OSVERSIONINFO info = {sizeof(OSVERSIONINFO)};\r
- GetVersionEx(&info);\r
-\r
- if (info.dwPlatformId == VER_PLATFORM_WIN32_NT) {\r
- return TRUE;\r
- }\r
- return FALSE;\r
-}\r
-\r
-// Return True if Windows Vista or later.\r