1 // Utils.cpp: implementation of the CUtils class
\r
3 //////////////////////////////////////////////////////////////////////
\r
7 #include "../xkeymacs/resource.h"
\r
10 bool CUtils::IsConsole()
\r
12 return AppName::IsConsole();
\r
15 int CUtils::GetWindowTextType(const CString& text)
\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
29 bool CUtils::IsMatchWindowText(const CString& text)
\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
48 BOOL CUtils::GetFindDialogTitle(CString *szDialogTitle)
\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
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
75 szDialogTitle->Empty();
\r
79 BOOL CUtils::IsFindDialog()
\r
81 CString szDialogTitle;
\r
82 return GetFindDialogTitle(&szDialogTitle);
\r
85 BOOL CUtils::IsXkeymacs()
\r
89 _T("xkeymacs64.exe"),
\r
91 return AppName::Match(names);
\r
94 BOOL CUtils::IsChrome()
\r
96 return AppName::Match(_T("chrome.exe"));
\r
99 BOOL CUtils::IsAstecX()
\r
101 return AppName::Match(_T("astecx.exe"));
\r
104 BOOL CUtils::IsBecky()
\r
106 return AppName::Match(_T("b2.exe"));
\r
109 BOOL CUtils::IsEmacs()
\r
111 return AppName::Match(_T("Emacs.exe"));
\r
114 BOOL CUtils::IsExplorer()
\r
116 return AppName::Match(_T("explorer.exe"));
\r
119 BOOL CUtils::IsHidemaru()
\r
121 return AppName::Match(_T("hidemaru.exe"));
\r
124 BOOL CUtils::IsInternetExplorer()
\r
126 return AppName::Match(_T("iexplore.exe"));
\r
129 BOOL CUtils::IsLotus123()
\r
131 return AppName::Match(_T("123w.exe"));
\r
134 BOOL CUtils::IsLotusNotes()
\r
136 return AppName::Match(_T("nlnotes.exe"));
\r
139 BOOL CUtils::IsLotusWordPro()
\r
141 return AppName::Match(_T("wordpro.exe"));
\r
144 BOOL CUtils::IsMeadow()
\r
146 LPCTSTR names[] = {
\r
148 _T("Meadow95.exe"),
\r
149 _T("MeadowNT.exe"),
\r
151 return AppName::Match(names);
\r
154 BOOL CUtils::IsMicrosoftFrontPage()
\r
156 return AppName::Match(_T("frontpg.exe"));
\r
159 BOOL CUtils::IsMicrosoftWord()
\r
161 return AppName::Match(_T("winword.exe"));
\r
164 BOOL CUtils::IsMozilla()
\r
166 LPCTSTR names[] = {
\r
170 return AppName::Match(names);
\r
173 BOOL CUtils::IsMuleForWin32()
\r
175 LPCTSTR names[] = {
\r
180 return AppName::Match(names);
\r
183 BOOL CUtils::IsNetscape()
\r
185 LPCTSTR names[] = {
\r
189 return AppName::Match(names);
\r
192 BOOL CUtils::IsNotepad()
\r
194 return AppName::Match(_T("notepad.exe"));
\r
197 BOOL CUtils::IsNotepadPP()
\r
199 return AppName::Match(_T("notepad++.exe"));
\r
202 BOOL CUtils::IsOpera()
\r
204 return AppName::Match(_T("opera.exe"));
\r
207 BOOL CUtils::IsOutlook()
\r
209 return AppName::Match(_T("outlook.exe"));
\r
212 BOOL CUtils::IsOutlookExpress()
\r
214 return AppName::Match(_T("msimn.exe"));
\r
217 BOOL CUtils::IsSakuraEditor()
\r
219 return AppName::Match(_T("sakura.exe"));
\r
222 BOOL CUtils::IsTeraTermPro()
\r
224 return AppName::Match(_T("ttermpro.exe"));
\r
227 BOOL CUtils::IsVisualCpp()
\r
229 return AppName::Match(_T("msdev.exe"));
\r
232 BOOL CUtils::IsWordpad()
\r
234 return AppName::Match(_T("wordpad.exe"));
\r
237 BOOL CUtils::IsXWin()
\r
239 return AppName::Match(_T("XWin.exe"));
\r
242 BOOL CUtils::IsXyzzy()
\r
244 return AppName::Match(_T("xyzzy.exe"));
\r
247 BOOL CUtils::OpenClipboard()
\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
255 // Log(_T("failed to open clipboard: %d (%d)"), GetLastError(), i);
\r
259 BOOL CUtils::GetClipboardText(CString& text)
\r
262 if (!OpenClipboard())
\r
265 Log(_T("GetClipboardText"));
\r
267 while (uFormat = EnumClipboardFormats(uFormat))
\r
268 Log(_T("uFormat = %d"), uFormat);
\r
270 const HANDLE hClipboard = GetClipboardData(CF_TEXT);
\r
275 const LPVOID pMem = GlobalLock(hClipboard);
\r
278 text = reinterpret_cast<LPCTSTR>(pMem);
\r
279 GlobalUnlock(hClipboard);
\r
285 BOOL CUtils::SetClipboardText(const CString& text)
\r
287 if (!OpenClipboard())
\r
289 const int nLength = text.GetLength() + 1;
\r
290 const HGLOBAL hClipboard = GlobalAlloc(GHND, nLength);
\r
293 const LPVOID pMem = GlobalLock(hClipboard);
\r
294 memcpy(pMem, LPCTSTR(text), nLength);
\r
295 GlobalUnlock(hClipboard);
\r
297 if (SetClipboardData(CF_TEXT, hClipboard) == NULL) {
\r
305 BOOL CUtils::IsDefaultIgnoreApplication()
\r
311 || IsLispWorksPersonalEdition()
\r
313 || IsMuleForWin32()
\r
317 || IsTeraTermPro() && !IsDialog()
\r
318 || IsVisualSlickEdit() && !IsDialog()
\r
320 || IsXyzzy() && !IsDialog()
\r
327 BOOL CUtils::IsDWFM()
\r
329 return AppName::Match(_T("dwfm.exe"));
\r
332 BOOL CUtils::IsK2Editor()
\r
334 return AppName::Match(_T("K2Editor.exe"));
\r
337 BOOL CUtils::IsEggExplorer()
\r
339 return AppName::Match(_T("EggExp.exe"));
\r
342 BOOL CUtils::IsDirector()
\r
344 return AppName::Match(_T("Director.exe"));
\r
347 BOOL CUtils::IsExcel()
\r
349 return AppName::Match(_T("Excel.exe"));
\r
352 BOOL CUtils::IsFireworks()
\r
354 LPCTSTR names[] = {
\r
355 _T("Fireworks 4.exe"),
\r
356 _T("Fireworks.exe"),
\r
358 return AppName::Match(names);
\r
361 BOOL CUtils::IsDreamweaver()
\r
363 return AppName::Match(_T("Dreamweaver.exe"));
\r
366 BOOL CUtils::IsFlash()
\r
368 return AppName::Match(_T("Flash.exe"));
\r
371 BOOL CUtils::IsPhotoshop()
\r
373 return AppName::Match(_T("Photoshp.exe"));
\r
376 BOOL CUtils::IsIllustrator()
\r
378 return AppName::Match(_T("Illustrator.exe"));
\r
381 BOOL CUtils::IsMicrosoftPowerPoint()
\r
383 return AppName::Match(_T("PowerPnt.exe"));
\r
386 BOOL CUtils::IsReget()
\r
388 LPCTSTR names[] = {
\r
392 return AppName::Match(names);
\r
395 BOOL CUtils::IsPaint()
\r
397 return AppName::Match(_T("mspaint.exe"));
\r
400 BOOL CUtils::IsSleipnir()
\r
402 return AppName::Match(_T("Sleipnir.exe"));
\r
405 BOOL CUtils::IsBash()
\r
407 return AppName::Match(_T("bash.exe"));
\r
410 static void invalid_parameter_handler(const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, uintptr_t)
\r
416 void CUtils::Log(LPCTSTR fmt, ...)
\r
420 TCHAR log[1024], msg[1024];
\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
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
430 _tmakepath_s(path, nullptr, path, _T("xkeylog"), _T("txt"));
\r
432 _tmakepath_s(path, nullptr, path, _T("xkeylog64"), _T("txt"));
\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
439 SetFilePointer(fh, 0, nullptr, FILE_END);
\r
441 WriteFile(fh, log, static_cast<DWORD>(strlen(log)), &written, nullptr);
\r
445 BOOL CUtils::IsSh()
\r
447 return AppName::Match(_T("sh.exe"));
\r
450 BOOL CUtils::IsCsh()
\r
452 return AppName::Match(_T("csh.exe"));
\r
455 BOOL CUtils::IsVisualStudio()
\r
457 if (IsVisualCpp() || CUtils::IsVisualBasic())
\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
464 BOOL CUtils::IsAccess()
\r
466 return AppName::Match(_T("MSACCESS.EXE"));
\r
469 BOOL CUtils::IsProject()
\r
471 return AppName::Match(_T("WINPROJ.EXE"));
\r
474 BOOL CUtils::IsVisualBasic()
\r
476 return AppName::Match(_T("VB6.EXE"));
\r
479 BOOL CUtils::IsVisualBasicEditor()
\r
481 if (IsVisualBasic()) {
\r
487 || IsMicrosoftFrontPage()
\r
488 || IsMicrosoftPowerPoint()
\r
489 || IsMicrosoftWord()
\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
502 BOOL CUtils::IsEclipse()
\r
504 return AppName::Match(_T("eclipse.exe"));
\r
507 BOOL CUtils::IsDialog()
\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
516 BOOL CUtils::IsEudora()
\r
518 return AppName::Match(_T("Eudora.exe"));
\r
521 BOOL CUtils::IsCodeWarrior()
\r
523 return AppName::Match(_T("IDE.exe"));
\r
526 BOOL CUtils::IseMemoPad()
\r
528 return AppName::Match(_T("eMemoPad.exe"));
\r
531 BOOL CUtils::IsStoryEditor()
\r
533 return AppName::Match(_T("STRYEDIT.EXE"));
\r
536 BOOL CUtils::IsNami2000()
\r
538 return AppName::Match(_T("Nami2000.exe"));
\r
541 BOOL CUtils::IsCorelDRAW()
\r
543 return AppName::Match(_T("CorelDrw.exe"));
\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
551 return IsTOForEOF();
\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
559 return IsTOForEOF();
\r
562 BOOL CUtils::IsTOForEOF()
\r
565 GetClipboardText(text);
\r
566 return text.IsEmpty() || // for normal application
\r
567 text.GetLength() >= 3; // for VC++
\r
570 BOOL CUtils::IsHusen()
\r
572 return AppName::Match(_T("husen.exe"));
\r
575 BOOL CUtils::IsAdobeReader()
\r
577 return AppName::Match(_T("AcroRd32.exe"));
\r
580 BOOL CUtils::IsOpenOffice()
\r
582 LPCTSTR names[] = {
\r
586 return AppName::Match(names);
\r
589 BOOL CUtils::IsTuruKameMail()
\r
591 return AppName::Match(_T("TuruKame.exe"));
\r
594 BOOL CUtils::IsOedit()
\r
596 return AppName::Match(_T("oedit.exe"));
\r
599 BOOL CUtils::IsAutla()
\r
601 return AppName::Match(_T("Autla.exe"));
\r
604 BOOL CUtils::IsShuriken()
\r
606 return AppName::Match(_T("JsvMail.exe"));
\r
609 BOOL CUtils::IsEdLeaf()
\r
611 return AppName::Match(_T("edleaf.exe"));
\r
614 BOOL CUtils::IsJmEditor()
\r
616 LPCTSTR names[] = {
\r
620 return AppName::Match(names);
\r
623 BOOL CUtils::IsDana()
\r
625 return AppName::Match(_T("Dana.exe"));
\r
628 BOOL CUtils::IsIPMessenger()
\r
630 return AppName::Match(_T("ipmsg.exe"));
\r
633 BOOL CUtils::IsezHTML()
\r
635 return AppName::Match(_T("ezhtml.exe"));
\r
638 BOOL CUtils::IsTcsh()
\r
640 return AppName::Match(_T("tcsh.exe"));
\r
643 BOOL CUtils::IsZsh()
\r
645 return AppName::Match(_T("zsh.exe"));
\r
648 BOOL CUtils::IsPdksh()
\r
650 return AppName::Match(_T("pdksh.exe"));
\r
653 BOOL CUtils::IsFirefox()
\r
655 return AppName::Match(_T("firefox.exe"));
\r
658 BOOL CUtils::IsPHPEditor()
\r
660 return AppName::Match(_T("php_editor.exe"));
\r
663 BOOL CUtils::IsTeraPad()
\r
665 return AppName::Match(_T("TeraPad.exe"));
\r
668 BOOL CUtils::IsLispWorksPersonalEdition()
\r
670 TCHAR prefix[] = _T("lispworks-personal-");
\r
671 return !_tcsnicmp(AppName::GetAppName(), prefix, _countof(prefix));
\r
674 BOOL CUtils::IsBorlandCppBuilder()
\r
676 return AppName::Match(_T("bcb.exe"));
\r
679 BOOL CUtils::Run(CString szCommandLine, BOOL isWait)
\r
682 ZeroMemory(&si, sizeof(si));
\r
683 si.cb = sizeof(si);
\r
685 PROCESS_INFORMATION pi;
\r
686 ZeroMemory(&pi, sizeof(pi));
\r
688 BOOL rc = CreateProcess(NULL, szCommandLine.GetBuffer(szCommandLine.GetLength() + 1), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
\r
691 WaitForSingleObject( pi.hProcess, INFINITE );
\r
694 CloseHandle(pi.hThread);
\r
695 CloseHandle(pi.hProcess);
\r
701 BOOL CUtils::IsJavaW()
\r
703 return AppName::Match(_T("javaw.exe"));
\r
706 BOOL CUtils::IsMSDN()
\r
708 return AppName::Match(_T("hh.exe"));
\r
711 BOOL CUtils::IsVisualSlickEdit()
\r
713 return AppName::Match(_T("vs.exe"));
\r
716 BOOL CUtils::IsOpenJane()
\r
718 return AppName::Match(_T("Jane2ch.exe"));
\r
721 BOOL CUtils::IsThunderbird()
\r
723 return AppName::Match(_T("thunderbird.exe"));
\r
726 BOOL CUtils::IsLunascape()
\r
728 return AppName::Match(_T("Luna.exe"));
\r
731 BOOL CUtils::IsAtok()
\r
733 LPCTSTR name = AppName::GetAppName();
\r
734 return !_tcsnicmp(name, _T("ATOK"), 4) && !_tcsicmp(name + _tcslen(name) - 4, _T(".IME"));
\r