]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - Ventoy2Disk/Ventoy2Disk/AlertSuppress.c
Suppress some prompt window when install Ventoy.
[Ventoy.git] / Ventoy2Disk / Ventoy2Disk / AlertSuppress.c
index 00037ac5f51ae1a460ee48fd396866c08db4f35b..333d6bd03934a090a275a90d6ad62d030185168b 100644 (file)
@@ -73,7 +73,12 @@ static __inline wchar_t* utf8_to_wchar(const char* str)
        return wstr;\r
 }\r
 \r
-static char title_str[2][128], button_str[128];\r
+static char g_FormatDiskTitle[256];\r
+static char g_FormatDiskButton[256];\r
+\r
+static char g_LocNotAvaliableTitle[256]; //Location is not available\r
+static char g_InsertDiskTitle[256]; // Insert disk\r
+\r
 static char system_dir[MAX_PATH], sysnative_dir[MAX_PATH];\r
 \r
 static HWINEVENTHOOK ap_weh = NULL;\r
@@ -236,6 +241,96 @@ static __inline HMODULE LoadLibraryU(LPCSTR lpFileName)
        return ret;\r
 }\r
 \r
+#pragma pack(1)\r
+typedef struct {\r
+       WORD      dlgVer;\r
+       WORD      signature;\r
+       DWORD     helpID;\r
+       DWORD     exStyle;\r
+       DWORD     style;\r
+       WORD      cDlgItems;\r
+       short     x;\r
+       short     y;\r
+       short     cx;\r
+       short     cy;\r
+       //sz_Or_Ord menu;\r
+       //sz_Or_Ord windowClass;\r
+       //WCHAR     title[titleLen];\r
+       //WORD      pointsize;\r
+       //WORD      weight;\r
+       //BYTE      italic;\r
+       //BYTE      charset;\r
+       //WCHAR     typeface[stringLen];\r
+} DLGTEMPLATEEX;\r
+#pragma pack()\r
+\r
+static BOOL LoadDialogCaption(HMODULE hMui, DWORD ID, CHAR* title, DWORD len)\r
+{\r
+       BOOL bRet = FALSE;\r
+       int WordNum = 0;\r
+       HRSRC hDlg = NULL;\r
+       DLGTEMPLATEEX* pDlgTempEx = NULL;\r
+       HGLOBAL hTemplate = NULL;\r
+       WORD* pWordData = NULL;\r
+\r
+       hDlg = FindResource(hMui, MAKEINTRESOURCE(1024), RT_DIALOG);\r
+       if (hDlg)\r
+       {\r
+               hTemplate = LoadResource(hMui, hDlg);\r
+               if (hTemplate)\r
+               {\r
+                       pDlgTempEx = (DLGTEMPLATEEX*)LockResource(hTemplate);\r
+                       if (pDlgTempEx)\r
+                       {\r
+                               if (pDlgTempEx->signature != 0xFFFF)\r
+                               {\r
+                                       return FALSE;\r
+                               }\r
+\r
+                               pWordData = (WORD *)(pDlgTempEx + 1);\r
+                               \r
+                               //skip menu\r
+                               if (*pWordData == 0x0000)\r
+                               {\r
+                                       pWordData += 1;\r
+                               }\r
+                               else if (*pWordData == 0xFFFF)\r
+                               {\r
+                                       pWordData += 2;\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (*pWordData++)\r
+                                       {\r
+                                               ;\r
+                                       }\r
+                               }\r
+\r
+                               //skip windowClass\r
+                               if (*pWordData == 0x0000)\r
+                               {\r
+                                       pWordData += 1;\r
+                               }\r
+                               else if (*pWordData == 0xFFFF)\r
+                               {\r
+                                       pWordData += 2;\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (*pWordData++)\r
+                                       {\r
+                                               ;\r
+                                       }\r
+                               }\r
+\r
+                               wchar_to_utf8_no_alloc(pWordData, title, len);\r
+                               bRet = TRUE;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return bRet;\r
+}\r
 \r
 BOOL SetAlertPromptMessages(void)\r
 {\r
@@ -270,26 +365,42 @@ BOOL SetAlertPromptMessages(void)
        hMui = LoadLibraryU(mui_path);\r
        if (hMui)\r
        {\r
-               // 4097 = "You need to format the disk in drive %c: before you can use it." (dialog text)\r
-               // 4125 = "Microsoft Windows" (dialog title)\r
-               // 4126 = "Format disk" (button)\r
-               if (LoadStringU(hMui, 4125, title_str[0], sizeof(title_str[0])) <= 0) {\r
-                       static_strcpy(title_str[0], "Microsoft Windows");\r
-                       Log("Warning: Could not locate localized format prompt title string in '%s': %u", mui_path, LASTERR);\r
-               }\r
-               if (LoadStringU(hMui, 4126, button_str, sizeof(button_str)) <= 0) {\r
-                       static_strcpy(button_str, "Format disk");\r
-                       Log("Warning: Could not locate localized format prompt button string in '%s': %u", mui_path, LASTERR);\r
-               }\r
-               FreeLibrary(hMui);\r
-\r
                Log("LoadLibrary shell32.dll.mui SUCCESS");\r
        }\r
        else\r
        {\r
                Log("LoadLibrary shell32.dll.mui FAILED");\r
+               return FALSE;\r
        }\r
 \r
+\r
+       // String Table:\r
+       // 4097 = "You need to format the disk in drive %c: before you can use it." (dialog text)\r
+       // 4125 = "Microsoft Windows" (dialog title)\r
+       // 4126 = "Format disk" (button)\r
+       if (LoadStringU(hMui, 4125, g_FormatDiskTitle, sizeof(g_FormatDiskTitle)) <= 0) {\r
+               static_strcpy(g_FormatDiskTitle, "Microsoft Windows");\r
+               Log("Warning: Could not locate localized format prompt title string in '%s': %u", mui_path, LASTERR);\r
+       }\r
+\r
+       if (LoadStringU(hMui, 4126, g_FormatDiskButton, sizeof(g_FormatDiskButton)) <= 0) {\r
+               static_strcpy(g_FormatDiskButton, "Format disk");\r
+               Log("Warning: Could not locate localized format prompt button string in '%s': %u", mui_path, LASTERR);\r
+       }\r
+\r
+       // 32964 = "Location is not available"\r
+       if (LoadStringU(hMui, 32964, g_LocNotAvaliableTitle, sizeof(g_LocNotAvaliableTitle)) <= 0) {\r
+               static_strcpy(g_LocNotAvaliableTitle, "Location is not available");\r
+               Log("Warning: Could not locate localized format prompt title string in '%s': %u", mui_path, LASTERR);\r
+       }\r
+\r
+       if (!LoadDialogCaption(hMui, 1024, g_InsertDiskTitle, sizeof(g_InsertDiskTitle)))\r
+       {\r
+               static_strcpy(g_InsertDiskTitle, "Insert disk");\r
+               Log("Warning: Could not locate insert disk title string in '%s': %u", mui_path, LASTERR);\r
+       }\r
+\r
+       FreeLibrary(hMui);\r
        return TRUE;\r
 }\r
 \r
@@ -336,29 +447,59 @@ static BOOL CALLBACK AlertPromptCallback(HWND hWnd, LPARAM lParam)
 \r
        if (GetWindowTextU(hWnd, str, sizeof(str)) == 0)\r
                return TRUE;\r
-       if (strcmp(str, button_str) == 0)\r
+       if (strcmp(str, g_FormatDiskButton) == 0)\r
                *found = TRUE;\r
        return TRUE;\r
 }\r
 \r
+static volatile BOOL g_AlertPromptHookEnable = FALSE;\r
+\r
+void SetAlertPromptHookEnable(BOOL enable)\r
+{\r
+       g_AlertPromptHookEnable = enable;\r
+}\r
+\r
 static void CALLBACK AlertPromptHook(HWINEVENTHOOK hWinEventHook, DWORD Event, HWND hWnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)\r
 {\r
        char str[128];\r
        BOOL found;\r
 \r
-       if (Event == EVENT_SYSTEM_FOREGROUND) {\r
-               if (GetWindowLongPtr(hWnd, GWL_STYLE) & WS_POPUPWINDOW) {\r
-                       str[0] = 0;\r
-                       GetWindowTextU(hWnd, str, sizeof(str));\r
-                       if (strcmp(str, title_str[0]) == 0) {\r
-                               found = FALSE;\r
-                               EnumChildWindows(hWnd, AlertPromptCallback, (LPARAM)&found);\r
-                               if (found) {\r
-                                       SendMessage(hWnd, WM_COMMAND, (WPARAM)IDCANCEL, (LPARAM)0);\r
-                                       Log("###### Closed Windows format prompt #######");\r
-                               }\r
+       if (Event != EVENT_SYSTEM_FOREGROUND)\r
+       {\r
+               return;\r
+       }\r
+\r
+       if (!g_AlertPromptHookEnable)\r
+       {\r
+               return;\r
+       }\r
+\r
+       //GetWindowTextU(hWnd, str, sizeof(str));\r
+       //Log("###### EVENT_SYSTEM_FOREGROUND Windows prompt <%s> #######", str);\r
+\r
+       if (GetWindowLongPtr(hWnd, GWL_STYLE) & WS_POPUPWINDOW) {\r
+               str[0] = 0;\r
+               GetWindowTextU(hWnd, str, sizeof(str));\r
+               if (strcmp(str, g_FormatDiskTitle) == 0)\r
+               {\r
+                       found = FALSE;\r
+                       EnumChildWindows(hWnd, AlertPromptCallback, (LPARAM)&found);\r
+                       if (found)\r
+                       {\r
+                               SendMessage(hWnd, WM_COMMAND, (WPARAM)IDCANCEL, (LPARAM)0);\r
+                               Log("###### Detect 'Windows format' prompt, now close it. #######");\r
                        }\r
                }\r
+               else if (strcmp(str, g_LocNotAvaliableTitle) == 0)\r
+               {\r
+                       SendMessage(hWnd, WM_COMMAND, (WPARAM)IDCANCEL, (LPARAM)0);\r
+                       Log("###### Detect 'Location is not available' prompt, now close it. #######");\r
+               }\r
+               else if (strcmp(str, g_InsertDiskTitle) == 0)\r
+               {\r
+                       SendMessage(hWnd, WM_COMMAND, (WPARAM)IDCANCEL, (LPARAM)0);\r
+                       Log("###### Detect 'Insert disk' prompt, now close it. #######");\r
+               }\r
        }\r
 }\r
 \r