Revision: 8532 https://osdn.net/projects/ttssh2/scm/svn/commits/8532 Author: zmatsuo Date: 2020-02-09 14:55:07 +0900 (Sun, 09 Feb 2020) Log Message: ----------- layer_for_unicode に API 追加 - _SendMessageW() 追加 - _SendDlgItemMessageW() と処理を共通化 - 処理できるメッセージを追加 - WM_GETTEXT, LB_GETTEXT, LB_GETTEXTLEN, LB_INSERTSTRING - _GetWindowTextW(), _GetWindowTextLengthW() 追加 Modified Paths: -------------- trunk/teraterm/common/compat_win.cpp trunk/teraterm/common/compat_win.h trunk/teraterm/common/layer_for_unicode.cpp trunk/teraterm/common/layer_for_unicode.h -------------- next part -------------- Modified: trunk/teraterm/common/compat_win.cpp =================================================================== --- trunk/teraterm/common/compat_win.cpp 2020-02-06 16:08:10 UTC (rev 8531) +++ trunk/teraterm/common/compat_win.cpp 2020-02-09 05:55:07 UTC (rev 8532) @@ -35,6 +35,9 @@ #include "dllutil.h" #include "ttlib.h" +// for debug +//#define UNICODE_API_DISABLE 1 + ATOM (WINAPI *pRegisterClassW)(const WNDCLASSW *lpWndClass); HWND (WINAPI *pCreateWindowExW)(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); @@ -41,6 +44,7 @@ LRESULT (WINAPI *pDefWindowProcW)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); HPROPSHEETPAGE (WINAPI *pCreatePropertySheetPageW)(LPCPROPSHEETPAGEW constPropSheetPagePointer); INT_PTR (WINAPI *pPropertySheetW)(LPCPROPSHEETHEADERW constPropSheetHeaderPointer); +LRESULT (WINAPI *pSendMessageW)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); LRESULT (WINAPI *pSendDlgItemMessageW)(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam); BOOL (WINAPI *pModifyMenuW)(HMENU hMnu, UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem); int(WINAPI *pGetMenuStringW)(HMENU hMenu, UINT uIDItem, LPWSTR lpString, int cchMax, UINT flags); @@ -51,7 +55,6 @@ BOOL (WINAPI *pSetDlgItemTextW)(HWND hDlg, int nIDDlgItem, LPCWSTR lpString); BOOL (WINAPI *pGetDlgItemTextW)(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int cchMax); BOOL (WINAPI *pAlphaBlend)(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION); -BOOL (WINAPI *pEnumDisplayMonitors)(HDC,LPCRECT,MONITORENUMPROC,LPARAM); DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT dpiContext); BOOL (WINAPI *pIsValidDpiAwarenessContext)(DPI_AWARENESS_CONTEXT dpiContext); UINT (WINAPI *pGetDpiForWindow)(HWND hwnd); @@ -74,11 +77,16 @@ BOOL (WINAPI *pInsertMenuW)(HMENU hMenu, UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem); BOOL (WINAPI *pAppendMenuW)(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem); +// multi monitor Windows98+/Windows2000+ +BOOL (WINAPI *pEnumDisplayMonitors)(HDC,LPCRECT,MONITORENUMPROC,LPARAM); HMONITOR (WINAPI *pMonitorFromWindow)(HWND hwnd, DWORD dwFlags); HMONITOR (WINAPI *pMonitorFromPoint)(POINT pt, DWORD dwFlags); HMONITOR (WINAPI *pMonitorFromRect)(LPCRECT lprc, DWORD dwFlags); BOOL (WINAPI *pGetMonitorInfoA)(HMONITOR hMonitor, LPMONITORINFO lpmi); +int (WINAPI *pGetWindowTextW)(HWND hWnd, LPWSTR lpString, int nMaxCount); +int (WINAPI *pGetWindowTextLengthW)(HWND hWnd); + /** * GetConsoleWindow() \x82Ɠ\xAF\x82\xB6\x93\xAE\x8D\xEC\x82\xF0\x82\xB7\x82\xE9 * https://support.microsoft.com/ja-jp/help/124103/how-to-obtain-a-console-window-handle-hwnd @@ -119,9 +127,11 @@ } static const APIInfo Lists_user32[] = { +#ifndef UNICODE_API_DISABLE { "RegisterClassW", (void **)&pRegisterClassW }, { "CreateWindowExW", (void **)&pCreateWindowExW }, { "DefWindowProcW", (void **)&pDefWindowProcW }, +#endif { "SetLayeredWindowAttributes", (void **)&pSetLayeredWindowAttributes }, { "SetThreadDpiAwarenessContext", (void **)&pSetThreadDpiAwarenessContext }, { "IsValidDpiAwarenessContext", (void **)&pIsValidDpiAwarenessContext }, @@ -129,6 +139,7 @@ { "MonitorFromRect", (void **)&pMonitorFromRect }, { "AdjustWindowRectEx", (void **)&pAdjustWindowRectEx }, { "AdjustWindowRectExForDpi", (void **)&pAdjustWindowRectExForDpi }, +#ifndef UNICODE_API_DISABLE { "SetDlgItemTextW", (void **)&pSetDlgItemTextW }, { "GetDlgItemTextW", (void **)&pGetDlgItemTextW }, { "SetWindowTextW", (void **)&pSetWindowTextW }, @@ -139,6 +150,11 @@ { "DialogBoxIndirectParamW", (void **)&pDialogBoxIndirectParamW }, { "InsertMenuW", (void **)&pInsertMenuW }, { "AppendMenuW", (void **)&pAppendMenuW }, + { "SendMessageW", (void **)&pSendMessageW }, + { "GetWindowTextW", (void **)&pGetWindowTextW }, + { "GetWindowTextLengthW", (void **)&pGetWindowTextLengthW }, +#endif + { "MonitorFromWindow", (void **)&pMonitorFromWindow }, { "MonitorFromPoint", (void **)&pMonitorFromPoint }, { "GetMonitorInfoA", (void **)&pGetMonitorInfoA }, @@ -151,8 +167,10 @@ }; static const APIInfo Lists_gdi32[] = { +#ifndef UNICODE_API_DISABLE { "AddFontResourceExW", (void **)&pAddFontResourceExW }, { "RemoveFontResourceExW", (void **)&pRemoveFontResourceExW }, +#endif {}, }; @@ -162,25 +180,33 @@ }; static const APIInfo Lists_kernel32[] = { +#ifndef UNICODE_API_DISABLE { "GetFileAttributesW", (void **)&pGetFileAttributesW }, { "GetPrivateProfileStringW", (void **)&pGetPrivateProfileStringW }, +#endif { "GetConsoleWindow", (void **)&pGetConsoleWindow }, {}, }; static const APIInfo Lists_shell32[] = { +#ifndef UNICODE_API_DISABLE { "DragQueryFileW", (void **)&pDragQueryFileW }, +#endif {}, }; static const APIInfo Lists_comctl32[] = { +#ifndef UNICODE_API_DISABLE { "CreatePropertySheetPageW", (void **)&pCreatePropertySheetPageW }, { "PropertySheetW", (void **)&pPropertySheetW }, +#endif {}, }; static const APIInfo Lists_hhctrl[] = { +#ifndef UNICODE_API_DISABLE { "HtmlHelpW", (void **)&pHtmlHelpW }, +#endif { "HtmlHelpA", (void **)&pHtmlHelpA }, {}, }; Modified: trunk/teraterm/common/compat_win.h =================================================================== --- trunk/teraterm/common/compat_win.h 2020-02-06 16:08:10 UTC (rev 8531) +++ trunk/teraterm/common/compat_win.h 2020-02-09 05:55:07 UTC (rev 8532) @@ -107,6 +107,9 @@ extern HMONITOR (WINAPI *pMonitorFromPoint)(POINT pt, DWORD dwFlags); extern HMONITOR (WINAPI *pMonitorFromRect)(LPCRECT lprc, DWORD dwFlags); extern BOOL (WINAPI *pGetMonitorInfoA)(HMONITOR hMonitor, LPMONITORINFO lpmi); +extern LRESULT (WINAPI *pSendMessageW)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +extern int (WINAPI *pGetWindowTextW)(HWND hWnd, LPWSTR lpString, int nMaxCount); +extern int (WINAPI *pGetWindowTextLengthW)(HWND hWnd); void WinCompatInit(); Modified: trunk/teraterm/common/layer_for_unicode.cpp =================================================================== --- trunk/teraterm/common/layer_for_unicode.cpp 2020-02-06 16:08:10 UTC (rev 8531) +++ trunk/teraterm/common/layer_for_unicode.cpp 2020-02-09 05:55:07 UTC (rev 8532) @@ -117,45 +117,157 @@ return attr; } -LRESULT _SendDlgItemMessageW(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam) +/** + * hWnd \x82ɐݒ肳\x82\xEA\x82Ă\xA2\x82镶\x8E\x9A\x97\xF1\x82\xF0\x8E擾 + * + * @param[in] hWnd + * @param[in,out] lenW \x95\xB6\x8E\x9A\x90\x94(L'\0'\x82\xF0\x8A܂܂Ȃ\xA2) + * @return \x95\xB6\x8E\x9A\x97\xF1 + */ +static wchar_t *SendMessageAFromW_WM_GETTEXT(HWND hWnd, size_t *lenW) { - if (pSendDlgItemMessageW != NULL) { - return pSendDlgItemMessageW(hDlg, nIDDlgItem, Msg, wParam, lParam); + // lenA = excluding the terminating null character. + size_t lenA = SendMessageA(hWnd, WM_GETTEXTLENGTH, 0, 0); + char *strA = (char *)malloc(lenA + 1); + if (strA == NULL) { + *lenW = 0; + return NULL; } + lenA = GetWindowTextA(hWnd, strA, (int)(lenA + 1)); + strA[lenA] = '\0'; + wchar_t *strW = ToWcharA(strA); + free(strA); + if (strW == NULL) { + *lenW = 0; + return NULL; + } + *lenW = wcslen(strW); + return strW; +} +/** + * hWnd(ListBox) \x82ɐݒ肳\x82\xEA\x82Ă\xA2\x82镶\x8E\x9A\x97\xF1\x82\xF0\x8E擾 + * + * @param[in] hWnd + * @param[in] wParam \x8D\x80\x96ڔԍ\x86(0\x81`) + * @param[in,out] lenW \x95\xB6\x8E\x9A\x90\x94(L'\0'\x82\xF0\x8A܂܂Ȃ\xA2) + * @return \x95\xB6\x8E\x9A\x97\xF1 + */ +static wchar_t *SendMessageAFromW_LB_GETTEXT(HWND hWnd, WPARAM wParam, size_t *lenW) +{ + // lenA = excluding the terminating null character. + size_t lenA = SendMessageA(hWnd, LB_GETTEXTLEN, wParam, 0); + char *strA = (char *)malloc(lenA + 1); + if (strA == NULL) { + *lenW = 0; + return NULL; + } + lenA = SendMessageA(hWnd, LB_GETTEXT, wParam, (LPARAM)strA); + wchar_t *strW = ToWcharA(strA); + free(strA); + if (strW == NULL) { + *lenW = 0; + return NULL; + } + *lenW = wcslen(strW); + return strW; +} + +int _GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount) +{ + if (pGetWindowTextW != NULL) { + GetWindowTextW(hWnd, lpString, nMaxCount); + } + + size_t lenW; + wchar_t *strW = SendMessageAFromW_WM_GETTEXT(hWnd, &lenW); + wchar_t *dest_ptr = (wchar_t *)lpString; + size_t dest_len = (size_t)nMaxCount; + wcsncpy_s(dest_ptr, dest_len, strW, _TRUNCATE); + free(strW); + return (int)(dest_len - 1); +} + +int _GetWindowTextLengthW(HWND hWnd) +{ + if (pGetWindowTextLengthW != NULL) { + return pGetWindowTextLengthW(hWnd); + } + + size_t lenW; + wchar_t *strW = SendMessageAFromW_WM_GETTEXT(hWnd, &lenW); + free(strW); + return (int)(lenW - 1); +} + +static LRESULT SendMessageAFromW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ LRESULT retval; switch(Msg) { case CB_ADDSTRING: - case LB_ADDSTRING: { + case LB_ADDSTRING: + case LB_INSERTSTRING: { char *strA = ToCharW((wchar_t *)lParam); - retval = SendDlgItemMessageA(hDlg, nIDDlgItem, Msg, wParam, (LPARAM)strA); + retval = SendMessageA(hWnd, Msg, wParam, (LPARAM)strA); free(strA); - break; + return retval; } - case WM_GETTEXTLENGTH: { - retval = 0; - LRESULT len = SendDlgItemMessageA(hDlg, nIDDlgItem, WM_GETTEXTLENGTH, 0, 0); - len++; // for '\0' - char *strA = (char *)malloc(sizeof(char) * len); - if (strA != NULL) { - GetDlgItemTextA(hDlg, nIDDlgItem, strA, (int)len); - strA[len-1] = '\0'; - wchar_t *strW = ToWcharA(strA); - if (strW != NULL) { - retval = (LRESULT)wcslen(strW);// '\0'\x82\xF0\x8A܂܂Ȃ\xA2\x92\xB7\x82\xB3\x82\xF0\x95Ԃ\xB7 - free(strW); - } - free(strA); + case WM_GETTEXTLENGTH: + case LB_GETTEXTLEN: { + size_t lenW; + wchar_t *strW; + if (Msg == WM_GETTEXTLENGTH) { + strW = SendMessageAFromW_WM_GETTEXT(hWnd, &lenW); } - break; + else { + strW = SendMessageAFromW_LB_GETTEXT(hWnd, wParam, &lenW); + } + free(strW); + return lenW; } + case WM_GETTEXT: + case LB_GETTEXT: { + size_t lenW; + wchar_t *strW; + size_t dest_len; + if (Msg == WM_GETTEXT) { + strW = SendMessageAFromW_WM_GETTEXT(hWnd, &lenW); + dest_len = (size_t)wParam; + } + else { + strW = SendMessageAFromW_LB_GETTEXT(hWnd, wParam, &lenW); + dest_len = lenW + 1; + } + wchar_t *dest_ptr = (wchar_t *)lParam; + wcsncpy_s(dest_ptr, dest_len, strW, _TRUNCATE); + free(strW); + return dest_len - 1 < lenW ? dest_len - 1 : lenW; + } default: - retval = SendDlgItemMessageA(hDlg, nIDDlgItem, Msg, wParam, lParam); + retval = SendMessageA(hWnd, Msg, wParam, lParam); break; } return retval; } +LRESULT _SendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + if (pSendMessageW != NULL) { + return pSendMessageW(hWnd, Msg, wParam, lParam); + } + return SendMessageAFromW(hWnd, Msg, wParam, lParam); +} + +LRESULT _SendDlgItemMessageW(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + if (pSendDlgItemMessageW != NULL) { + return pSendDlgItemMessageW(hDlg, nIDDlgItem, Msg, wParam, lParam); + } + + HWND hWnd = GetDlgItem(hDlg, nIDDlgItem); + return SendMessageAFromW(hWnd, Msg, wParam, lParam); +} + HWND _CreateWindowExW(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { @@ -224,25 +336,18 @@ return pGetDlgItemTextW(hDlg, nIDDlgItem, lpString, cchMax); } - // \x82\xB1\x82̕\xB6\x8E\x9A\x97\xCD ANSI - size_t len = SendDlgItemMessageA(hDlg, nIDDlgItem, WM_GETTEXTLENGTH, 0, 0); - len++; // for '\0' - char *strA = (char *)malloc(sizeof(char) * len); - if (strA != NULL) { - GetDlgItemTextA(hDlg, nIDDlgItem, strA, (int)len); - strA[len - 1] = '\0'; - wchar_t *strW = ToWcharA(strA); - if (strW != NULL) { - wcscpy_s(lpString, cchMax, strW); - UINT len = (UINT)wcslen(strW); // '\0' \x82\xF0\x8A܂܂Ȃ\xA2\x92\xB7\x82\xB3\x82\xF0\x95Ԃ\xB7 - free(strW); - return len; - } + if (cchMax <= 1) { + return 0; } - if (cchMax > 0) - lpString[0] = 0; - return 0; + HWND hWnd = GetDlgItem(hDlg, nIDDlgItem); + size_t lenW; + wchar_t *strW = SendMessageAFromW_WM_GETTEXT(hWnd, &lenW); + wchar_t *dest_ptr = lpString; + size_t dest_len = (size_t)cchMax; + wcsncpy_s(dest_ptr, dest_len, strW, _TRUNCATE); + free(strW); + return (UINT)(dest_len - 1 < lenW ? dest_len - 1 : lenW); } /** Modified: trunk/teraterm/common/layer_for_unicode.h =================================================================== --- trunk/teraterm/common/layer_for_unicode.h 2020-02-06 16:08:10 UTC (rev 8531) +++ trunk/teraterm/common/layer_for_unicode.h 2020-02-09 05:55:07 UTC (rev 8532) @@ -46,6 +46,7 @@ DWORD _GetFileAttributesW(LPCWSTR lpFileName); UINT _DragQueryFileW(HDROP hDrop, UINT iFile, LPWSTR lpszFile, UINT cch); LRESULT _SendDlgItemMessageW(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam); +LRESULT _SendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); HWND _CreateWindowExW(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); @@ -55,6 +56,8 @@ BOOL _InsertMenuW(HMENU hMenu, UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem); BOOL _AppendMenuW(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem); HWND _HtmlHelpW(HWND hwndCaller, LPCWSTR pszFile, UINT uCommand, DWORD_PTR dwData); +int _GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount); +int _GetWindowTextLengthW(HWND hWnd); // gdi32.lib int _AddFontResourceW(LPCWSTR lpFileName);