OSDN Git Service

Use the reg command to import/export properties
[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 \r
10 bool CUtils::IsConsole()\r
11 {\r
12         return AppName::IsConsole();\r
13 }\r
14 \r
15 int CUtils::GetWindowTextType(const CString& text)\r
16 {\r
17         int len = text.GetAllocLength();\r
18         if (len >= 3 && text[0] == _T('*') && text[len - 1] == _T('*'))\r
19                 return IDS_WINDOW_TEXT_MATCH;\r
20         else if (len >= 2 && text[0] != _T('*') && text[len - 1] == _T('*'))\r
21                 return IDS_WINDOW_TEXT_MATCH_FORWARD;\r
22         else if (len >= 2 && text[0] == _T('*') && text[len - 1] != _T('*'))\r
23                 return IDS_WINDOW_TEXT_MATCH_BACKWARD;\r
24         else if (len > 0 && text[0] != _T('*') && text[len - 1] != _T('*'))\r
25                 return IDS_WINDOW_TEXT_MATCH_FULL;\r
26         return IDS_WINDOW_TEXT_IGNORE;\r
27 }\r
28 \r
29 bool CUtils::IsMatchWindowText(const CString& text)\r
30 {\r
31         int len = text.GetLength();\r
32         TCHAR buf[WINDOW_TEXT_LENGTH];\r
33         GetWindowText(GetForegroundWindow(), buf, sizeof(buf));\r
34         CString current(buf);\r
35         switch (GetWindowTextType(text)) {\r
36         case IDS_WINDOW_TEXT_MATCH:                                                             // *foo*\r
37                 return current.Find(text.Mid(1, len - 2)) >= 0;\r
38         case IDS_WINDOW_TEXT_MATCH_FORWARD:                                             // foo*\r
39                 return current.Left(len - 1) == text.Left(len - 1);\r
40         case IDS_WINDOW_TEXT_MATCH_BACKWARD:                                    // *foo\r
41                 return current.Right(len - 1) == text.Right(len - 1);\r
42         case IDS_WINDOW_TEXT_MATCH_FULL:                                                // foo\r
43                 return current == text;\r
44         }\r
45         return true;\r
46 }\r
47 \r
48 BOOL CUtils::GetFindDialogTitle(CString *szDialogTitle)\r
49 {\r
50         {\r
51                 TCHAR buf[WINDOW_TEXT_LENGTH] = {'\0'};\r
52                 GetWindowText(GetForegroundWindow(), buf, sizeof(buf));\r
53 //              CUtils::Log(_T("Window Text --%s--"), buf);\r
54                 szDialogTitle->Format(_T("%s"), buf);\r
55         }\r
56 \r
57         if (!szDialogTitle->Compare(_T("\8c\9f\8dõ"))                                 // notepad, wordpad, IE, regedit, \r
58                                                                                                                 // Excel, Front Page, PowerPoint, Acrobat Reader, IBM HPB\r
59          || !szDialogTitle->Compare(_T("Find"))                                 // notepad, Outlook, Outlook Express, Opera\r
60          || !szDialogTitle->Compare(_T("Find in this Page"))    // Mozilla\r
61          || !szDialogTitle->Compare(_T("Find/Replace"))                 // Eclipse\r
62          || !szDialogTitle->Compare(_T("\96{\95\93à\8c\9f\8dõ"))                   // Becky!\r
63          || !szDialogTitle->Compare(_T("\83\81\81[\83\8b\8c\9f\8dõ"))                   // Becky!\r
64          || !szDialogTitle->Compare(_T("\95\8e\9a\97ñ\82Ì\8c\9f\8dõ"))                 // M$ VC++\r
65          || !szDialogTitle->Compare(_T("\8c\9f\8dõ\82Æ\92u\8a·"))                   // M$ Word, 123\r
66          || !szDialogTitle->Compare(_T("\95\8f\91\82Ì\83e\83L\83X\83g\82Ì\8c\9f\8dõ")) // Lotus Notes\r
67          || !szDialogTitle->Compare(_T("\82±\82Ì\83y\81[\83W\82ð\8c\9f\8dõ"))             // Netscape 6\r
68          || !szDialogTitle->Compare(_T("\95\8e\9a\97ñ\8c\9f\8dõ"))                   // Dana\r
69          || !szDialogTitle->Compare(_T("\8c\9f\8dõ/\92u\8a·"))                    // PHP Editor\r
70          || !szDialogTitle->Compare(_T("\92u\8a·"))\r
71          || !szDialogTitle->Compare(_T("Replace"))) {\r
72                 return TRUE;\r
73         }\r
74 \r
75         szDialogTitle->Empty();\r
76         return FALSE;\r
77 }\r
78 \r
79 BOOL CUtils::IsFindDialog()\r
80 {\r
81         CString szDialogTitle;\r
82         return GetFindDialogTitle(&szDialogTitle);\r
83 }\r
84 \r
85 BOOL CUtils::IsXkeymacs()\r
86 {\r
87         LPCTSTR names[] = {\r
88                 _T("xkeymacs.exe"),\r
89                 _T("xkeymacs64.exe"),\r
90         };\r
91         return AppName::Match(names);\r
92 }\r
93 \r
94 BOOL CUtils::IsChrome()\r
95 {\r
96         return AppName::Match(_T("chrome.exe"));\r
97 }\r
98 \r
99 BOOL CUtils::IsAstecX()\r
100 {\r
101         return AppName::Match(_T("astecx.exe"));\r
102 }\r
103 \r
104 BOOL CUtils::IsBecky()\r
105 {\r
106         return AppName::Match(_T("b2.exe"));\r
107 }\r
108 \r
109 BOOL CUtils::IsEmacs()\r
110 {\r
111         return AppName::Match(_T("Emacs.exe"));\r
112 }\r
113 \r
114 BOOL CUtils::IsExplorer()\r
115 {\r
116         return AppName::Match(_T("explorer.exe"));\r
117 }\r
118 \r
119 BOOL CUtils::IsHidemaru()\r
120 {\r
121         return AppName::Match(_T("hidemaru.exe"));\r
122 }\r
123 \r
124 BOOL CUtils::IsInternetExplorer()\r
125 {\r
126         return AppName::Match(_T("iexplore.exe"));\r
127 }\r
128 \r
129 BOOL CUtils::IsLotus123()\r
130 {\r
131         return AppName::Match(_T("123w.exe"));\r
132 }\r
133 \r
134 BOOL CUtils::IsLotusNotes()\r
135 {\r
136         return AppName::Match(_T("nlnotes.exe"));\r
137 }\r
138 \r
139 BOOL CUtils::IsLotusWordPro()\r
140 {\r
141         return AppName::Match(_T("wordpro.exe"));\r
142 }\r
143 \r
144 BOOL CUtils::IsMeadow()\r
145 {\r
146         LPCTSTR names[] = {\r
147                 _T("Meadow.exe"),\r
148                 _T("Meadow95.exe"),\r
149                 _T("MeadowNT.exe"),\r
150         };\r
151         return AppName::Match(names);\r
152 }\r
153 \r
154 BOOL CUtils::IsMicrosoftFrontPage()\r
155 {\r
156         return AppName::Match(_T("frontpg.exe"));\r
157 }\r
158 \r
159 BOOL CUtils::IsMicrosoftWord()\r
160 {\r
161         return AppName::Match(_T("winword.exe"));\r
162 }\r
163 \r
164 BOOL CUtils::IsMozilla()\r
165 {\r
166         LPCTSTR names[] = {\r
167                 _T("mozilla.exe"),\r
168                 _T("firefox.exe"),\r
169         };\r
170         return AppName::Match(names);\r
171 }\r
172 \r
173 BOOL CUtils::IsMuleForWin32()\r
174 {\r
175         LPCTSTR names[] = {\r
176                 _T("mule.exe"),\r
177                 _T("mulent.exe"),\r
178                 _T("mulecd.exe"),\r
179         };\r
180         return AppName::Match(names);\r
181 }\r
182 \r
183 BOOL CUtils::IsNetscape()\r
184 {\r
185         LPCTSTR names[] = {\r
186                 _T("netscp6.exe"),\r
187                 _T("netscp.exe"),\r
188         };\r
189         return AppName::Match(names);\r
190 }\r
191 \r
192 BOOL CUtils::IsNotepad()\r
193 {\r
194         return AppName::Match(_T("notepad.exe"));\r
195 }\r
196 \r
197 BOOL CUtils::IsNotepadPP()\r
198 {\r
199         return AppName::Match(_T("notepad++.exe"));\r
200 }\r
201 \r
202 BOOL CUtils::IsOpera()\r
203 {\r
204         return AppName::Match(_T("opera.exe"));\r
205 }\r
206 \r
207 BOOL CUtils::IsOutlook()\r
208 {\r
209         return AppName::Match(_T("outlook.exe"));\r
210 }\r
211 \r
212 BOOL CUtils::IsOutlookExpress()\r
213 {\r
214         return AppName::Match(_T("msimn.exe"));\r
215 }\r
216 \r
217 BOOL CUtils::IsSakuraEditor()\r
218 {\r
219         return AppName::Match(_T("sakura.exe"));\r
220 }\r
221 \r
222 BOOL CUtils::IsTeraTermPro()\r
223 {\r
224         return AppName::Match(_T("ttermpro.exe"));\r
225 }\r
226 \r
227 BOOL CUtils::IsVisualCpp()\r
228 {\r
229         return AppName::Match(_T("msdev.exe"));\r
230 }\r
231 \r
232 BOOL CUtils::IsWordpad()\r
233 {\r
234         return AppName::Match(_T("wordpad.exe"));\r
235 }\r
236 \r
237 BOOL CUtils::IsXWin()\r
238 {\r
239         return AppName::Match(_T("XWin.exe"));\r
240 }\r
241 \r
242 BOOL CUtils::IsXyzzy()\r
243 {\r
244         return AppName::Match(_T("xyzzy.exe"));\r
245 }\r
246 \r
247 BOOL CUtils::OpenClipboard()\r
248 {\r
249         // OpenClipboard will fail on OpenOffice.org/LibreOffice at the first time\r
250         // and we must retry multiple times.\r
251         for (int i = 0; i < 10; ++i, Sleep(1))\r
252                 if (::OpenClipboard(NULL))\r
253                         return TRUE;\r
254 //              else\r
255 //                      Log(_T("failed to open clipboard: %d (%d)"), GetLastError(), i);\r
256         return FALSE;\r
257 }\r
258 \r
259 BOOL CUtils::GetClipboardText(CString& text)\r
260 {\r
261         text.Empty();\r
262         if (!OpenClipboard())\r
263                 return FALSE;\r
264 /*\r
265         Log(_T("GetClipboardText"));\r
266         UINT uFormat = 0;\r
267         while (uFormat = EnumClipboardFormats(uFormat))\r
268                 Log(_T("uFormat = %d"), uFormat);\r
269 */\r
270         const HANDLE hClipboard = GetClipboardData(CF_TEXT);\r
271         if (!hClipboard) {\r
272                 CloseClipboard();\r
273                 return FALSE;\r
274         }\r
275         const LPVOID pMem = GlobalLock(hClipboard);\r
276         if (!pMem)\r
277                 return FALSE;\r
278         text = reinterpret_cast<LPCTSTR>(pMem);\r
279         GlobalUnlock(hClipboard);\r
280         EmptyClipboard();\r
281         CloseClipboard();\r
282         return TRUE;\r
283 }\r
284 \r
285 BOOL CUtils::SetClipboardText(const CString& text)\r
286 {\r
287         if (!OpenClipboard())\r
288                 return FALSE;\r
289         const int nLength = text.GetLength() + 1;\r
290         const HGLOBAL hClipboard = GlobalAlloc(GHND, nLength);\r
291         if (!hClipboard)\r
292                 return FALSE;\r
293         const LPVOID pMem = GlobalLock(hClipboard);\r
294         memcpy(pMem, LPCTSTR(text), nLength);\r
295         GlobalUnlock(hClipboard);\r
296         EmptyClipboard();\r
297         if (SetClipboardData(CF_TEXT, hClipboard) == NULL) {\r
298                 CloseClipboard();\r
299                 return FALSE;\r
300         }\r
301         CloseClipboard();\r
302         return TRUE;\r
303 }\r
304 \r
305 BOOL CUtils::IsDefaultIgnoreApplication()\r
306 {\r
307         if (IsAstecX()\r
308          || IsBash()\r
309          || IsCsh()\r
310          || IsEmacs()\r
311          || IsLispWorksPersonalEdition()\r
312          || IsMeadow()\r
313          || IsMuleForWin32()\r
314          || IsPdksh()\r
315          || IsSh()\r
316          || IsTcsh()\r
317          || IsTeraTermPro() && !IsDialog()\r
318          || IsVisualSlickEdit() && !IsDialog()\r
319          || IsXWin()\r
320          || IsXyzzy() && !IsDialog()\r
321          || IsZsh()) {\r
322                 return TRUE;\r
323         }\r
324         return FALSE;\r
325 }\r
326 \r
327 BOOL CUtils::IsDWFM()\r
328 {\r
329         return AppName::Match(_T("dwfm.exe"));\r
330 }\r
331 \r
332 BOOL CUtils::IsK2Editor()\r
333 {\r
334         return AppName::Match(_T("K2Editor.exe"));\r
335 }\r
336 \r
337 BOOL CUtils::IsEggExplorer()\r
338 {\r
339         return AppName::Match(_T("EggExp.exe"));\r
340 }\r
341 \r
342 BOOL CUtils::IsDirector()\r
343 {\r
344         return AppName::Match(_T("Director.exe"));\r
345 }\r
346 \r
347 BOOL CUtils::IsExcel()\r
348 {\r
349         return AppName::Match(_T("Excel.exe"));\r
350 }\r
351 \r
352 BOOL CUtils::IsFireworks()\r
353 {\r
354         LPCTSTR names[] = {\r
355                 _T("Fireworks 4.exe"),\r
356                 _T("Fireworks.exe"),\r
357         };\r
358         return AppName::Match(names);\r
359 }\r
360 \r
361 BOOL CUtils::IsDreamweaver()\r
362 {\r
363         return AppName::Match(_T("Dreamweaver.exe"));\r
364 }\r
365 \r
366 BOOL CUtils::IsFlash()\r
367 {\r
368         return AppName::Match(_T("Flash.exe"));\r
369 }\r
370 \r
371 BOOL CUtils::IsPhotoshop()\r
372 {\r
373         return AppName::Match(_T("Photoshp.exe"));\r
374 }\r
375 \r
376 BOOL CUtils::IsIllustrator()\r
377 {\r
378         return AppName::Match(_T("Illustrator.exe"));\r
379 }\r
380 \r
381 BOOL CUtils::IsMicrosoftPowerPoint()\r
382 {\r
383         return AppName::Match(_T("PowerPnt.exe"));\r
384 }\r
385 \r
386 BOOL CUtils::IsReget()\r
387 {\r
388         LPCTSTR names[] = {\r
389                 _T("Regetdx.exe"),\r
390                 _T("Regetjr.exe"),\r
391         };\r
392         return AppName::Match(names);\r
393 }\r
394 \r
395 BOOL CUtils::IsPaint()\r
396 {\r
397         return AppName::Match(_T("mspaint.exe"));\r
398 }\r
399 \r
400 BOOL CUtils::IsSleipnir()\r
401 {\r
402         return AppName::Match(_T("Sleipnir.exe"));\r
403 }\r
404 \r
405 BOOL CUtils::IsBash()\r
406 {\r
407         return AppName::Match(_T("bash.exe"));\r
408 }\r
409 \r
410 static void invalid_parameter_handler(const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, uintptr_t)\r
411 {\r
412         return;\r
413 }\r
414 \r
415 // for debug\r
416 void CUtils::Log(LPCTSTR fmt, ...)\r
417 {\r
418         va_list ap;\r
419         va_start(ap, fmt);\r
420         TCHAR log[1024], msg[1024];\r
421         static int n = 0;\r
422         _set_invalid_parameter_handler(invalid_parameter_handler);\r
423         if (_vstprintf_s(msg, fmt, ap) < 0)\r
424                 _tcscpy_s(msg, _T("invalid format"));\r
425         va_end(ap);\r
426         _stprintf_s(log, _T("%4d %8x: %s\t%s\r\n"), n++, GetCurrentThreadId(), AppName::GetAppName(), msg);\r
427         TCHAR path[MAX_PATH];\r
428         if (GetTempPath(MAX_PATH, path)) {\r
429 #ifndef _WIN64\r
430                 _tmakepath_s(path, nullptr, path, _T("xkeylog"), _T("txt"));\r
431 #else\r
432                 _tmakepath_s(path, nullptr, path, _T("xkeylog64"), _T("txt"));\r
433 #endif\r
434         } else\r
435                 _tcscpy_s(path, _T("c:\\xkeylog.txt"));\r
436         HANDLE fh = CreateFile(path, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\r
437         if (fh == INVALID_HANDLE_VALUE)\r
438                 return;\r
439         SetFilePointer(fh, 0, nullptr, FILE_END);\r
440         DWORD written;\r
441         WriteFile(fh, log, static_cast<DWORD>(strlen(log)), &written, nullptr);\r
442         CloseHandle(fh);\r
443 }\r
444 \r
445 BOOL CUtils::IsSh()\r
446 {\r
447         return AppName::Match(_T("sh.exe"));\r
448 }\r
449 \r
450 BOOL CUtils::IsCsh()\r
451 {\r
452         return AppName::Match(_T("csh.exe"));\r
453 }\r
454 \r
455 BOOL CUtils::IsVisualStudio()\r
456 {\r
457         if (IsVisualCpp() || CUtils::IsVisualBasic())\r
458                 return FALSE;\r
459         TCHAR szWindowText[WINDOW_TEXT_LENGTH] = _T("");\r
460         GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
461         return _tcsstr(szWindowText, _T(" - Microsoft Visual ")) != NULL;\r
462 }\r
463 \r
464 BOOL CUtils::IsAccess()\r
465 {\r
466         return AppName::Match(_T("MSACCESS.EXE"));\r
467 }\r
468 \r
469 BOOL CUtils::IsProject()\r
470 {\r
471         return AppName::Match(_T("WINPROJ.EXE"));\r
472 }\r
473 \r
474 BOOL CUtils::IsVisualBasic()\r
475 {\r
476         return AppName::Match(_T("VB6.EXE"));\r
477 }\r
478 \r
479 BOOL CUtils::IsVisualBasicEditor()\r
480 {\r
481         if (IsVisualBasic()) {\r
482                 return TRUE;\r
483         }\r
484 \r
485         if (IsAccess()\r
486          || IsExcel()\r
487          || IsMicrosoftFrontPage()\r
488          || IsMicrosoftPowerPoint()\r
489          || IsMicrosoftWord()\r
490          || IsOutlook()\r
491          || IsProject()) {\r
492                 TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
493                 GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
494                 static LPCTSTR const szVBE = _T("Microsoft Visual Basic - ");\r
495                 if (!_tcsnicmp(szWindowText, szVBE, _tcslen(szVBE))) {\r
496                         return TRUE;\r
497                 }\r
498         }\r
499         return FALSE;\r
500 }\r
501 \r
502 BOOL CUtils::IsEclipse()\r
503 {\r
504         return AppName::Match(_T("eclipse.exe"));\r
505 }\r
506 \r
507 BOOL CUtils::IsDialog()\r
508 {\r
509         HWND hwnd = GetForegroundWindow();\r
510         TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
511         if (!GetWindowText(hwnd, szWindowText, sizeof(szWindowText)))\r
512                 return FALSE; // inside sound box\r
513         return GetParent(GetForegroundWindow()) != NULL;\r
514 }\r
515 \r
516 BOOL CUtils::IsEudora()\r
517 {\r
518         return AppName::Match(_T("Eudora.exe"));\r
519 }\r
520 \r
521 BOOL CUtils::IsCodeWarrior()\r
522 {\r
523         return AppName::Match(_T("IDE.exe"));\r
524 }\r
525 \r
526 BOOL CUtils::IseMemoPad()\r
527 {\r
528         return AppName::Match(_T("eMemoPad.exe"));\r
529 }\r
530 \r
531 BOOL CUtils::IsStoryEditor()\r
532 {\r
533         return AppName::Match(_T("STRYEDIT.EXE"));\r
534 }\r
535 \r
536 BOOL CUtils::IsNami2000()\r
537 {\r
538         return AppName::Match(_T("Nami2000.exe"));\r
539 }\r
540 \r
541 BOOL CUtils::IsCorelDRAW()\r
542 {\r
543         return AppName::Match(_T("CorelDrw.exe"));\r
544 }\r
545 \r
546 // If Clipboard data is empty, return true.\r
547 // You must CopyNextCharacter in previous step.\r
548 // Clipboard data is destroyed.\r
549 BOOL CUtils::IsEOF()\r
550 {\r
551         return IsTOForEOF();\r
552 }\r
553 \r
554 // If Clipboard data is empty, return ture.\r
555 // You must CopyBackCharacter in previous step.\r
556 // Clipboard data is destroyed.\r
557 BOOL CUtils::IsTOF()\r
558 {\r
559         return IsTOForEOF();\r
560 }\r
561 \r
562 BOOL CUtils::IsTOForEOF()\r
563 {\r
564         CString text;\r
565         GetClipboardText(text);\r
566         return text.IsEmpty() || // for normal application\r
567                         text.GetLength() >= 3; // for VC++\r
568 }\r
569 \r
570 BOOL CUtils::IsHusen()\r
571 {\r
572         return AppName::Match(_T("husen.exe"));\r
573 }\r
574 \r
575 BOOL CUtils::IsAdobeReader()\r
576 {\r
577         return AppName::Match(_T("AcroRd32.exe"));\r
578 }\r
579 \r
580 BOOL CUtils::IsOpenOffice()\r
581 {\r
582         LPCTSTR names[] = {\r
583                 _T("soffice.exe"),\r
584                 _T("soffice.bin"),\r
585         };\r
586         return AppName::Match(names);\r
587 }\r
588 \r
589 BOOL CUtils::IsTuruKameMail()\r
590 {\r
591         return AppName::Match(_T("TuruKame.exe"));\r
592 }\r
593 \r
594 BOOL CUtils::IsOedit()\r
595 {\r
596         return AppName::Match(_T("oedit.exe"));\r
597 }\r
598 \r
599 BOOL CUtils::IsAutla()\r
600 {\r
601         return AppName::Match(_T("Autla.exe"));\r
602 }\r
603 \r
604 BOOL CUtils::IsShuriken()\r
605 {\r
606         return AppName::Match(_T("JsvMail.exe"));\r
607 }\r
608 \r
609 BOOL CUtils::IsEdLeaf()\r
610 {\r
611         return AppName::Match(_T("edleaf.exe"));\r
612 }\r
613 \r
614 BOOL CUtils::IsJmEditor()\r
615 {\r
616         LPCTSTR names[] = {\r
617                 _T("JmEdit.exe"),\r
618                 _T("JmEdit2.exe"),\r
619         };\r
620         return AppName::Match(names);\r
621 }\r
622 \r
623 BOOL CUtils::IsDana()\r
624 {\r
625         return AppName::Match(_T("Dana.exe"));\r
626 }\r
627 \r
628 BOOL CUtils::IsIPMessenger()\r
629 {\r
630         return AppName::Match(_T("ipmsg.exe"));\r
631 }\r
632 \r
633 BOOL CUtils::IsezHTML()\r
634 {\r
635         return AppName::Match(_T("ezhtml.exe"));\r
636 }\r
637 \r
638 BOOL CUtils::IsTcsh()\r
639 {\r
640         return AppName::Match(_T("tcsh.exe"));\r
641 }\r
642 \r
643 BOOL CUtils::IsZsh()\r
644 {\r
645         return AppName::Match(_T("zsh.exe"));\r
646 }\r
647 \r
648 BOOL CUtils::IsPdksh()\r
649 {\r
650         return AppName::Match(_T("pdksh.exe"));\r
651 }\r
652 \r
653 BOOL CUtils::IsFirefox()\r
654 {\r
655         return AppName::Match(_T("firefox.exe"));\r
656 }\r
657 \r
658 BOOL CUtils::IsPHPEditor()\r
659 {\r
660         return AppName::Match(_T("php_editor.exe"));\r
661 }\r
662 \r
663 BOOL CUtils::IsTeraPad()\r
664 {\r
665         return AppName::Match(_T("TeraPad.exe"));\r
666 }\r
667 \r
668 BOOL CUtils::IsLispWorksPersonalEdition()\r
669 {\r
670         TCHAR prefix[] = _T("lispworks-personal-");\r
671         return !_tcsnicmp(AppName::GetAppName(), prefix, _countof(prefix));\r
672 }\r
673 \r
674 BOOL CUtils::IsBorlandCppBuilder()\r
675 {\r
676         return AppName::Match(_T("bcb.exe"));\r
677 }\r
678 \r
679 BOOL CUtils::Run(CString szCommandLine, BOOL isWait, BOOL isHide)\r
680 {\r
681         STARTUPINFO si;\r
682         ZeroMemory(&si, sizeof(si));\r
683         si.cb = sizeof(si);\r
684         if (isHide) {\r
685                 si.dwFlags = STARTF_USESHOWWINDOW;\r
686                 si.wShowWindow = SW_HIDE;\r
687         }\r
688 \r
689         PROCESS_INFORMATION pi;\r
690         ZeroMemory(&pi, sizeof(pi));\r
691 \r
692         BOOL rc = CreateProcess(NULL, szCommandLine.GetBuffer(szCommandLine.GetLength() + 1), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);\r
693         if (rc) {\r
694                 if (isWait) {\r
695                         WaitForSingleObject( pi.hProcess, INFINITE );\r
696                 }\r
697 \r
698                 CloseHandle(pi.hThread);\r
699                 CloseHandle(pi.hProcess);\r
700         }\r
701 \r
702         return rc;\r
703 }\r
704 \r
705 BOOL CUtils::IsJavaW()\r
706 {\r
707         return AppName::Match(_T("javaw.exe"));\r
708 }\r
709 \r
710 BOOL CUtils::IsMSDN()\r
711 {\r
712         return AppName::Match(_T("hh.exe"));\r
713 }\r
714 \r
715 BOOL CUtils::IsVisualSlickEdit()\r
716 {\r
717         return AppName::Match(_T("vs.exe"));\r
718 }\r
719 \r
720 BOOL CUtils::IsOpenJane()\r
721 {\r
722         return AppName::Match(_T("Jane2ch.exe"));\r
723 }\r
724 \r
725 BOOL CUtils::IsThunderbird()\r
726 {\r
727         return AppName::Match(_T("thunderbird.exe"));\r
728 }\r
729 \r
730 BOOL CUtils::IsLunascape()\r
731 {\r
732         return AppName::Match(_T("Luna.exe"));\r
733 }\r
734 \r
735 BOOL CUtils::IsAtok()\r
736 {\r
737         LPCTSTR name = AppName::GetAppName();\r
738         return !_tcsnicmp(name, _T("ATOK"), 4) && !_tcsicmp(name + _tcslen(name) - 4, _T(".IME"));\r
739 }\r