OSDN Git Service

Change the platform toolset to v140
[xkeymacs/xkeymacs.git] / xkeymacsdll / Utils.cpp
index b8c9756..4636ec6 100644 (file)
@@ -12,6 +12,39 @@ bool CUtils::IsConsole()
        return AppName::IsConsole();\r
 }\r
 \r
+int CUtils::GetWindowTextType(const CString& text)\r
+{\r
+       int len = text.GetAllocLength();\r
+       if (len >= 3 && text[0] == _T('*') && text[len - 1] == _T('*'))\r
+               return IDS_WINDOW_TEXT_MATCH;\r
+       else if (len >= 2 && text[0] != _T('*') && text[len - 1] == _T('*'))\r
+               return IDS_WINDOW_TEXT_MATCH_FORWARD;\r
+       else if (len >= 2 && text[0] == _T('*') && text[len - 1] != _T('*'))\r
+               return IDS_WINDOW_TEXT_MATCH_BACKWARD;\r
+       else if (len > 0 && text[0] != _T('*') && text[len - 1] != _T('*'))\r
+               return IDS_WINDOW_TEXT_MATCH_FULL;\r
+       return IDS_WINDOW_TEXT_IGNORE;\r
+}\r
+\r
+bool CUtils::IsMatchWindowText(const CString& text)\r
+{\r
+       int len = text.GetLength();\r
+       TCHAR buf[WINDOW_TEXT_LENGTH];\r
+       GetWindowText(GetForegroundWindow(), buf, sizeof(buf));\r
+       CString current(buf);\r
+       switch (GetWindowTextType(text)) {\r
+       case IDS_WINDOW_TEXT_MATCH:                                                             // *foo*\r
+               return current.Find(text.Mid(1, len - 2)) >= 0;\r
+       case IDS_WINDOW_TEXT_MATCH_FORWARD:                                             // foo*\r
+               return current.Left(len - 1) == text.Left(len - 1);\r
+       case IDS_WINDOW_TEXT_MATCH_BACKWARD:                                    // *foo\r
+               return current.Right(len - 1) == text.Right(len - 1);\r
+       case IDS_WINDOW_TEXT_MATCH_FULL:                                                // foo\r
+               return current == text;\r
+       }\r
+       return true;\r
+}\r
+\r
 BOOL CUtils::GetFindDialogTitle(CString *szDialogTitle)\r
 {\r
        {\r
@@ -384,26 +417,29 @@ void CUtils::Log(LPCTSTR fmt, ...)
 {\r
        va_list ap;\r
        va_start(ap, fmt);\r
-       TCHAR log[1024];\r
-       _set_invalid_parameter_handler(invalid_parameter_handler);\r
-       if (_vstprintf_s(log, fmt, ap) < 0)\r
-               _tcscpy_s(log, _T("invalid format"));\r
-\r
+       TCHAR log[1024], msg[1024];\r
        static int n = 0;\r
+       _set_invalid_parameter_handler(invalid_parameter_handler);\r
+       if (_vstprintf_s(msg, fmt, ap) < 0)\r
+               _tcscpy_s(msg, _T("invalid format"));\r
+       va_end(ap);\r
+       _stprintf_s(log, _T("%4d %8x: %s\t%s\r\n"), n++, GetCurrentThreadId(), AppName::GetAppName(), msg);\r
        TCHAR path[MAX_PATH];\r
        if (GetTempPath(MAX_PATH, path)) {\r
 #ifndef _WIN64\r
-               _tmakepath_s(path, NULL, path, _T("xkeylog"), _T("txt"));\r
+               _tmakepath_s(path, nullptr, path, _T("xkeylog"), _T("txt"));\r
 #else\r
-               _tmakepath_s(path, NULL, path, _T("xkeylog64"), _T("txt"));\r
+               _tmakepath_s(path, nullptr, path, _T("xkeylog64"), _T("txt"));\r
 #endif\r
        } else\r
                _tcscpy_s(path, _T("c:\\xkeylog.txt"));\r
-\r
-       FILE *fp;\r
-       _tfopen_s(&fp, path, _T("a"));\r
-       _ftprintf(fp, _T("%8d: %s\t%s\n"), n++, AppName::GetAppName(), log);\r
-       fclose(fp);\r
+       HANDLE fh = CreateFile(path, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\r
+       if (fh == INVALID_HANDLE_VALUE)\r
+               return;\r
+       SetFilePointer(fh, 0, nullptr, FILE_END);\r
+       DWORD written;\r
+       WriteFile(fh, log, static_cast<DWORD>(strlen(log)), &written, nullptr);\r
+       CloseHandle(fh);\r
 }\r
 \r
 BOOL CUtils::IsSh()\r
@@ -687,31 +723,6 @@ BOOL CUtils::IsThunderbird()
        return AppName::Match(_T("thunderbird.exe"));\r
 }\r
 \r
-int CUtils::GetWindowTextType(CString strWindowText)\r
-{\r
-       int nWindowTextType = IDS_WINDOW_TEXT_IGNORE;\r
-\r
-       if (3 <= strWindowText.GetLength()\r
-        && strWindowText.Find(_T('*')) == 0\r
-        && strWindowText.ReverseFind(_T('*')) == strWindowText.GetLength() - 1) {\r
-               nWindowTextType = IDS_WINDOW_TEXT_MATCH;\r
-       } else if (2 <= strWindowText.GetLength()\r
-                       && strWindowText.Find(_T('*')) != 0\r
-                       && strWindowText.ReverseFind(_T('*')) == strWindowText.GetLength() - 1) {\r
-               nWindowTextType = IDS_WINDOW_TEXT_MATCH_FORWARD;\r
-       } else if (2 <= strWindowText.GetLength()\r
-                       && strWindowText.Find(_T('*')) == 0\r
-                       && strWindowText.ReverseFind(_T('*')) != strWindowText.GetLength() - 1) {\r
-               nWindowTextType = IDS_WINDOW_TEXT_MATCH_BACKWARD;\r
-       } else if (!strWindowText.IsEmpty()\r
-                       && strWindowText.Find(_T('*')) != 0\r
-                       && strWindowText.ReverseFind(_T('*')) != strWindowText.GetLength() - 1) {\r
-               nWindowTextType = IDS_WINDOW_TEXT_MATCH_FULL;\r
-       }\r
-\r
-       return nWindowTextType;\r
-}\r
-\r
 BOOL CUtils::IsLunascape()\r
 {\r
        return AppName::Match(_T("Luna.exe"));\r