[TASKMGR] Avoid freezing in getting icons (#4180)

- Modify the timeout value of SendMessageTimeout.
- Use SMTO_ABORTIFHUNG flag.
- Check if the window alive.
CORE-17894
This commit is contained in:
Katayama Hirofumi MZ 2021-12-24 16:08:07 +09:00 committed by GitHub
parent 4ed752e2c5
commit 1c82bf0324
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -353,6 +353,7 @@ BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
WCHAR szText[260];
BOOL bLargeIcon;
BOOL bHung = FALSE;
LRESULT bAlive;
typedef int (FAR __stdcall *IsHungAppWindowProc)(HWND);
IsHungAppWindowProc IsHungAppWindow;
@ -377,20 +378,26 @@ BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
noApps = FALSE;
#define GET_ICON(type) \
SendMessageTimeoutW(hWnd, WM_GETICON, (type), 0, SMTO_ABORTIFHUNG, 100, (PDWORD_PTR)&hIcon)
/* Get the icon for this window */
hIcon = NULL;
SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_BIG : ICON_SMALL, 0, 0, 1000, (PDWORD_PTR)&hIcon);
bAlive = GET_ICON(bLargeIcon ? ICON_BIG : ICON_SMALL);
if (!hIcon)
{
/* We failed, try to retrieve other icons... */
hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICON : GCL_HICONSM);
if (!hIcon) hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICONSM : GCL_HICON);
if (!hIcon) SendMessageTimeoutW(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)&hIcon);
if (!hIcon) SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_SMALL : ICON_BIG, 0, 0, 1000, (PDWORD_PTR)&hIcon);
if (!hIcon && bAlive)
GET_ICON(bLargeIcon ? ICON_SMALL : ICON_BIG);
if (!hIcon)
hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICON : GCL_HICONSM);
if (!hIcon)
hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICONSM : GCL_HICON);
/* If we still do not have any icon, load the default one */
if (!hIcon) hIcon = LoadIconW(hInst, bLargeIcon ? MAKEINTRESOURCEW(IDI_WINDOW) : MAKEINTRESOURCEW(IDI_WINDOWSM));
}
#undef GET_ICON
bHung = FALSE;