package funkin.backend.utils.native; #if windows import funkin.backend.utils.NativeAPI.FileAttribute; import funkin.backend.utils.NativeAPI.MessageBoxIcon; @:buildXml(' ') // majority is taken from Microsoft's doc @:cppFileCode(' #include "mmdeviceapi.h" #include "combaseapi.h" #include #include #include #include #include #include #include #include #include #include ') @:dox(hide) final class Windows { @:functionCode(' int darkMode = enable ? 1 : 0; HWND window = FindWindowA(NULL, title.c_str()); // Look for child windows if top level is not found if (window == NULL) window = FindWindowExA(GetActiveWindow(), NULL, NULL, title.c_str()); // If still not found, try to get the active window if (window == NULL) window = GetActiveWindow(); if (window == NULL) return; if (S_OK != DwmSetWindowAttribute(window, 19, &darkMode, sizeof(darkMode))) { DwmSetWindowAttribute(window, 20, &darkMode, sizeof(darkMode)); } UpdateWindow(window); ') public static function setDarkMode(title:String, enable:Bool) {} @:functionCode(' HWND window = FindWindowA(NULL, title.c_str()); if (window == NULL) window = FindWindowExA(GetActiveWindow(), NULL, NULL, title.c_str()); if (window == NULL) window = GetActiveWindow(); if (window == NULL) return; COLORREF finalColor; if(color[0] == -1 && color[1] == -1 && color[2] == -1 && color[3] == -1) { // bad fix, I know :sob: finalColor = 0xFFFFFFFF; // Default border } else if(color[3] == 0) { finalColor = 0xFFFFFFFE; // No border (must have setBorder as true) } else { finalColor = RGB(color[0], color[1], color[2]); // Use your custom color } if(setHeader) DwmSetWindowAttribute(window, 35, &finalColor, sizeof(COLORREF)); if(setBorder) DwmSetWindowAttribute(window, 34, &finalColor, sizeof(COLORREF)); UpdateWindow(window); ') public static function setWindowBorderColor(title:String, color:Array, setHeader:Bool = true, setBorder:Bool = true) {} @:functionCode(' HWND window = FindWindowA(NULL, title.c_str()); if (window == NULL) window = FindWindowExA(GetActiveWindow(), NULL, NULL, title.c_str()); if (window == NULL) window = GetActiveWindow(); if (window == NULL) return; COLORREF finalColor; if(color[0] == -1 && color[1] == -1 && color[2] == -1 && color[3] == -1) { // bad fix, I know :sob: finalColor = 0xFFFFFFFF; // Default border } else { finalColor = RGB(color[0], color[1], color[2]); // Use your custom color } DwmSetWindowAttribute(window, 36, &finalColor, sizeof(COLORREF)); UpdateWindow(window); ') public static function setWindowTitleColor(title:String, color:Array) {} @:functionCode(' HWND window = GetConsoleWindow(); HICON smallIcon = (HICON) LoadImage(NULL, path, IMAGE_ICON, 16, 16, LR_LOADFROMFILE); HICON icon = (HICON) LoadImage(NULL, path, IMAGE_ICON, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); SendMessage(window, WM_SETICON, ICON_SMALL, (LPARAM)smallIcon); SendMessage(window, WM_SETICON, ICON_BIG, (LPARAM)icon); ') public static function setWindowIcon(path:String) {} @:functionCode(' // https://stackoverflow.com/questions/15543571/allocconsole-not-displaying-cout if (!AllocConsole()) return; freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); SetConsoleOutputCP(65001); SetConsoleCP(65001); ') public static function allocConsole() { } @:functionCode(' return GetFileAttributes(path); ') public static function getFileAttributes(path:String):FileAttribute { return NORMAL; } @:functionCode(' return SetFileAttributes(path, attrib); ') public static function setFileAttributes(path:String, attrib:FileAttribute):Int { return 0; } @:functionCode(' HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(console, color); ') public static function setConsoleColors(color:Int) { } @:functionCode(' system("CLS"); std::cout<< "" <