1 // Profile.h: interface of the CProfile class
\r
3 //////////////////////////////////////////////////////////////////////
\r
5 #if !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)
\r
6 #define AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_
\r
10 #endif // _MSC_VER > 1000
\r
12 #include <winperf.h> // for Windows NT
\r
13 #include "resource.h"
\r
15 #define PROCESS_SIZE MAX_PATH
\r
18 // Function pointer types for accessing Toolhelp32 functions dynamically.
\r
19 // By dynamically accessing these functions, we can do so only on Windows
\r
20 // 95 and still run on Windows NT, which does not have these functions.
\r
22 #include <tlhelp32.h> // for Windows 95
\r
23 typedef BOOL (WINAPI *PROCESSWALK)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
\r
24 typedef HANDLE (WINAPI *CREATESNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID);
\r
26 typedef struct _TASK_LIST {
\r
28 CHAR ProcessName[PROCESS_SIZE];
\r
29 } TASK_LIST, *PTASK_LIST;
\r
31 enum { MAX_TASKS = 256 };
\r
33 enum KEY_TYPE { NORMAL_KEY, PUSHED_KEY, DROPPABLE_KEY, ORIGINAL_KEY, REMAPPED_KEY, REMAPPED_PUSHED_KEY };
\r
34 enum HKEY_TYPE { CURRENT_USER, LOCAL_MACHINE, MAX_HKEY_TYPE }; // USERS, CLASSES_ROOT, CURRENT_CONFIG,
\r
36 typedef struct ScanCode
\r
39 BYTE nPrefixedScanCode; // 0x00, 0xE0 or 0xE1 cf. Keyboard Scan Code Specification -- 16
\r
42 typedef struct ScanCodeMapping
\r
45 ScanCode_t original;
\r
46 } ScanCodeMapping_t;
\r
50 typedef struct KeyboardLayout
\r
52 ScanCode_t scancode;
\r
54 int nCurrentControlID;
\r
60 static KeyboardLayout_t KeyboardLayouts[] = {
\r
61 {{0x01, 0x00}, IDC_ESC, IDC_ESC_, IDS_ESC},
\r
62 {{0x02, 0x00}, IDC_1, IDC_1_, IDS_1},
\r
63 {{0x03, 0x00}, IDC_2, IDC_2_, IDS_2},
\r
64 {{0x04, 0x00}, IDC_3, IDC_3_, IDS_3},
\r
65 {{0x05, 0x00}, IDC_4, IDC_4_, IDS_4},
\r
66 {{0x06, 0x00}, IDC_5, IDC_5_, IDS_5},
\r
67 {{0x07, 0x00}, IDC_6, IDC_6_, IDS_6},
\r
68 {{0x08, 0x00}, IDC_7, IDC_7_, IDS_7},
\r
69 {{0x09, 0x00}, IDC_8, IDC_8_, IDS_8},
\r
70 {{0x0a, 0x00}, IDC_9, IDC_9_, IDS_9},
\r
71 {{0x0b, 0x00}, IDC_0, IDC_0_, IDS_0_},
\r
72 {{0x0c, 0x00}, IDC_MINUS, IDC_MINUS_, IDS_MINUS},
\r
73 {{0x0d, 0x00}, IDC_EQUAL, IDC_EQUAL_, IDS_EQUAL}, // = /// ^
\r
74 {{0x0e, 0x00}, IDC_BACKSPACE, IDC_BACKSPACE_, IDS_BACKSPACE},
\r
75 {{0x0f, 0x00}, IDC_TAB, IDC_TAB_, IDS_TAB},
\r
76 {{0x10, 0x00}, IDC_Q, IDC_Q_, IDS_Q},
\r
77 {{0x11, 0x00}, IDC_W, IDC_W_, IDS_W},
\r
78 {{0x12, 0x00}, IDC_E, IDC_E_, IDS_E},
\r
79 {{0x13, 0x00}, IDC_R, IDC_R_, IDS_R},
\r
80 {{0x14, 0x00}, IDC_T, IDC_T_, IDS_T},
\r
81 {{0x15, 0x00}, IDC_Y, IDC_Y_, IDS_Y},
\r
82 {{0x16, 0x00}, IDC_U, IDC_U_, IDS_U},
\r
83 {{0x17, 0x00}, IDC_I, IDC_I_, IDS_I},
\r
84 {{0x18, 0x00}, IDC_O, IDC_O_, IDS_O},
\r
85 {{0x19, 0x00}, IDC_P, IDC_P_, IDS_P},
\r
86 {{0x1a, 0x00}, IDC_SQUARE_BRA, IDC_SQUARE_BRA_, IDS_SQUARE_BRA}, // 101/104: [, 106/109: @
\r
87 {{0x1b, 0x00}, IDC_SQUARE_CKET, IDC_SQUARE_CKET_, IDS_SQUARE_CKET}, // 101/104: ], 106/109: [
\r
88 {{0x1c, 0x00}, IDC_ENTER, IDC_ENTER_, IDS_ENTER},
\r
89 {{0x1c, 0xe0}, IDC_NUMPADENTER, IDC_NUMPADENTER_, IDS_NUMPADENTER},
\r
90 {{0x1d, 0x00}, IDC_LEFT_CTRL, IDC_LEFT_CTRL_, IDS_LEFT_CTRL},
\r
91 {{0x1d, 0xe0}, IDC_RIGHT_CTRL, IDC_RIGHT_CTRL_, IDS_RIGHT_CTRL},
\r
92 {{0x1d, 0xe1}, IDC_PAUSE, IDC_PAUSE_, IDS_PAUSE},
\r
93 {{0x1e, 0x00}, IDC_A, IDC_A_, IDS_A},
\r
94 {{0x1f, 0x00}, IDC_S, IDC_S_, IDS_S},
\r
95 {{0x20, 0x00}, IDC_D, IDC_D_, IDS_D},
\r
96 {{0x21, 0x00}, IDC_F, IDC_F_, IDS_F},
\r
97 {{0x22, 0x00}, IDC_G, IDC_G_, IDS_G},
\r
98 {{0x23, 0x00}, IDC_H, IDC_H_, IDS_H},
\r
99 {{0x24, 0x00}, IDC_J, IDC_J_, IDS_J},
\r
100 {{0x25, 0x00}, IDC_K, IDC_K_, IDS_K},
\r
101 {{0x26, 0x00}, IDC_L, IDC_L_, IDS_L},
\r
102 {{0x27, 0x00}, IDC_SEMICOLON, IDC_SEMICOLON_, IDS_SEMICOLON},
\r
103 {{0x28, 0x00}, IDC_QUOTE, IDC_QUOTE_, IDS_QUOTE}, // 101/104: ', 106/109: :
\r
104 {{0x29, 0x00}, IDC_BACK_QUOTE, IDC_BACK_QUOTE_, IDS_BACK_QUOTE}, // 101/104: `, 106/109: hankaku/zenkaku
\r
105 {{0x2a, 0x00}, IDC_LEFT_SHIFT, IDC_LEFT_SHIFT_, IDS_LEFT_SHIFT},
\r
106 {{0x2b, 0x00}, IDC_BACKSLASH, IDC_BACKSLASH_, IDS_BACKSLASH}, // 101/104: \, 106/109: ]
\r
107 {{0x2c, 0x00}, IDC_Z, IDC_Z_, IDS_Z},
\r
108 {{0x2d, 0x00}, IDC_X, IDC_X_, IDS_X},
\r
109 {{0x2e, 0x00}, IDC_C, IDC_C_, IDS_C},
\r
110 {{0x2f, 0x00}, IDC_V, IDC_V_, IDS_V},
\r
111 {{0x30, 0x00}, IDC_B, IDC_B_, IDS_B},
\r
112 {{0x31, 0x00}, IDC_N, IDC_N_, IDS_N},
\r
113 {{0x32, 0x00}, IDC_M, IDC_M_, IDS_M},
\r
114 {{0x33, 0x00}, IDC_COMMA, IDC_COMMA_, IDS_COMMA},
\r
115 {{0x34, 0x00}, IDC_PERIOD, IDC_PERIOD_, IDS_PERIOD},
\r
116 {{0x35, 0x00}, IDC_SLASH, IDC_SLASH_, IDS_SLASH},
\r
117 {{0x35, 0xe0}, IDC_DIVIDE, IDC_DIVIDE_, IDS_DIVIDE},
\r
118 {{0x36, 0x00}, IDC_RIGHT_SHIFT, IDC_RIGHT_SHIFT_, IDS_RIGHT_SHIFT},
\r
119 {{0x37, 0x00}, IDC_MULTIPLY, IDC_MULTIPLY_, IDS_MULTIPLY},
\r
120 {{0x37, 0xe0}, IDC_PRINT_SCREEN, IDC_PRINT_SCREEN_, IDS_PRINT_SCREEN},
\r
121 {{0x38, 0x00}, IDC_LEFT_ALT, IDC_LEFT_ALT_, IDS_LEFT_ALT},
\r
122 {{0x38, 0xe0}, IDC_RIGHT_ALT, IDC_RIGHT_ALT_, IDS_RIGHT_ALT},
\r
123 {{0x39, 0x00}, IDC_SPACE, IDC_SPACE_, IDS_SPACE},
\r
124 {{0x3a, 0x00}, IDC_CAPS_LOCK, IDC_CAPS_LOCK_, IDS_CAPS_LOCK},
\r
125 {{0x3b, 0x00}, IDC_F1, IDC_F1_, IDS_F1},
\r
126 {{0x3c, 0x00}, IDC_F2, IDC_F2_, IDS_F2},
\r
127 {{0x3d, 0x00}, IDC_F3, IDC_F3_, IDS_F3},
\r
128 {{0x3e, 0x00}, IDC_F4, IDC_F4_, IDS_F4},
\r
129 {{0x3f, 0x00}, IDC_F5, IDC_F5_, IDS_F5},
\r
130 {{0x40, 0x00}, IDC_F6, IDC_F6_, IDS_F6},
\r
131 {{0x41, 0x00}, IDC_F7, IDC_F7_, IDS_F7},
\r
132 {{0x42, 0x00}, IDC_F8, IDC_F8_, IDS_F8},
\r
133 {{0x43, 0x00}, IDC_F9, IDC_F9_, IDS_F9},
\r
134 {{0x44, 0x00}, IDC_F10, IDC_F10_, IDS_F10},
\r
135 {{0x45, 0xe0}, IDC_NUM_LOCK, IDC_NUM_LOCK_, IDS_NUM_LOCK},
\r
136 {{0x46, 0x00}, IDC_SCROLL_LOCK, IDC_SCROLL_LOCK_, IDS_SCROLL_LOCK},
\r
137 {{0x47, 0x00}, IDC_NUMPAD7, IDC_NUMPAD7_, IDS_NUMPAD7},
\r
138 {{0x47, 0xe0}, IDC_HOME, IDC_HOME_, IDS_HOME},
\r
139 {{0x48, 0x00}, IDC_NUMPAD8, IDC_NUMPAD8_, IDS_NUMPAD8},
\r
140 {{0x48, 0xe0}, IDC_UP, IDC_UP_, IDS_UP},
\r
141 {{0x49, 0x00}, IDC_NUMPAD9, IDC_NUMPAD9_, IDS_NUMPAD9},
\r
142 {{0x49, 0xe0}, IDC_PAGE_UP, IDC_PAGE_UP_, IDS_PAGE_UP},
\r
143 {{0x4a, 0x00}, IDC_SUBTRACT, IDC_SUBTRACT_, IDS_SUBTRACT},
\r
144 {{0x4b, 0x00}, IDC_NUMPAD4, IDC_NUMPAD4_, IDS_NUMPAD4},
\r
145 {{0x4b, 0xe0}, IDC_LEFT, IDC_LEFT_, IDS_LEFT},
\r
146 {{0x4c, 0x00}, IDC_NUMPAD5, IDC_NUMPAD5_, IDS_NUMPAD5},
\r
147 {{0x4d, 0x00}, IDC_NUMPAD6, IDC_NUMPAD6_, IDS_NUMPAD6},
\r
148 {{0x4d, 0xe0}, IDC_RIGHT, IDC_RIGHT_, IDS_RIGHT},
\r
149 {{0x4e, 0x00}, IDC_ADD, IDC_ADD_, IDS_ADD},
\r
150 {{0x4f, 0x00}, IDC_NUMPAD1, IDC_NUMPAD1_, IDS_NUMPAD1},
\r
151 {{0x4f, 0xe0}, IDC_END, IDC_END_, IDS_END},
\r
152 {{0x50, 0x00}, IDC_NUMPAD2, IDC_NUMPAD2_, IDS_NUMPAD2},
\r
153 {{0x50, 0xe0}, IDC_DOWN, IDC_DOWN_, IDS_DOWN},
\r
154 {{0x51, 0x00}, IDC_NUMPAD3, IDC_NUMPAD3_, IDS_NUMPAD3},
\r
155 {{0x51, 0xe0}, IDC_PAGE_DOWN, IDC_PAGE_DOWN_, IDS_PAGE_DOWN},
\r
156 {{0x52, 0x00}, IDC_NUMPAD0, IDC_NUMPAD0_, IDS_NUMPAD0},
\r
157 {{0x52, 0xe0}, IDC_INSERT, IDC_INSERT_, IDS_INSERT},
\r
158 {{0x53, 0x00}, IDC_NUMPADDELETE, IDC_NUMPADDELETE_, IDS_NUMPADDELETE},
\r
159 {{0x53, 0xe0}, IDC_DELETE, IDC_DELETE_, IDS_DELETE},
\r
160 {{0x57, 0x00}, IDC_F11, IDC_F11_, IDS_F11},
\r
161 {{0x58, 0x00}, IDC_F12, IDC_F12_, IDS_F12},
\r
162 {{0x5b, 0xe0}, IDC_LEFT_WINDOWS, IDC_LEFT_WINDOWS_, IDS_LEFT_WINDOWS},
\r
163 {{0x5c, 0xe0}, IDC_RIGHT_WINDOWS, IDC_RIGHT_WINDOWS_, IDS_RIGHT_WINDOWS},
\r
164 {{0x5d, 0xe0}, IDC_APPLICATION, IDC_APPLICATION_, IDS_APPLICATION},
\r
165 {{0x5e, 0xe0}, IDC_ACPI_POWER, IDC_ACPI_POWER_, IDS_ACPI_POWER},
\r
166 {{0x5f, 0xe0}, IDC_ACPI_SLEEP, IDC_ACPI_SLEEP_, IDS_ACPI_SLEEP},
\r
167 {{0x63, 0xe0}, IDC_ACPI_WAKE, IDC_ACPI_WAKE_, IDS_ACPI_WAKE},
\r
168 {{0x70, 0x00}, IDC_KANA, IDC_KANA_, IDS_KANA},
\r
169 {{0x73, 0x00}, IDC_BACKSLASH2, IDC_BACKSLASH2_, IDS_BACKSLASH2}, // \ ,./\
\r
170 {{0x79, 0x00}, IDC_CONVERT, IDC_CONVERT_, IDS_CONVERT},
\r
171 {{0x7b, 0x00}, IDC_NONCONVERT, IDC_NONCONVERT_, IDS_NONCONVERT},
\r
172 {{0x7d, 0x00}, IDC_BACKSLASH1, IDC_BACKSLASH1_, IDS_BACKSLASH1}, // \ -^\
\r
178 static int GetKeyboardSpeed(void);
\r
179 static int LostKeyWarning(HKEY_TYPE hkeyType);
\r
180 static CString GetWindowText(int nApplicationID);
\r
181 static void SetWindowText(int nApplicationID, CString szWindowText);
\r
182 static void SetEnableCUA(int nApplicationID, BOOL bEnableCUA);
\r
183 static BOOL GetEnableCUA(int nApplicationID);
\r
184 static void ImportProperties();
\r
185 static void ExportProperties();
\r
186 static KeyboardLayout_t* GetKeyboardLayouts(int nKey);
\r
187 static int GetToolTipID(int nToolTipID);
\r
188 static void SetNoCursor();
\r
189 static void SetNormalCursor();
\r
190 static void SetDraggingCursor();
\r
191 static void SetScanCodeMap(HKEY_TYPE hkeyType, ScanCodeMapping_t ScanCodeMappeing);
\r
192 static int GetCurrentControlID(ScanCode_t scancode);
\r
193 static int GetBaseControlID(ScanCode_t scancode);
\r
194 static BOOL GetScanCodeMap(HKEY_TYPE hkeyType, ScanCode_t original, ScanCode_t *current);
\r
195 static void RestartComputer();
\r
196 static BOOL IsVistaOrLater();
\r
197 static BOOL IsNT();
\r
198 static BOOL Is9x();
\r
199 static void SaveScanCodeMap(HKEY_TYPE hkeyType);
\r
200 static void LoadScanCodeMap(HKEY_TYPE hkeyType);
\r
201 static BOOL Is106Keyboard();
\r
202 static BOOL IsDialog(CString sz);
\r
203 static BOOL GetUseDialogSetting(int nApplicationID);
\r
204 static void SetUseDialogSetting(int nApplicationID, BOOL bUseDialogSetting);
\r
205 static int GetApplicationIndex(CString szApplicationName);
\r
206 static void CopyData(CString szDestinationApplication, CString szSourceApplication);
\r
207 static void ReadKeyBind(int *pnCommandType, int *pnKey, LPCTSTR szKeyBind);
\r
208 static LPCTSTR Key2String(int nKey);
\r
209 static LPCTSTR CommandType2String(int nCommandType);
\r
210 static int GetCurrentApplicationID(CComboBox *cApplicationList, CString szCurrentApplication);
\r
211 static int GetKillRingMax(int nApplicationID);
\r
212 static void SetKillRingMax(int nApplicationID, int nKillRingMax);
\r
213 static int GetCommandID(int nApplicationID, int nCommandType, int nKey);
\r
214 static void SetCommandID(int nApplicationID, int nCommandType, int nKey, int nCommandID);
\r
215 static void UpdateApplicationTitle(CComboBox *cApplicationList, CString szCurrentApplication, int nApplicationID, BOOL bSaveAndValidate);
\r
216 static void GetApplicationTitle(CComboBox *cApplicationList, CString &rList, int nIndex = -1);
\r
217 static BOOL IsDefault(CString sz);
\r
218 static int GetApplicationIndex(CString szApplicationName, BOOL bSaveAndValidate, int *nSettingStyle);
\r
219 static TASK_LIST m_TaskList[MAX_TASKS];
\r
220 static DWORD m_dwTasks;
\r
221 static void InitApplicationList(CComboBox *cApplicationList);
\r
222 static int GetSavedSettingCount();
\r
223 static void ClearData(CString szCurrentApplication);
\r
224 static void InitDllData();
\r
225 static void SaveRegistryData();
\r
226 static void LoadRegistryData();
\r
228 virtual ~CProfile();
\r
231 static void SaveKeyBind(CString szApplicationName, CString szCommandName, int nCommandType, int nKey);
\r
232 static BOOL DiableTokenPrivileges();
\r
233 static BOOL AdjustTokenPrivileges(LPCTSTR lpName);
\r
234 static void SaveCommand(CString szApplicationName, int nCommandID);
\r
235 static void SaveKeyBind(CString szApplicationName, int nCommandID, int nCommandType, int nKey);
\r
236 static void AddKeyBind2C_(CString szApplicationName, BYTE bVk);
\r
237 static void LevelUp();
\r
238 static BOOL ChangedKeyboardLayout(HKEY_TYPE hkeyType);
\r
239 static BYTE PrefixedScanCodeID2Code(int nPrefixedScanCodeID);
\r
240 static DWORD GetScanCodeLength(HKEY_TYPE hkeyType);
\r
241 static int PrefixedScanCode2ID(BYTE nPrefixedScanCode);
\r
242 static ScanCode_t m_CurrentScanCodeMap[MAX_HKEY_TYPE][4][256];
\r
243 static ScanCode_t m_ScanCodeMap[MAX_HKEY_TYPE][4][256];
\r
244 static int GetControlID(ScanCode_t scancode, BOOL bBase);
\r
245 static void Item2AppName(CString *sz);
\r
246 static int IsNotSameString(CComboBox *pApplication, CString szListItem);
\r
247 static int CountSeparator(CString szMainString, CString szSeparator);
\r
248 static void GetNthString(CString *szAppName, CString szWindowName, CString szSeparator, int n);
\r
249 static void GetAppName(CString *szAppName, LPCTSTR pWindowName);
\r
250 static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
\r
251 static BOOL IsTheString(CString sz, UINT nID);
\r
252 static PPERF_DATA_BLOCK GetPerformanceData(CString szProcessName);
\r
253 static BOOL GetProcessInfo(CString *szProcessName, DWORD *dwProcessId);
\r
254 static LPBYTE GetCounters();
\r
255 static void SetDllData();
\r
256 static CXkeymacsData m_XkeymacsData[MAX_APP];
\r
257 static void DeleteAllRegistryData();
\r
258 static DWORD GetTaskListNT(PTASK_LIST pTask, DWORD dwNumTasks);
\r
259 static DWORD GetTaskList(PTASK_LIST pTask, DWORD dwNumTasks);
\r
260 static BOOL IsCommandType(int nCommandType, LPCTSTR szKeyBind);
\r
261 static int KeyBind2Key(LPCTSTR szKey);
\r
262 static int KeyBind2CommandType(LPCTSTR szKeyBind);
\r
263 static CString WriteKeyBind(int nCommandType, int nKey);
\r
264 static void UpdateRegistryData(BOOL bSaveAndValidate);
\r
267 typedef struct CommandTypeName
\r
270 LPCTSTR szCommandTypeName;
\r
271 } CommandTypeName_t;
\r
273 static const CommandTypeName_t CommandTypes[] = {
\r
275 {SHIFT, _T("Shift+")},
\r
276 {CONTROL, _T("Ctrl+")},
\r
277 {CONTROL+SHIFT, _T("Ctrl+Shift+")},
\r
278 {META, _T("Meta+")},
\r
279 {META+SHIFT, _T("Meta+Shift+")},
\r
280 {CONTROL+META, _T("Ctrl+Meta+")},
\r
281 {CONTROL+META+SHIFT, _T("Ctrl+Meta+Shift+")},
\r
282 {CONTROLX+NONE, _T("Ctrl+X ")},
\r
283 {CONTROLX+SHIFT, _T("Ctrl+X Shift+")},
\r
284 {CONTROLX+CONTROL, _T("Ctrl+X Ctrl+")},
\r
285 {CONTROLX+CONTROL+SHIFT, _T("Ctrl+X Ctrl+Shift+")},
\r
286 {CONTROLX+META, _T("Ctrl+X Meta+")},
\r
287 {CONTROLX+META+SHIFT, _T("Ctrl+X Meta+Shift+")},
\r
288 {CONTROLX+CONTROL+META, _T("Ctrl+X Ctrl+Meta+")},
\r
289 {CONTROLX+CONTROL+META+SHIFT, _T("Ctrl+X Ctrl+Meta+Shift+")},
\r
293 #endif // !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)
\r