COORD MyGetLargestConsoleWindowSize(HANDLE hConsoleOutput) { // Fails in Wine COORD crMax = hkFunc.getLargestConsoleWindowSize(hConsoleOutput); DWORD dwErr = (crMax.X && crMax.Y) ? 0 : GetLastError(); UNREFERENCED_PARAMETER(dwErr); // Wine BUG //if (!crMax.X || !crMax.Y) if ((crMax.X == 80 && crMax.Y == 24) && IsWine()) { crMax.X = 999; crMax.Y = 999; } #ifdef _DEBUG else if (IsWin10()) { CONSOLE_SCREEN_BUFFER_INFO csbi = {}; GetConsoleScreenBufferInfo(hConsoleOutput, &csbi); // Windows 10 Preview had a new bug in GetLargestConsoleWindowSize _ASSERTE((crMax.X > (csbi.srWindow.Right-csbi.srWindow.Left+1)) && (crMax.Y > (csbi.srWindow.Bottom-csbi.srWindow.Top+1))); //crMax.X = max(crMax.X,555); //crMax.Y = max(crMax.Y,555); } #endif return crMax; }
// ConEmuC -OsVerInfo int OsVerInfo() { OSVERSIONINFOEX osv = {sizeof(osv)}; GetOsVersionInformational((OSVERSIONINFO*)&osv); UINT DBCS = IsDbcs(); UINT HWFS = IsHwFullScreenAvailable(); UINT W5fam = IsWin5family(); UINT WXPSP1 = IsWinXPSP1(); UINT W6 = IsWin6(); UINT W7 = IsWin7(); UINT W10 = IsWin10(); UINT Wx64 = IsWindows64(); UINT WINE = IsWine(); UINT WPE = IsWinPE(); UINT TELNET = isTerminalMode(); wchar_t szInfo[200]; _wsprintf(szInfo, SKIPCOUNT(szInfo) L"OS version information\n" L"%u.%u build %u SP%u.%u suite=x%04X type=%u\n" L"W5fam=%u WXPSP1=%u W6=%u W7=%u W10=%u Wx64=%u\n" L"HWFS=%u DBCS=%u WINE=%u WPE=%u TELNET=%u\n", osv.dwMajorVersion, osv.dwMinorVersion, osv.dwBuildNumber, osv.wServicePackMajor, osv.wServicePackMinor, osv.wSuiteMask, osv.wProductType, W5fam, WXPSP1, W6, W7, W10, Wx64, HWFS, DBCS, WINE, WPE, TELNET); _wprintf(szInfo); return MAKEWORD(osv.dwMinorVersion, osv.dwMajorVersion); }
CString CUtils::GetOsName( void ) { static CString szOsName; if (szOsName.IsEmpty()) { if (IsXP()) { szOsName = L"windowsxp"; } if (IsVista()) { szOsName = L"windowsvista"; } if (IsWin7()) { szOsName = L"windows7"; } if (IsWin8()) { szOsName = L"windows8"; } if (IsWin8_1()) { szOsName = L"windows81"; } if (IsWin10()) { szOsName = L"windows10"; } } return szOsName; }
bool CDpiForDialog::Create(CDpiForDialog*& pHelper) { if (pHelper) return true; // In Win10 and newly implemented PerMonitor DPI support we don't need dialog handlers anymore if (IsWin10()) return false; // Only if required if (!CDpiAware::IsPerMonitorDpi()) return false; pHelper = new CDpiForDialog(); return (pHelper != nullptr); }
bool IsConsoleDoubleCellCP() { static bool bDBCS = false, bDBCS_Checked = false; if (!bDBCS_Checked) { bDBCS = (GetSystemMetrics(SM_DBCSENABLED) != 0); bDBCS_Checked = true; } static bool bDBCS_CP = false; static DWORD nLastCP = 0; UINT MaxCharSize = 0; DWORD nCP; #ifdef _DEBUG DWORD nCP1; //DWORD nMode; #endif if (bDBCS) { nCP = GetConsoleOutputCP(); #ifdef _DEBUG nCP1 = GetConsoleCP(); _ASSERTE(nCP1==nCP); //GetConsoleMode(hOut, &nMode); #endif if (!nLastCP || (nLastCP != nCP)) { bool bNewVal = true; if (!AreCpInfoLeads(nCP, &MaxCharSize) || MaxCharSize < 2) { // gh-879: Windows 10 (since 14931) has changed behavior for double-cell glyphs // Now they are doubled (COMMON_LVB_LEADING_BYTE/COMMON_LVB_TRAILING_BYTE) even for UTF-8 codepage if (!IsWin10()) bNewVal = false; } bDBCS_CP = bNewVal; nLastCP = nCP; } } return bDBCS_CP; }
BOOL WINAPI OnSetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode) { //typedef BOOL (WINAPI* OnSetConsoleMode_t)(HANDLE hConsoleHandle, DWORD dwMode); ORIGINAL_KRNL(SetConsoleMode); BOOL lbRc = FALSE; #if 0 if (!(dwMode & ENABLE_PROCESSED_OUTPUT)) { _ASSERTEX((dwMode & ENABLE_PROCESSED_OUTPUT)==ENABLE_PROCESSED_OUTPUT); } #endif #ifdef _DEBUG if (dwMode == 0) { if (HandleKeeper::IsOutputHandle(hConsoleHandle)) { // Official (Win32) Vim tries to reset ConsoleMode on start, gbIsVimProcess expected to be set // Also occurred in cmd.exe (call from cmd.exe!_ResetConsoleMode()), will be set to `3` after this _ASSERTE(gbIsVimProcess || gbIsCmdProcess); } } #endif if (gbIsVimProcess) { if ((dwMode & (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT)) != (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT)) { if (HandleKeeper::IsOutputHandle(hConsoleHandle)) { dwMode |= ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT; } else { dwMode |= ENABLE_WINDOW_INPUT; } } } // gh-629: Arrow keys not working in Bash for Windows if (gbIsBashProcess && IsWin10()) { // 0x200 is undocumented mode if ((dwMode & 0x200) || (CEAnsi::gbWasXTermOutput && !(dwMode & 0x200))) { if (!HandleKeeper::IsOutputHandle(hConsoleHandle)) { _ASSERT(HandleKeeper::IsInputHandle(hConsoleHandle)); CEAnsi::StartXTermMode((dwMode & 0x200) == 0x200); } } } #ifdef _DEBUG if ((gnExeFlags & (caf_Cygwin1|caf_Msys1|caf_Msys2)) && (dwMode & ENABLE_PROCESSED_INPUT) && !HandleKeeper::IsOutputHandle(hConsoleHandle)) { //_ASSERTE(!(dwMode & ENABLE_PROCESSED_INPUT)); wchar_t szLog[120]; msprintf(szLog, countof(szLog), L"\r\n\033[31;40m{PID:%u} Process is enabling ENABLE_PROCESSED_INPUT\033[m\r\n", GetCurrentProcessId()); //WriteProcessed2(szLog, lstrlen(szLog), NULL, wps_Error); szLog[0] = 0; } #endif lbRc = F(SetConsoleMode)(hConsoleHandle, dwMode); return lbRc; }
// returns false if message not handled bool CFrameHolder::ProcessNcMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult) { #ifdef _DEBUG if (mb_NcAnimate) { wchar_t szDbg[1024], szMsg[128], szInfo[255]; szInfo[0] = 0; switch (uMsg) { case WM_ERASEBKGND: lstrcpy(szMsg, L"WM_ERASEBKGND"); break; case WM_PAINT: lstrcpy(szMsg, L"WM_PAINT"); break; case WM_NCPAINT: lstrcpy(szMsg, L"WM_NCPAINT"); break; case WM_NCACTIVATE: lstrcpy(szMsg, L"WM_NCACTIVATE"); break; case WM_NCCALCSIZE: lstrcpy(szMsg, L"WM_NCCALCSIZE"); break; case WM_NCHITTEST: lstrcpy(szMsg, L"WM_NCHITTEST"); break; case WM_NCLBUTTONDOWN: lstrcpy(szMsg, L"WM_NCLBUTTONDOWN"); break; case WM_NCMOUSEMOVE: lstrcpy(szMsg, L"WM_NCMOUSEMOVE"); break; case WM_NCMOUSELEAVE: lstrcpy(szMsg, L"WM_NCMOUSELEAVE"); break; case WM_NCMOUSEHOVER: lstrcpy(szMsg, L"WM_NCMOUSEHOVER"); break; case WM_NCLBUTTONDBLCLK: lstrcpy(szMsg, L"WM_NCLBUTTONDBLCLK"); break; case 0xAE: /*WM_NCUAHDRAWCAPTION*/ lstrcpy(szMsg, L"WM_NCUAHDRAWCAPTION"); break; case 0xAF: /*WM_NCUAHDRAWFRAME*/ lstrcpy(szMsg, L"WM_NCUAHDRAWFRAME"); break; case 0x31E: /*WM_DWMCOMPOSITIONCHANGED*/ lstrcpy(szMsg, L"WM_DWMCOMPOSITIONCHANGED"); break; case WM_WINDOWPOSCHANGED: lstrcpy(szMsg, L"WM_WINDOWPOSCHANGED"); break; case WM_SYSCOMMAND: lstrcpy(szMsg, L"WM_SYSCOMMAND"); break; case WM_GETTEXT: lstrcpy(szMsg, L"WM_GETTEXT"); break; case WM_PRINT: lstrcpy(szMsg, L"WM_PRINT"); break; case WM_PRINTCLIENT: lstrcpy(szMsg, L"WM_PRINTCLIENT"); break; case WM_GETMINMAXINFO: lstrcpy(szMsg, L"WM_GETMINMAXINFO"); break; case WM_WINDOWPOSCHANGING: lstrcpy(szMsg, L"WM_WINDOWPOSCHANGING"); break; case WM_MOVE: lstrcpy(szMsg, L"WM_MOVE"); wsprintf(szInfo, L"{%ix%i}", (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam)); break; case WM_SIZE: lstrcpy(szMsg, L"WM_SIZE"); wsprintf(szInfo, L"%s {%ix%i}", (wParam==SIZE_MAXHIDE) ? L"SIZE_MAXHIDE" : (wParam==SIZE_MAXIMIZED) ? L"SIZE_MAXIMIZED" : (wParam==SIZE_MAXSHOW) ? L"SIZE_MAXSHOW" : (wParam==SIZE_MINIMIZED) ? L"SIZE_MINIMIZED" : (wParam==SIZE_RESTORED) ? L"SIZE_RESTORED" : L"???", (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam)); break; default: wsprintf(szMsg, L"%u=x%X", uMsg, uMsg); } wsprintf(szDbg, L"MsgInAnimage(%s, %u, %u%s%s)\n", szMsg, (DWORD)wParam, (DWORD)lParam, szInfo[0] ? L" - " : L"", szInfo); OutputDebugString(szDbg); } #endif bool lbRc; static POINT ptLastNcClick = {}; switch (uMsg) { case WM_ERASEBKGND: DBGFUNCTION(L"WM_ERASEBKGND \n"); lResult = TRUE; return true; case WM_PAINT: DBGFUNCTION(L"WM_PAINT \n"); lResult = OnPaint(hWnd, NULL/*use BeginPaint,EndPaint*/, WM_PAINT); return true; case WM_NCPAINT: DBGFUNCTION(L"WM_NCPAINT \n"); lResult = OnNcPaint(hWnd, uMsg, wParam, lParam); return true; case WM_NCACTIVATE: DBGFUNCTION(L"WM_NCACTIVATE \n"); lResult = OnNcActivate(hWnd, uMsg, wParam, lParam); return true; case WM_NCCALCSIZE: DBGFUNCTION(L"WM_NCCALCSIZE \n"); lResult = OnNcCalcSize(hWnd, uMsg, wParam, lParam); return true; case WM_NCHITTEST: DBGFUNCTION(L"WM_NCHITTEST \n"); lResult = OnNcHitTest(hWnd, uMsg, wParam, lParam); return true; case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: case WM_NCRBUTTONDOWN: case WM_NCRBUTTONUP: case WM_NCMBUTTONDOWN: case WM_NCMBUTTONUP: case WM_NCMOUSEMOVE: case WM_NCMOUSELEAVE: case WM_NCMOUSEHOVER: #ifdef _DEBUG switch (uMsg) { case WM_NCLBUTTONDOWN: DBGFUNCTION(L"WM_NCLBUTTONDOWN \n"); break; case WM_NCLBUTTONUP: DBGFUNCTION(L"WM_NCLBUTTONUP \n"); break; case WM_NCRBUTTONDOWN: DBGFUNCTION(L"WM_NCRBUTTONDOWN \n"); break; case WM_NCRBUTTONUP: DBGFUNCTION(L"WM_NCRBUTTONUP \n"); break; case WM_NCMBUTTONDOWN: DBGFUNCTION(L"WM_NCMBUTTONDOWN \n"); break; case WM_NCMBUTTONUP: DBGFUNCTION(L"WM_NCMBUTTONUP \n"); break; case WM_NCMOUSEMOVE: DBGFUNCTION(L"WM_NCMOUSEMOVE \n"); break; case WM_NCMOUSELEAVE: DBGFUNCTION(L"WM_NCMOUSELEAVE \n"); break; case WM_NCMOUSEHOVER: DBGFUNCTION(L"WM_NCMOUSEHOVER \n"); break; } #endif ptLastNcClick = MakePoint(LOWORD(lParam),HIWORD(lParam)); if ((uMsg == WM_NCMOUSEMOVE) || (uMsg == WM_NCLBUTTONUP)) gpConEmu->isSizing(uMsg); // могло не сброситься, проверим if (gpSet->isTabsInCaption) { //RedrawLock(); lbRc = gpConEmu->mp_TabBar->ProcessNcTabMouseEvent(hWnd, uMsg, wParam, lParam, lResult); //RedrawUnlock(); } else { // Табов чисто в заголовке - нет lbRc = false; } if (!lbRc) { if ((wParam == HTSYSMENU) && (uMsg == WM_NCLBUTTONDOWN)) { gpConEmu->mp_Menu->OnNcIconLClick(); lResult = 0; lbRc = true; } else if ((wParam == HTSYSMENU || wParam == HTCAPTION) && (uMsg == WM_NCRBUTTONDOWN || uMsg == WM_NCRBUTTONUP)) { if (uMsg == WM_NCRBUTTONUP) { LogString(L"ShowSysmenu called from (WM_NCRBUTTONUP)"); gpConEmu->mp_Menu->ShowSysmenu((short)LOWORD(lParam), (short)HIWORD(lParam)); } lResult = 0; lbRc = true; } else if ((uMsg == WM_NCRBUTTONDOWN || uMsg == WM_NCRBUTTONUP) && (wParam == HTCLOSE || wParam == HTMINBUTTON || wParam == HTMAXBUTTON)) { switch (LOWORD(wParam)) { case HTMINBUTTON: case HTCLOSE: Icon.HideWindowToTray(); break; case HTMAXBUTTON: gpConEmu->DoFullScreen(); break; } lResult = 0; lbRc = true; } } return lbRc; //case WM_LBUTTONDBLCLK: // { // // Глюк? DblClick по иконке приводит к WM_LBUTTONDBLCLK вместо WM_NCLBUTTONDBLCLK // POINT pt = MakePoint(LOWORD(lParam),HIWORD(lParam)); // if (gpConEmu->PtDiffTest(pt, ptLastNcClick.x, ptLastNcClick.y, 4)) // { // PostScClose(); // lResult = 0; // return true; // } // } // return false; case WM_MOUSEMOVE: DBGFUNCTION(L"WM_MOUSEMOVE \n"); // Табов чисто в заголовке - нет #if 0 RedrawLock(); if (gpConEmu->mp_TabBar->GetHoverTab() != -1) { gpConEmu->mp_TabBar->HoverTab(-1); } #if defined(USE_CONEMU_TOOLBAR) // Ну и с кнопок убрать подсветку, если была gpConEmu->mp_TabBar->Toolbar_UnHover(); #endif RedrawUnlock(); #endif return false; case WM_NCLBUTTONDBLCLK: if (wParam == HTCAPTION) { mb_NcAnimate = TRUE; } if (wParam == HT_CONEMUTAB) { _ASSERTE(gpSet->isTabsInCaption && "There is not tabs in 'Caption'"); //RedrawLock(); -- чтобы отрисовать "клик" по кнопке lbRc = gpConEmu->mp_TabBar->ProcessNcTabMouseEvent(hWnd, uMsg, wParam, lParam, lResult); //RedrawUnlock(); } else if (gpConEmu->OnMouse_NCBtnDblClk(hWnd, uMsg, wParam, lParam)) { lResult = 0; // DblClick на рамке - ресайз по ширине/высоте рабочей области экрана } else { lResult = DefWindowProc(hWnd, uMsg, wParam, lParam); } if (wParam == HTCAPTION) { mb_NcAnimate = FALSE; } return true; case WM_KEYDOWN: case WM_KEYUP: if (gpSet->isTabSelf && (wParam == VK_TAB || gpConEmu->mp_TabBar->IsInSwitch())) { if (isPressed(VK_CONTROL) && !isPressed(VK_MENU) && !isPressed(VK_LWIN) && !isPressed(VK_RWIN)) { if (gpConEmu->mp_TabBar->ProcessTabKeyboardEvent(hWnd, uMsg, wParam, lParam, lResult)) { return true; } } } return false; //case WM_NCCREATE: gpConEmu->CheckGlassAttribute(); return false; case 0xAE: /*WM_NCUAHDRAWCAPTION*/ lResult = OnDwmMessage(hWnd, uMsg, wParam, lParam); return true; case 0xAF: /*WM_NCUAHDRAWFRAME*/ lResult = OnDwmMessage(hWnd, uMsg, wParam, lParam); return true; case 0x31E: /*WM_DWMCOMPOSITIONCHANGED*/ lResult = OnDwmMessage(hWnd, uMsg, wParam, lParam); return true; case WM_SYSCOMMAND: if (wParam == SC_MAXIMIZE || wParam == SC_MINIMIZE || wParam == SC_RESTORE) { // Win 10 build 9926 bug? if ((wParam == SC_MAXIMIZE) && IsWin10()) { if (!gpConEmu->isMeForeground(false,false)) { return true; } } mb_NcAnimate = TRUE; //GetWindowText(hWnd, ms_LastCaption, countof(ms_LastCaption)); //SetWindowText(hWnd, L""); } lResult = gpConEmu->mp_Menu->OnSysCommand(hWnd, wParam, lParam, WM_SYSCOMMAND); if (wParam == SC_MAXIMIZE || wParam == SC_MINIMIZE || wParam == SC_RESTORE) { mb_NcAnimate = FALSE; //SetWindowText(hWnd, ms_LastCaption); } return true; case WM_GETTEXT: //TODO: Во время анимации Maximize/Restore/Minimize заголовок отрисовывается //TODO: системой, в итоге мелькает текст и срезаются табы //TODO: Сделаем, пока, чтобы текст хотя бы не мелькал... if (mb_NcAnimate && gpSet->isTabsInCaption) { _ASSERTE(!IsWindows7); // Проверить на XP и ниже if (wParam && lParam) { *(wchar_t*)lParam = 0; } lResult = 0; return true; } break; default: break; } return false; }
// Helper function: Notification ‘Debug’ setting page in ConEmu void OnPeekReadConsoleInput(char acPeekRead/*'P'/'R'*/, char acUnicode/*'A'/'W'*/, HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD& nRead) { #ifdef TRAP_ON_MOUSE_0x0 if (lpBuffer && nRead) { for (UINT i = 0; i < nRead; i++) { if (lpBuffer[i].EventType == MOUSE_EVENT) { if (lpBuffer[i].Event.MouseEvent.dwMousePosition.X == 0 && lpBuffer[i].Event.MouseEvent.dwMousePosition.Y == 0) { _ASSERTE(!(lpBuffer[i].Event.MouseEvent.dwMousePosition.X == 0 && lpBuffer[i].Event.MouseEvent.dwMousePosition.Y == 0)); } //if (lpBuffer[i].Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && lpBuffer[i].Event.MouseEvent.dwMousePosition.X != 5) //{ // _ASSERTE(!(lpBuffer[i].Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && lpBuffer[i].Event.MouseEvent.dwMousePosition.X != 5)); //} } } } #endif DWORD nCurrentTID = GetCurrentThreadId(); gReadConsoleInfo.LastReadConsoleInputTID = nCurrentTID; gReadConsoleInfo.hConsoleInput2 = hConsoleInput; if (nRead) { if (!gbWasSucceededInRead) gbWasSucceededInRead = TRUE; // Сброс кешированных значений GetConsoleScreenBufferInfoCached(NULL, NULL); } if (!nRead || !lpBuffer) return; if (gFarMode.bFarHookMode && gFarMode.bMonitorConsoleInput) { CESERVER_REQ *pIn = ExecuteNewCmd(CECMD_PEEKREADINFO, sizeof(CESERVER_REQ_HDR) //-V119 +sizeof(CESERVER_REQ_PEEKREADINFO)+(nRead-1)*sizeof(INPUT_RECORD)); if (pIn) { pIn->PeekReadInfo.nCount = (WORD)nRead; pIn->PeekReadInfo.cPeekRead = acPeekRead; pIn->PeekReadInfo.cUnicode = acUnicode; pIn->PeekReadInfo.h = hConsoleInput; pIn->PeekReadInfo.nTID = nCurrentTID; pIn->PeekReadInfo.nPID = GetCurrentProcessId(); pIn->PeekReadInfo.bMainThread = (pIn->PeekReadInfo.nTID == gnHookMainThreadId); memmove(pIn->PeekReadInfo.Buffer, lpBuffer, nRead*sizeof(INPUT_RECORD)); CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } } // Temp bugfix for unexpected WINDOW_BUFFER_SIZE_EVENT if (gFarMode.bFarHookMode && (acPeekRead == 'R') && IsWin10()) { static WINDOW_BUFFER_SIZE_RECORD last_size = {}; INPUT_RECORD *src = lpBuffer, *dst = lpBuffer, *buf_end = lpBuffer + nRead; while (src < buf_end) { if (src != dst) { *dst = *src; } if (src->EventType != WINDOW_BUFFER_SIZE_EVENT) { ++src; ++dst; continue; } // OK, reported size was changed since last call if (last_size.dwSize != src->Event.WindowBufferSizeEvent.dwSize) { last_size = src->Event.WindowBufferSizeEvent; ++src; ++dst; continue; } // Size was not changed _ASSERTE(nRead > 0); --nRead; ++src; dst->EventType = 0; } } }
void CDwmHelper::InitDwm() { BOOL lbDbg; mh_User32 = GetModuleHandle(L"User32.dll"); //gOSVer.dwOSVersionInfoSize = sizeof(gOSVer); //GetVersionEx(&gOSVer); if (IsWin6()) { user._ChangeWindowMessageFilter = (USER::ChangeWindowMessageFilter_t)GetProcAddress(mh_User32, "ChangeWindowMessageFilter"); if (user._ChangeWindowMessageFilter) { lbDbg = user._ChangeWindowMessageFilter(WM_DWMSENDICONICTHUMBNAIL, MSGFLT_ADD); lbDbg = user._ChangeWindowMessageFilter(WM_DWMSENDICONICLIVEPREVIEWBITMAP, MSGFLT_ADD); UNREFERENCED_PARAMETER(lbDbg); } mh_DwmApi = LoadLibrary(_T("dwmapi.dll")); if (mh_DwmApi) { // Vista+ dwm._DwmIsCompositionEnabled = (DWM::DwmIsCompositionEnabled_t)GetProcAddress(mh_DwmApi, "DwmIsCompositionEnabled"); dwm._DwmSetWindowAttribute = (DWM::DwmSetWindowAttribute_t)GetProcAddress(mh_DwmApi, "DwmSetWindowAttribute"); dwm._DwmGetWindowAttribute = (DWM::DwmGetWindowAttribute_t)GetProcAddress(mh_DwmApi, "DwmGetWindowAttribute"); dwm._DwmExtendFrameIntoClientArea = (DWM::DwmExtendFrameIntoClientArea_t)GetProcAddress(mh_DwmApi, "DwmExtendFrameIntoClientArea"); dwm._DwmDefWindowProc = (DWM::DwmDefWindowProc_t)GetProcAddress(mh_DwmApi, "DwmDefWindowProc"); dwm._DwmSetIconicThumbnail = (DWM::DwmSetIconicThumbnail_t)GetProcAddress(mh_DwmApi, "DwmSetIconicThumbnail"); dwm._DwmSetIconicLivePreviewBitmap = (DWM::DwmSetIconicLivePreviewBitmap_t)GetProcAddress(mh_DwmApi, "DwmSetIconicLivePreviewBitmap"); dwm._DwmInvalidateIconicBitmaps = (DWM::DwmInvalidateIconicBitmaps_t)GetProcAddress(mh_DwmApi, "DwmInvalidateIconicBitmaps"); dwm._DwmEnableBlurBehindWindow = (DWM::DwmEnableBlurBehindWindow_t)GetProcAddress(mh_DwmApi, "DwmEnableBlurBehindWindow"); mb_DwmAllowed = (dwm._DwmIsCompositionEnabled != NULL) && (dwm._DwmGetWindowAttribute != NULL) && (dwm._DwmSetWindowAttribute != NULL) && (dwm._DwmExtendFrameIntoClientArea != NULL) && (dwm._DwmDefWindowProc != NULL); if (mb_DwmAllowed) mb_EnableGlass = true; } } if (gOSVer.dwMajorVersion >= 6 || (gOSVer.dwMajorVersion == 5 && gOSVer.dwMinorVersion >= 1)) { mh_UxTheme = LoadLibrary(_T("UxTheme.dll")); if (mh_UxTheme) { // XP+ ux._IsAppThemed = (UX::AppThemed_t)GetProcAddress(mh_UxTheme, "IsAppThemed"); ux._IsThemeActive = (UX::AppThemed_t)GetProcAddress(mh_UxTheme, "IsThemeActive"); ux._OpenThemeData = (UX::OpenThemeData_t)GetProcAddress(mh_UxTheme, "OpenThemeData"); ux._CloseThemeData = (UX::CloseThemeData_t)GetProcAddress(mh_UxTheme, "CloseThemeData"); ux._DrawThemeBackground = (UX::DrawThemeBackground_t)GetProcAddress(mh_UxTheme, "DrawThemeBackground"); ux._DrawThemeEdge = (UX::DrawThemeEdge_t)GetProcAddress(mh_UxTheme, "DrawThemeEdge"); ux._GetThemeMargins = (UX::GetThemeMargins_t)GetProcAddress(mh_UxTheme, "GetThemeMargins"); ux._GetThemePartSize = (UX::GetThemePartSize_t)GetProcAddress(mh_UxTheme, "GetThemePartSize"); ux._GetThemePosition = (UX::GetThemePosition_t)GetProcAddress(mh_UxTheme, "GetThemePosition"); ux._GetThemeSysSize = (UX::GetThemeSysSize_t)GetProcAddress(mh_UxTheme, "GetThemeSysSize"); ux._GetThemeBackgroundContentRect = (UX::GetThemeBackgroundContentRect_t)GetProcAddress(mh_UxTheme, "GetThemeBackgroundContentRect"); ux._SetThemeAppProperties = (UX::SetThemeAppProperties_t)GetProcAddress(mh_UxTheme, "SetThemeAppProperties"); // Vista+ ux._BufferedPaintInit = (UX::BufferedPaintInit_t)GetProcAddress(mh_UxTheme, "BufferedPaintInit"); ux._BufferedPaintUnInit = (UX::BufferedPaintInit_t)GetProcAddress(mh_UxTheme, "BufferedPaintUnInit"); ux._BeginBufferedPaint = (UX::BeginBufferedPaint_t)GetProcAddress(mh_UxTheme, "BeginBufferedPaint"); ux._BufferedPaintSetAlpha = (UX::BufferedPaintSetAlpha_t)GetProcAddress(mh_UxTheme, "BufferedPaintSetAlpha"); ux._EndBufferedPaint = (UX::EndBufferedPaint_t)GetProcAddress(mh_UxTheme, "EndBufferedPaint"); ux._DrawThemeTextEx = (UX::DrawThemeTextEx_t)GetProcAddress(mh_UxTheme, "DrawThemeTextEx"); ux._SetWindowTheme = (UX::SetWindowTheme_t)GetProcAddress(mh_UxTheme, "SetWindowTheme"); mb_ThemeAllowed = (ux._IsAppThemed != NULL) && (ux._IsThemeActive != NULL); if (mb_ThemeAllowed) { mb_EnableTheming = true; if (ux._BufferedPaintInit && ux._BufferedPaintUnInit) { HRESULT hr = ux._BufferedPaintInit(); mb_BufferedAllowed = SUCCEEDED(hr); } } } } if (IsWin10()) { user._AdjustWindowRectExForDpi = (USER::AdjustWindowRectExForDpi_t)GetProcAddress(mh_User32, "AdjustWindowRectExForDpi"); } }