OSDN Git Service

Reorganize header files and their inclusion.
[xkeymacs/xkeymacs.git] / xkeymacsdll / Utils.cpp
1 // Utils.cpp: implementation of the CUtils class\r
2 //\r
3 //////////////////////////////////////////////////////////////////////\r
4 \r
5 #include "Utils.h"\r
6 #include "defs.h"\r
7 #include "../xkeymacs/resource.h"\r
8 #include <Imm.h>\r
9 #pragma data_seg(".xkmcs")\r
10 TCHAR CUtils::m_szApplicationName[MAX_PATH] = {'\0'};\r
11 TCHAR CUtils::m_szIMEName[MAX_PATH] = _T("IME");        // IDS_IME_FILE_NAME\r
12 #pragma data_seg()\r
13 \r
14 BOOL CUtils::GetFindDialogTitle(CString *szDialogTitle)\r
15 {\r
16         {\r
17                 TCHAR buf[WINDOW_TEXT_LENGTH] = {'\0'};\r
18                 GetWindowText(GetForegroundWindow(), buf, sizeof(buf));\r
19 //              CUtils::Log(_T("Window Text --%s--"), buf);\r
20                 szDialogTitle->Format(_T("%s"), buf);\r
21         }\r
22 \r
23         if (!szDialogTitle->Compare(_T("\8c\9f\8dõ"))                                 // notepad, wordpad, IE, regedit, \r
24                                                                                                                 // Excel, Front Page, PowerPoint, Acrobat Reader, IBM HPB\r
25          || !szDialogTitle->Compare(_T("Find"))                                 // notepad, Outlook, Outlook Express, Opera\r
26          || !szDialogTitle->Compare(_T("Find in this Page"))    // Mozilla\r
27          || !szDialogTitle->Compare(_T("Find/Replace"))                 // Eclipse\r
28          || !szDialogTitle->Compare(_T("\96{\95\93à\8c\9f\8dõ"))                   // Becky!\r
29          || !szDialogTitle->Compare(_T("\83\81\81[\83\8b\8c\9f\8dõ"))                   // Becky!\r
30          || !szDialogTitle->Compare(_T("\95\8e\9a\97ñ\82Ì\8c\9f\8dõ"))                 // M$ VC++\r
31          || !szDialogTitle->Compare(_T("\8c\9f\8dõ\82Æ\92u\8a·"))                   // M$ Word, 123\r
32          || !szDialogTitle->Compare(_T("\95\8f\91\82Ì\83e\83L\83X\83g\82Ì\8c\9f\8dõ")) // Lotus Notes\r
33          || !szDialogTitle->Compare(_T("\82±\82Ì\83y\81[\83W\82ð\8c\9f\8dõ"))             // Netscape 6\r
34          || !szDialogTitle->Compare(_T("\95\8e\9a\97ñ\8c\9f\8dõ"))                   // Dana\r
35          || !szDialogTitle->Compare(_T("\8c\9f\8dõ/\92u\8a·"))                    // PHP Editor\r
36          || !szDialogTitle->Compare(_T("\92u\8a·"))\r
37          || !szDialogTitle->Compare(_T("Replace"))) {\r
38                 return TRUE;\r
39         }\r
40 \r
41         szDialogTitle->Empty();\r
42         return FALSE;\r
43 }\r
44 \r
45 BOOL CUtils::IsFindDialog()\r
46 {\r
47         CString szDialogTitle;\r
48         return GetFindDialogTitle(&szDialogTitle);\r
49 }\r
50 \r
51 BOOL CUtils::IsXkeymacs()\r
52 {\r
53         return !_tcsicmp(m_szApplicationName, _T("xkeymacs.exe")) || !_tcsicmp(m_szApplicationName, _T("xkeymacs64.exe"));\r
54 }\r
55 \r
56 BOOL CUtils::IsChrome()\r
57 {\r
58         return !_tcsicmp(m_szApplicationName, _T("chrome.exe"));\r
59 }\r
60 \r
61 BOOL CUtils::IsAstecX()\r
62 {\r
63         return !_tcsicmp(m_szApplicationName, _T("astecx.exe"));\r
64 }\r
65 \r
66 BOOL CUtils::IsBecky()\r
67 {\r
68         return !_tcsicmp(m_szApplicationName, _T("b2.exe"));\r
69 }\r
70 \r
71 BOOL CUtils::IsEmacs()\r
72 {\r
73         return !_tcsicmp(m_szApplicationName, _T("Emacs.exe"));\r
74 }\r
75 \r
76 BOOL CUtils::IsExplorer()\r
77 {\r
78         return !_tcsicmp(m_szApplicationName, _T("explorer.exe"));\r
79 }\r
80 \r
81 BOOL CUtils::IsHidemaru()\r
82 {\r
83         return !_tcsicmp(m_szApplicationName, _T("hidemaru.exe"));\r
84 }\r
85 \r
86 BOOL CUtils::IsInternetExplorer()\r
87 {\r
88         return !_tcsicmp(m_szApplicationName, _T("iexplore.exe"));\r
89 }\r
90 \r
91 BOOL CUtils::IsLotus123()\r
92 {\r
93         return !_tcsicmp(m_szApplicationName, _T("123w.exe"));\r
94 }\r
95 \r
96 BOOL CUtils::IsLotusNotes()\r
97 {\r
98         return !_tcsicmp(m_szApplicationName, _T("nlnotes.exe"));\r
99 }\r
100 \r
101 BOOL CUtils::IsLotusWordPro()\r
102 {\r
103         return !_tcsicmp(m_szApplicationName, _T("wordpro.exe"));\r
104 }\r
105 \r
106 BOOL CUtils::IsMeadow()\r
107 {\r
108         return !_tcsicmp(m_szApplicationName, _T("Meadow.exe"))\r
109                 || !_tcsicmp(m_szApplicationName, _T("Meadow95.exe"))\r
110                 || !_tcsicmp(m_szApplicationName, _T("MeadowNT.exe"));\r
111 }\r
112 \r
113 BOOL CUtils::IsMicrosoftFrontPage()\r
114 {\r
115         return !_tcsicmp(m_szApplicationName, _T("frontpg.exe"));\r
116 }\r
117 \r
118 BOOL CUtils::IsMicrosoftWord()\r
119 {\r
120         return !_tcsicmp(m_szApplicationName, _T("winword.exe"));\r
121 }\r
122 \r
123 BOOL CUtils::IsMozilla()\r
124 {\r
125         return !_tcsicmp(m_szApplicationName, _T("mozilla.exe"))\r
126                 || !_tcsicmp(m_szApplicationName, _T("firefox.exe"));\r
127 }\r
128 \r
129 BOOL CUtils::IsMuleForWin32()\r
130 {\r
131         return !_tcsicmp(m_szApplicationName, _T("mule.exe"))\r
132                 || !_tcsicmp(m_szApplicationName, _T("mulent.exe"))\r
133                 || !_tcsicmp(m_szApplicationName, _T("mulecd.exe"));\r
134 }\r
135 \r
136 BOOL CUtils::IsNetscape()\r
137 {\r
138         return !_tcsicmp(m_szApplicationName, _T("netscp6.exe"))\r
139                 || !_tcsicmp(m_szApplicationName, _T("netscp.exe"));\r
140 }\r
141 \r
142 BOOL CUtils::IsNotepad()\r
143 {\r
144         return !_tcsicmp(m_szApplicationName, _T("notepad.exe"));\r
145 }\r
146 \r
147 BOOL CUtils::IsNotepadPP()\r
148 {\r
149         return !_tcsicmp(m_szApplicationName, _T("notepad++.exe"));\r
150 }\r
151 \r
152 BOOL CUtils::IsOpera()\r
153 {\r
154         return !_tcsicmp(m_szApplicationName, _T("opera.exe"));\r
155 }\r
156 \r
157 BOOL CUtils::IsOutlook()\r
158 {\r
159         return !_tcsicmp(m_szApplicationName, _T("outlook.exe"));\r
160 }\r
161 \r
162 BOOL CUtils::IsOutlookExpress()\r
163 {\r
164         return !_tcsicmp(m_szApplicationName, _T("msimn.exe"));\r
165 }\r
166 \r
167 BOOL CUtils::IsSakuraEditor()\r
168 {\r
169         return !_tcsicmp(m_szApplicationName, _T("sakura.exe"));\r
170 }\r
171 \r
172 BOOL CUtils::IsTeraTermPro()\r
173 {\r
174         return !_tcsicmp(m_szApplicationName, _T("ttermpro.exe"));\r
175 }\r
176 \r
177 BOOL CUtils::IsVisualCpp()\r
178 {\r
179         return !_tcsicmp(m_szApplicationName, _T("msdev.exe"));\r
180 }\r
181 \r
182 BOOL CUtils::IsWordpad()\r
183 {\r
184         return !_tcsicmp(m_szApplicationName, _T("wordpad.exe"));\r
185 }\r
186 \r
187 BOOL CUtils::IsXWin()\r
188 {\r
189         return !_tcsicmp(m_szApplicationName, _T("XWin.exe"));\r
190 }\r
191 \r
192 BOOL CUtils::IsXyzzy()\r
193 {\r
194         return !_tcsicmp(m_szApplicationName, _T("xyzzy.exe"));\r
195 }\r
196 \r
197 LPCTSTR const CUtils::GetApplicationName()\r
198 {\r
199         return m_szApplicationName;\r
200 }\r
201 \r
202 void CUtils::FairConsoleApplicationName(LPTSTR szApplicationName, LPTSTR szWindowText)\r
203 {\r
204         if (IsFindDialog()) {\r
205                 return;\r
206         }\r
207 \r
208         if (*szWindowText == '"' && _tcschr(szWindowText+1, _T('"'))) {         // "foo bar" -> foo bar\r
209                 int len = _tcschr(szWindowText+1, _T('"')) - szWindowText - 1;  // length of "foo bar"\r
210                 memmove(szWindowText, szWindowText + 1, len);\r
211                 memset(szWindowText + len, 0, WINDOW_TEXT_LENGTH - len);\r
212         } else if (_tcschr(szWindowText, _T(' '))) {    // foo bar -> foo\r
213                 LPTSTR p = _tcschr(szWindowText, _T(' '));\r
214                 memset(p, 0, WINDOW_TEXT_LENGTH - (p - szWindowText));\r
215         }\r
216 \r
217         memset(szApplicationName, 0, MAX_PATH);\r
218         _stprintf_s(szApplicationName, MAX_PATH, _T("%s"), szWindowText);\r
219 \r
220         static LPCTSTR const szExe = _T(".exe");\r
221         if (_tcsnicmp(szApplicationName + _tcslen(szApplicationName) - _tcslen(szExe), szExe, _tcslen(szExe))) {\r
222                 _tcscat_s(szApplicationName, MAX_PATH, szExe);\r
223         }\r
224 }\r
225 \r
226 // Set real application name in the szApplicationName.\r
227 void CUtils::SetCorrectApplicationName(LPTSTR szApplicationName, LPTSTR szWindowText)\r
228 {\r
229         if (IsConsole(szApplicationName)) {\r
230                 int i = 0;\r
231                 static LPCTSTR const szPromptName[] = {_T("Command Prompt"), _T("Mark Command Prompt"), _T("Select Command Prompt"), _T("MS-DOS Prompt"),\r
232                                                                                            _T("Visual Studio .NET Command Prompt"), _T("Visual Studio .NET 2003 Command Prompt"),\r
233                                                                                            _T("\83R\83}\83\93\83\83v\83\8d\83\93\83v\83g"), _T("\94Í\88Í\8ew\92è \83R\83}\83\93\83\83v\83\8d\83\93\83v\83g"), _T("\91I\91ð \83R\83}\83\93\83\83v\83\8d\83\93\83v\83g"), _T("MS-DOS \83v\83\8d\83\93\83v\83g"),\r
234                                                                                            _T("Visual Studio .NET \83R\83}\83\93\83\83v\83\8d\83\93\83v\83g"), _T("Visual Studio .NET 2003 \83R\83}\83\93\83\83v\83\8d\83\93\83v\83g")};\r
235                 static LPCTSTR const szPromptPath[] = {_T("system32\\cmd.exe")};        // WindowText of Command Prompt is sometimes this style. But MS-DOS Prompt's is always MS-DOS Prompt.\r
236                 static LPCTSTR const szSeparator = _T(" - ");\r
237 \r
238                 for (i = 0; i < sizeof(szPromptName) / sizeof(szPromptName[0]); ++i) {\r
239                         if (!_tcsicmp(szWindowText, szPromptName[i])) { // "Command Prompt"\r
240                                 return;\r
241                         }\r
242 \r
243                         TCHAR sz[WINDOW_TEXT_LENGTH] = {'\0'};\r
244                         _stprintf_s(sz, _T("%s%s"), szPromptName[i], szSeparator);\r
245 \r
246                         if (!_tcsnicmp(szWindowText, sz, _tcslen(sz))) {        // "Command Promp - foo"\r
247                                 _tcscpy_s(szWindowText, WINDOW_TEXT_LENGTH, szWindowText + _tcslen(sz));\r
248                                 FairConsoleApplicationName(szApplicationName, szWindowText);\r
249                                 return;\r
250                         }\r
251                 }\r
252 \r
253                 for (i = 0; i < sizeof(szPromptPath) / sizeof(szPromptPath[0]); ++i) {\r
254                         TCHAR lower[WINDOW_TEXT_LENGTH] = {'\0'};\r
255                         _tcscpy_s(lower, szWindowText);\r
256                         _tcslwr_s(lower);\r
257 \r
258                         if (_tcsstr(lower, szPromptPath[i])) {\r
259                                 TCHAR sz[WINDOW_TEXT_LENGTH] = {'\0'};\r
260                                 _stprintf_s(sz, _T("%s%s"), szPromptPath[i], szSeparator);\r
261 \r
262                                 if (_tcsstr(lower, sz)) {                               // "X:\WINNT\system32\cmd.exe - foo"\r
263                                         _tcscpy_s(szWindowText, WINDOW_TEXT_LENGTH, _tcsstr(lower, sz) + _tcslen(sz));\r
264                                         FairConsoleApplicationName(szApplicationName, szWindowText);\r
265                                         return;\r
266                                 } else {                                                                        // "X:\WINNT\system32\cmd.exe"\r
267                                         return;\r
268                                 }\r
269                         }\r
270                 }\r
271 \r
272                 LPTSTR newName = NULL, newText = NULL;\r
273                 if (!_tcsicmp(szWindowText, _T("Cygwin Bash Shell"))\r
274                  || (*szWindowText == _T('~'))\r
275                  || (*szWindowText == _T('/'))) {                                               // Bash\r
276                         newName = _T("bash.exe");\r
277                         newText = _T("bash");\r
278                 } else if (!_tcsicmp(szWindowText + _tcslen(szWindowText) - 8, _T(" - pdksh"))) {\r
279                         newName = _T("pdksh.exe");\r
280                         newText = _T("pdksh");\r
281                 } else if (!_tcsicmp(szWindowText + _tcslen(szWindowText) - 7, _T(" - tcsh"))) {\r
282                         newName = _T("tcsh.exe");\r
283                         newText = _T("tcsh");\r
284                 } else if (!_tcsicmp(szWindowText + _tcslen(szWindowText) - 6, _T(" - zsh"))) {\r
285                         newName = _T("zsh.exe");\r
286                         newText = _T("zsh");\r
287                 } else if (!_tcsnicmp(szWindowText, _T("MKS Korn Shell"), 14)\r
288                                 || !_tcsnicmp(szWindowText, _T("cat"), 3)) {\r
289                         newName = _T("sh.exe");\r
290                         newText = _T("MKS Korn Shell");\r
291                 } else if (!_tcsnicmp(szWindowText + 1, _T(":/"), 2)\r
292                                 || !_tcsnicmp(szWindowText + 1, _T(":\\"), 2)) {\r
293                         newName = _T("csh.exe");\r
294                         newText = _T("C Shell");\r
295                 } else if (_tcsstr(szWindowText, _T(" - VIM"))) {\r
296                         newName = _T("vim.exe");\r
297                         newText = _T("VIM");\r
298                 } else if (_tcsstr(szWindowText, _T(" - Poderosa"))) {\r
299                         newName = _T("Poderosa.exe");\r
300                         newText = _T("Poderosa");\r
301                 } else {                                                                                        // unknown console application\r
302                         FairConsoleApplicationName(szApplicationName, szWindowText);\r
303                 }\r
304                 if (newName) {\r
305                         memset(szApplicationName, 0, MAX_PATH);\r
306                         _tcscpy_s(szApplicationName, MAX_PATH, newName);\r
307                         memset(szWindowText, 0, WINDOW_TEXT_LENGTH);\r
308                         _tcscpy_s(szWindowText, WINDOW_TEXT_LENGTH, newText);\r
309                 }\r
310         } else if (IsJavaW(szApplicationName)) {\r
311                 LPTSTR newName = NULL;\r
312                 if (!_tcsicmp(szWindowText + _tcslen(szWindowText) - 19, _T(" - Eclipse Platform"))) {\r
313                         newName = _T("eclipse.exe");\r
314                 } else if (!_tcsicmp(szWindowText, _T("BlueJ"))\r
315                             || !_tcsnicmp(szWindowText, _T("BlueJ: "), 7)) {\r
316                         newName = _T("bluej.exe");\r
317                 } else if (!_tcsicmp(szWindowText, _T("JUDE"))\r
318                             || !_tcsnicmp(szWindowText, _T("JUDE - "), 7)) {\r
319                         newName = _T("jude.exe");\r
320                 }\r
321                 if (newName) {\r
322                         memset(szApplicationName, 0, MAX_PATH);\r
323                         _tcscpy_s(szApplicationName, MAX_PATH, newName);\r
324                 }\r
325         }\r
326         return;\r
327 }\r
328 \r
329 void CUtils::SetApplicationName(BOOL bImeComposition)\r
330 {\r
331 //      CUtils::Log(_T("SetApplicationName: start"));\r
332 \r
333         memset(m_szApplicationName, 0, sizeof(m_szApplicationName));\r
334 \r
335         if (_tcscmp(m_szIMEName, _T("IME")) == 0) {     // IDS_IME_FILE_NAME\r
336                 HKL hKL = GetKeyboardLayout(0);\r
337                 if (ImmIsIME(hKL)) {\r
338                         if (!ImmGetIMEFileName(hKL, m_szIMEName, sizeof(m_szIMEName))) {\r
339                                 _tcsncpy_s(m_szIMEName, _T("IME"), _TRUNCATE);  // IDS_IME_FILE_NAME\r
340                         }\r
341 //                      CUtils::Log(_T("SetApplicationName: m_szIMEName == %s"), m_szIMEName);\r
342                 }\r
343         }\r
344 \r
345         if (bImeComposition) {\r
346 //              CUtils::Log(_T("SetApplicationName: bImeComposition"));\r
347 \r
348                 HKL hKL = GetKeyboardLayout(0);\r
349                 if (ImmIsIME(hKL)) {\r
350                         if (!ImmGetIMEFileName(hKL, m_szApplicationName, sizeof(m_szApplicationName))) {\r
351                                 _tcsncpy_s(m_szApplicationName, m_szIMEName, _TRUNCATE);\r
352                         }\r
353                         _tcsncpy_s(m_szIMEName, m_szApplicationName, sizeof(m_szIMEName));\r
354                 } else {\r
355                         // ImmIsIME return 0 on Word2002, Excel2002, etc. with IME2002, so...\r
356                         // _tcsncpy(m_szApplicationName, _T("imjp81.ime"), sizeof(m_szApplicationName));\r
357                         _tcsncpy_s(m_szApplicationName, m_szIMEName, _TRUNCATE);\r
358                 }\r
359         } else {\r
360 //              CUtils::Log(_T("SetApplicationName: appication (%s)"), m_szApplicationName);\r
361 \r
362                 GetModuleFileName(NULL, m_szApplicationName, sizeof(m_szApplicationName));\r
363                 CString szFn(m_szApplicationName);\r
364                 szFn.Delete(0, szFn.ReverseFind(_T('\\')) + 1);\r
365                 ZeroMemory(m_szApplicationName, sizeof(m_szApplicationName));\r
366                 _tcscpy_s(m_szApplicationName, szFn);\r
367 \r
368 //              CUtils::Log(_T("SetApplicationName: appication [%s]"), m_szApplicationName);\r
369 \r
370                 if (IsConsole()) {\r
371 //                      CUtils::Log(_T("SetApplicationName: console"));\r
372 \r
373                         memset(m_szApplicationName, 0, sizeof(m_szApplicationName));\r
374                         _tcscpy_s(m_szApplicationName, _T("CMD.exe"));\r
375                         TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
376                         GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
377                         SetCorrectApplicationName(m_szApplicationName, szWindowText);\r
378                 } else if (IsJavaW()) {\r
379                         TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
380                         GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
381                         SetCorrectApplicationName(m_szApplicationName, szWindowText);\r
382                 }\r
383                 if (!_tcsicmp(m_szApplicationName, _T("Cygwin.exe"))) {\r
384 //                      CUtils::Log(_T("SetApplicationName: cygwin"));\r
385 \r
386                         memset(m_szApplicationName, 0, sizeof(m_szApplicationName));\r
387                         _tcscpy_s(m_szApplicationName, _T("bash.exe"));\r
388                 }\r
389 //              CUtils::Log(_T("name: %s"), m_szApplicationName);\r
390         }\r
391 }\r
392 \r
393 BOOL CUtils::OpenClipboard()\r
394 {\r
395         // OpenClipboard will fail on OpenOffice.org/LibreOffice at the first time\r
396         // and we must retry multiple times.\r
397         for (int i = 0; i < 10; ++i, Sleep(1))\r
398                 if (::OpenClipboard(NULL))\r
399                         return TRUE;\r
400 //              else\r
401 //                      Log(_T("failed to open clipboard: %d (%d)"), GetLastError(), i);\r
402         return FALSE;\r
403 }\r
404 \r
405 BOOL CUtils::GetClipboardText(CString& text)\r
406 {\r
407         text.Empty();\r
408         if (!OpenClipboard())\r
409                 return FALSE;\r
410 /*\r
411         Log(_T("GetClipboardText"));\r
412         UINT uFormat = 0;\r
413         while (uFormat = EnumClipboardFormats(uFormat))\r
414                 Log(_T("uFormat = %d"), uFormat);\r
415 */\r
416         const HANDLE hClipboard = GetClipboardData(CF_TEXT);\r
417         if (!hClipboard) {\r
418                 CloseClipboard();\r
419                 return FALSE;\r
420         }\r
421         const LPVOID pMem = GlobalLock(hClipboard);\r
422         if (!pMem)\r
423                 return FALSE;\r
424         text = reinterpret_cast<LPCSTR>(pMem);\r
425         GlobalUnlock(hClipboard);\r
426         EmptyClipboard();\r
427         CloseClipboard();\r
428         return TRUE;\r
429 }\r
430 \r
431 BOOL CUtils::SetClipboardText(const CString& text)\r
432 {\r
433         if (!OpenClipboard())\r
434                 return FALSE;\r
435         const int nLength = text.GetLength() + 1;\r
436         const HGLOBAL hClipboard = GlobalAlloc(GHND, nLength);\r
437         if (!hClipboard)\r
438                 return FALSE;\r
439         const LPVOID pMem = GlobalLock(hClipboard);\r
440         memcpy(pMem, LPCTSTR(text), nLength);\r
441         GlobalUnlock(hClipboard);\r
442         EmptyClipboard();\r
443         if (SetClipboardData(CF_TEXT, hClipboard) == NULL) {\r
444                 CloseClipboard();\r
445                 return FALSE;\r
446         }\r
447         CloseClipboard();\r
448         return TRUE;\r
449 }\r
450 \r
451 BOOL CUtils::IsDefaultIgnoreApplication()\r
452 {\r
453         if (IsAstecX()\r
454          || IsBash()\r
455          || IsCsh()\r
456          || IsEmacs()\r
457          || IsLispWorksPersonalEdition()\r
458          || IsMeadow()\r
459          || IsMuleForWin32()\r
460          || IsPdksh()\r
461          || IsSh()\r
462          || IsTcsh()\r
463          || IsTeraTermPro() && !IsDialog()\r
464          || IsVisualSlickEdit() && !IsDialog()\r
465          || IsXWin()\r
466          || IsXyzzy() && !IsDialog()\r
467          || IsZsh()) {\r
468                 return TRUE;\r
469         }\r
470         return FALSE;\r
471 }\r
472 \r
473 BOOL CUtils::IsDWFM()\r
474 {\r
475         return !_tcsicmp(m_szApplicationName, _T("dwfm.exe"));\r
476 }\r
477 \r
478 BOOL CUtils::IsK2Editor()\r
479 {\r
480         return !_tcsicmp(m_szApplicationName, _T("K2Editor.exe"));\r
481 }\r
482 \r
483 BOOL CUtils::IsEggExplorer()\r
484 {\r
485         return !_tcsicmp(m_szApplicationName, _T("EggExp.exe"));\r
486 }\r
487 \r
488 BOOL CUtils::IsDirector()\r
489 {\r
490         return !_tcsicmp(m_szApplicationName, _T("Director.exe"));\r
491 }\r
492 \r
493 BOOL CUtils::IsExcel()\r
494 {\r
495         return !_tcsicmp(m_szApplicationName, _T("Excel.exe"));\r
496 }\r
497 \r
498 BOOL CUtils::IsFireworks()\r
499 {\r
500         return !_tcsicmp(m_szApplicationName, _T("Fireworks 4.exe"))\r
501                 || !_tcsicmp(m_szApplicationName, _T("Fireworks.exe"));\r
502 }\r
503 \r
504 BOOL CUtils::IsDreamweaver()\r
505 {\r
506         return !_tcsicmp(m_szApplicationName, _T("Dreamweaver.exe"));\r
507 }\r
508 \r
509 BOOL CUtils::IsFlash()\r
510 {\r
511         return !_tcsicmp(m_szApplicationName, _T("Flash.exe"));\r
512 }\r
513 \r
514 BOOL CUtils::IsPhotoshop()\r
515 {\r
516         return !_tcsicmp(m_szApplicationName, _T("Photoshp.exe"));\r
517 }\r
518 \r
519 BOOL CUtils::IsIllustrator()\r
520 {\r
521         return !_tcsicmp(m_szApplicationName, _T("Illustrator.exe"));\r
522 }\r
523 \r
524 BOOL CUtils::IsMicrosoftPowerPoint()\r
525 {\r
526         return !_tcsicmp(m_szApplicationName, _T("PowerPnt.exe"));\r
527 }\r
528 \r
529 BOOL CUtils::IsReget()\r
530 {\r
531         return !_tcsicmp(m_szApplicationName, _T("Regetdx.exe"))\r
532                 || !_tcsicmp(m_szApplicationName, _T("Regetjr.exe"));\r
533 }\r
534 \r
535 BOOL CUtils::IsPaint()\r
536 {\r
537         return !_tcsicmp(m_szApplicationName, _T("mspaint.exe"));\r
538 }\r
539 \r
540 BOOL CUtils::IsConsole()\r
541 {\r
542 //      Log(_T("_%s_"), m_szApplicationName);\r
543         return !m_szApplicationName[0]\r
544                 || !_tcsicmp(m_szApplicationName, _T("xkeymacs.exe"))\r
545                 || !_tcsicmp(m_szApplicationName, _T("conhost.exe"))\r
546                 || !_tcsicmp(m_szApplicationName, _T("conime.exe"))\r
547                 || !_tcsicmp(m_szApplicationName, _T("csh.exe"))\r
548                 || !_tcsicmp(m_szApplicationName, _T("WINOA386.MOD"))\r
549                 || !_tcsicmp(m_szApplicationName, _T("CMD.exe"))\r
550                 || !_tcsicmp(m_szApplicationName, _T("bash.exe"))\r
551                 || !_tcsicmp(m_szApplicationName, _T("ftp.exe"))\r
552                 || !_tcsicmp(m_szApplicationName, _T("sh.exe"))\r
553                 || !_tcsicmp(m_szApplicationName, _T("telnet.exe"));\r
554 }\r
555 \r
556 BOOL CUtils::IsConsole(LPCTSTR szApplicationName)\r
557 {\r
558         return !_tcsicmp(szApplicationName, _T("WINOA386.MOD"))\r
559                 || !_tcsicmp(szApplicationName, _T("CMD.exe"));\r
560 }\r
561 \r
562 BOOL CUtils::IsJavaW(LPCTSTR szApplicationName)\r
563 {\r
564         return !_tcsicmp(szApplicationName, _T("javaw.exe"));\r
565 }\r
566 \r
567 BOOL CUtils::IsSleipnir()\r
568 {\r
569         return !_tcsicmp(m_szApplicationName, _T("Sleipnir.exe"));\r
570 }\r
571 \r
572 BOOL CUtils::IsBash()\r
573 {\r
574         return !_tcsicmp(m_szApplicationName, _T("bash.exe"));\r
575 }\r
576 \r
577 static void invalid_parameter_handler(const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, uintptr_t)\r
578 {\r
579         return;\r
580 }\r
581 \r
582 // for debug\r
583 void CUtils::Log(LPCTSTR fmt, ...)\r
584 {\r
585         va_list ap;\r
586         va_start(ap, fmt);\r
587         TCHAR log[1024];\r
588         _set_invalid_parameter_handler(invalid_parameter_handler);\r
589         if (_vstprintf_s(log, fmt, ap) < 0)\r
590                 _tcscpy_s(log, _T("invalid format"));\r
591 \r
592         static int n = 0;\r
593         TCHAR path[MAX_PATH];\r
594         if (GetTempPath(MAX_PATH, path)) {\r
595 #ifndef _WIN64\r
596                 _tmakepath_s(path, NULL, path, _T("xkeylog"), _T("txt"));\r
597 #else\r
598                 _tmakepath_s(path, NULL, path, _T("xkeylog64"), _T("txt"));\r
599 #endif\r
600         } else\r
601                 _tcscpy_s(path, _T("c:\\xkeylog.txt"));\r
602         FILE *fp;\r
603         _tfopen_s(&fp, path, _T("a"));\r
604         _ftprintf(fp, _T("%8d: %s\t%s\n"), n++, m_szApplicationName, log);\r
605         fclose(fp);\r
606 }\r
607 \r
608 BOOL CUtils::IsSh()\r
609 {\r
610         return !_tcsicmp(m_szApplicationName, _T("sh.exe"));\r
611 }\r
612 \r
613 BOOL CUtils::IsCsh()\r
614 {\r
615         return !_tcsicmp(m_szApplicationName, _T("csh.exe"));\r
616 }\r
617 \r
618 BOOL CUtils::IsVisualStudio()\r
619 {\r
620         if (IsVisualCpp() || CUtils::IsVisualBasic())\r
621                 return FALSE;\r
622         TCHAR szWindowText[WINDOW_TEXT_LENGTH] = _T("");\r
623         GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
624         return _tcsstr(szWindowText, _T(" - Microsoft Visual ")) != NULL;\r
625 }\r
626 \r
627 BOOL CUtils::IsAccess()\r
628 {\r
629         return !_tcsicmp(m_szApplicationName, _T("MSACCESS.EXE"));\r
630 }\r
631 \r
632 BOOL CUtils::IsProject()\r
633 {\r
634         return !_tcsicmp(m_szApplicationName, _T("WINPROJ.EXE"));\r
635 }\r
636 \r
637 BOOL CUtils::IsVisualBasic()\r
638 {\r
639         return !_tcsicmp(m_szApplicationName, _T("VB6.EXE"));\r
640 }\r
641 \r
642 BOOL CUtils::IsVisualBasicEditor()\r
643 {\r
644         if (IsVisualBasic()) {\r
645                 return TRUE;\r
646         }\r
647 \r
648         if (IsAccess()\r
649          || IsExcel()\r
650          || IsMicrosoftFrontPage()\r
651          || IsMicrosoftPowerPoint()\r
652          || IsMicrosoftWord()\r
653          || IsOutlook()\r
654          || IsProject()) {\r
655                 TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
656                 GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
657                 static LPCTSTR const szVBE = _T("Microsoft Visual Basic - ");\r
658                 if (!_tcsnicmp(szWindowText, szVBE, _tcslen(szVBE))) {\r
659                         return TRUE;\r
660                 }\r
661         }\r
662         return FALSE;\r
663 }\r
664 \r
665 BOOL CUtils::IsEclipse()\r
666 {\r
667         if (!_tcsicmp(m_szApplicationName, _T("eclipse.exe")))\r
668                 return TRUE;\r
669 \r
670         TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
671         GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
672 \r
673         LPCTSTR szEclipse = _T(" - Eclipse Platform");\r
674         LPCTSTR szFind = _T("Find/Replace");\r
675 \r
676         return IsJavaW()\r
677                 && (_tcslen(szEclipse) < _tcslen(szWindowText) && !_tcsicmp(szWindowText + _tcslen(szWindowText) - _tcslen(szEclipse), szEclipse)\r
678                  || _tcslen(szFind) == _tcslen(szWindowText) && !_tcsicmp(szWindowText, szFind));\r
679 }\r
680 \r
681 BOOL CUtils::IsDialog()\r
682 {\r
683         HWND hwnd = GetForegroundWindow();\r
684         TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
685         if (!GetWindowText(hwnd, szWindowText, sizeof(szWindowText)))\r
686                 return FALSE; // inside sound box\r
687         return GetParent(GetForegroundWindow()) != NULL;\r
688 }\r
689 \r
690 BOOL CUtils::IsEudora()\r
691 {\r
692         return !_tcsicmp(m_szApplicationName, _T("Eudora.exe"));\r
693 }\r
694 \r
695 BOOL CUtils::IsCodeWarrior()\r
696 {\r
697         return !_tcsicmp(m_szApplicationName, _T("IDE.exe"));\r
698 }\r
699 \r
700 BOOL CUtils::IseMemoPad()\r
701 {\r
702         return !_tcsicmp(m_szApplicationName, _T("eMemoPad.exe"));\r
703 }\r
704 \r
705 BOOL CUtils::IsStoryEditor()\r
706 {\r
707         return !_tcsicmp(m_szApplicationName, _T("STRYEDIT.EXE"));\r
708 }\r
709 \r
710 BOOL CUtils::IsNami2000()\r
711 {\r
712         return !_tcsicmp(m_szApplicationName, _T("Nami2000.exe"));\r
713 }\r
714 \r
715 BOOL CUtils::IsCorelDRAW()\r
716 {\r
717         return !_tcsicmp(m_szApplicationName, _T("CorelDrw.exe"));\r
718 }\r
719 \r
720 // If Clipboard data is empty, return true.\r
721 // You must CopyNextCharacter in previous step.\r
722 // Clipboard data is destroyed.\r
723 BOOL CUtils::IsEOF()\r
724 {\r
725         return IsTOForEOF();\r
726 }\r
727 \r
728 // If Clipboard data is empty, return ture.\r
729 // You must CopyBackCharacter in previous step.\r
730 // Clipboard data is destroyed.\r
731 BOOL CUtils::IsTOF()\r
732 {\r
733         return IsTOForEOF();\r
734 }\r
735 \r
736 BOOL CUtils::IsTOForEOF()\r
737 {\r
738         CString text;\r
739         GetClipboardText(text);\r
740         return text.IsEmpty() || // for normal application\r
741                         text.GetLength() >= 3; // for VC++\r
742 }\r
743 \r
744 BOOL CUtils::IsHusen()\r
745 {\r
746         return !_tcsicmp(m_szApplicationName, _T("husen.exe"));\r
747 }\r
748 \r
749 BOOL CUtils::IsAdobeReader()\r
750 {\r
751         return !_tcsicmp(m_szApplicationName, _T("AcroRd32.exe"));\r
752 }\r
753 \r
754 BOOL CUtils::IsOpenOffice()\r
755 {\r
756         return !_tcsicmp(m_szApplicationName, _T("soffice.exe"))\r
757                 || !_tcsicmp(m_szApplicationName, _T("soffice.bin"));\r
758 }\r
759 \r
760 BOOL CUtils::IsTuruKameMail()\r
761 {\r
762         return !_tcsicmp(m_szApplicationName, _T("TuruKame.exe"));\r
763 }\r
764 \r
765 BOOL CUtils::IsOedit()\r
766 {\r
767         return !_tcsicmp(m_szApplicationName, _T("oedit.exe"));\r
768 }\r
769 \r
770 BOOL CUtils::IsAutla()\r
771 {\r
772         return !_tcsicmp(m_szApplicationName, _T("Autla.exe"));\r
773 }\r
774 \r
775 BOOL CUtils::IsShuriken()\r
776 {\r
777         return !_tcsicmp(m_szApplicationName, _T("JsvMail.exe"));\r
778 }\r
779 \r
780 BOOL CUtils::IsEdLeaf()\r
781 {\r
782         return !_tcsicmp(m_szApplicationName, _T("edleaf.exe"));\r
783 }\r
784 \r
785 BOOL CUtils::IsJmEditor()\r
786 {\r
787         return !_tcsicmp(m_szApplicationName, _T("JmEdit.exe"))\r
788                 || !_tcsicmp(m_szApplicationName, _T("JmEdit2.exe"));\r
789 }\r
790 \r
791 BOOL CUtils::IsDana()\r
792 {\r
793         return !_tcsicmp(m_szApplicationName, _T("Dana.exe"));\r
794 }\r
795 \r
796 BOOL CUtils::IsIPMessenger()\r
797 {\r
798         return !_tcsicmp(m_szApplicationName, _T("ipmsg.exe"));\r
799 }\r
800 \r
801 BOOL CUtils::IsezHTML()\r
802 {\r
803         return !_tcsicmp(m_szApplicationName, _T("ezhtml.exe"));\r
804 }\r
805 \r
806 BOOL CUtils::IsTcsh()\r
807 {\r
808         return !_tcsicmp(m_szApplicationName, _T("tcsh.exe"));\r
809 }\r
810 \r
811 BOOL CUtils::IsZsh()\r
812 {\r
813         return !_tcsicmp(m_szApplicationName, _T("zsh.exe"));\r
814 }\r
815 \r
816 BOOL CUtils::IsPdksh()\r
817 {\r
818         return !_tcsicmp(m_szApplicationName, _T("pdksh.exe"));\r
819 }\r
820 \r
821 BOOL CUtils::IsFirefox()\r
822 {\r
823         return !_tcsicmp(m_szApplicationName, _T("firefox.exe"));\r
824 }\r
825 \r
826 BOOL CUtils::IsPHPEditor()\r
827 {\r
828         return !_tcsicmp(m_szApplicationName, _T("php_editor.exe"));\r
829 }\r
830 \r
831 BOOL CUtils::IsTeraPad()\r
832 {\r
833         return !_tcsicmp(m_szApplicationName, _T("TeraPad.exe"));\r
834 }\r
835 \r
836 BOOL CUtils::IsLispWorksPersonalEdition()\r
837 {\r
838         CString szLispWorks(_T("lispworks-personal-"));\r
839         return !_tcsnicmp(m_szApplicationName, szLispWorks, szLispWorks.GetLength());\r
840 \r
841 //      return !_tcsicmp(m_szApplicationName, _T("lispworks-personal-4300.exe"));\r
842 }\r
843 \r
844 BOOL CUtils::IsBorlandCppBuilder()\r
845 {\r
846         return !_tcsicmp(m_szApplicationName, _T("bcb.exe"));\r
847 }\r
848 \r
849 BOOL CUtils::Run(CString szCommandLine, BOOL isWait)\r
850 {\r
851         STARTUPINFO si;\r
852         ZeroMemory(&si, sizeof(si));\r
853         si.cb = sizeof(si);\r
854 \r
855         PROCESS_INFORMATION pi;\r
856         ZeroMemory(&pi, sizeof(pi));\r
857 \r
858         BOOL rc = CreateProcess(NULL, szCommandLine.GetBuffer(szCommandLine.GetLength() + 1), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);\r
859         if (rc) {\r
860                 if (isWait) {\r
861                         WaitForSingleObject( pi.hProcess, INFINITE );\r
862                 }\r
863 \r
864                 CloseHandle(pi.hThread);\r
865                 CloseHandle(pi.hProcess);\r
866         }\r
867 \r
868         return rc;\r
869 }\r
870 \r
871 BOOL CUtils::IsJavaW()\r
872 {\r
873         return !_tcsicmp(m_szApplicationName, _T("javaw.exe"));\r
874 }\r
875 \r
876 BOOL CUtils::IsMSDN()\r
877 {\r
878         return !_tcsicmp(m_szApplicationName, _T("hh.exe"));\r
879 }\r
880 \r
881 BOOL CUtils::IsVisualSlickEdit()\r
882 {\r
883         return !_tcsicmp(m_szApplicationName, _T("vs.exe"));\r
884 }\r
885 \r
886 BOOL CUtils::IsOpenJane()\r
887 {\r
888         return !_tcsicmp(m_szApplicationName, _T("Jane2ch.exe"));\r
889 }\r
890 \r
891 BOOL CUtils::IsThunderbird()\r
892 {\r
893         return !_tcsicmp(m_szApplicationName, _T("thunderbird.exe"));\r
894 }\r
895 \r
896 int CUtils::GetWindowTextType(CString strWindowText)\r
897 {\r
898         int nWindowTextType = IDS_WINDOW_TEXT_IGNORE;\r
899 \r
900         if (3 <= strWindowText.GetLength()\r
901          && strWindowText.Find(_T('*')) == 0\r
902          && strWindowText.ReverseFind(_T('*')) == strWindowText.GetLength() - 1) {\r
903                 nWindowTextType = IDS_WINDOW_TEXT_MATCH;\r
904         } else if (2 <= strWindowText.GetLength()\r
905                         && strWindowText.Find(_T('*')) != 0\r
906                         && strWindowText.ReverseFind(_T('*')) == strWindowText.GetLength() - 1) {\r
907                 nWindowTextType = IDS_WINDOW_TEXT_MATCH_FORWARD;\r
908         } else if (2 <= strWindowText.GetLength()\r
909                         && strWindowText.Find(_T('*')) == 0\r
910                         && strWindowText.ReverseFind(_T('*')) != strWindowText.GetLength() - 1) {\r
911                 nWindowTextType = IDS_WINDOW_TEXT_MATCH_BACKWARD;\r
912         } else if (!strWindowText.IsEmpty()\r
913                         && strWindowText.Find(_T('*')) != 0\r
914                         && strWindowText.ReverseFind(_T('*')) != strWindowText.GetLength() - 1) {\r
915                 nWindowTextType = IDS_WINDOW_TEXT_MATCH_FULL;\r
916         }\r
917 \r
918         return nWindowTextType;\r
919 }\r
920 \r
921 BOOL CUtils::IsLunascape()\r
922 {\r
923         return !_tcsicmp(m_szApplicationName, _T("Luna.exe"));\r
924 }\r
925 \r
926 BOOL CUtils::IsAtok()\r
927 {\r
928         return !_tcsnicmp(m_szApplicationName, _T("ATOK"), 4) && !_tcsnicmp(m_szApplicationName + _tcslen(m_szApplicationName) - 4, _T(".IME"), 4);\r
929 }\r