mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[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:
parent
4ed752e2c5
commit
1c82bf0324
1 changed files with 12 additions and 5 deletions
|
@ -353,6 +353,7 @@ BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
|
||||||
WCHAR szText[260];
|
WCHAR szText[260];
|
||||||
BOOL bLargeIcon;
|
BOOL bLargeIcon;
|
||||||
BOOL bHung = FALSE;
|
BOOL bHung = FALSE;
|
||||||
|
LRESULT bAlive;
|
||||||
|
|
||||||
typedef int (FAR __stdcall *IsHungAppWindowProc)(HWND);
|
typedef int (FAR __stdcall *IsHungAppWindowProc)(HWND);
|
||||||
IsHungAppWindowProc IsHungAppWindow;
|
IsHungAppWindowProc IsHungAppWindow;
|
||||||
|
@ -377,20 +378,26 @@ BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
|
||||||
|
|
||||||
noApps = FALSE;
|
noApps = FALSE;
|
||||||
|
|
||||||
|
#define GET_ICON(type) \
|
||||||
|
SendMessageTimeoutW(hWnd, WM_GETICON, (type), 0, SMTO_ABORTIFHUNG, 100, (PDWORD_PTR)&hIcon)
|
||||||
|
|
||||||
/* Get the icon for this window */
|
/* Get the icon for this window */
|
||||||
hIcon = NULL;
|
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)
|
if (!hIcon)
|
||||||
{
|
{
|
||||||
/* We failed, try to retrieve other icons... */
|
/* We failed, try to retrieve other icons... */
|
||||||
hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICON : GCL_HICONSM);
|
if (!hIcon && bAlive)
|
||||||
if (!hIcon) hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICONSM : GCL_HICON);
|
GET_ICON(bLargeIcon ? ICON_SMALL : ICON_BIG);
|
||||||
if (!hIcon) SendMessageTimeoutW(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)&hIcon);
|
if (!hIcon)
|
||||||
if (!hIcon) SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_SMALL : ICON_BIG, 0, 0, 1000, (PDWORD_PTR)&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 we still do not have any icon, load the default one */
|
||||||
if (!hIcon) hIcon = LoadIconW(hInst, bLargeIcon ? MAKEINTRESOURCEW(IDI_WINDOW) : MAKEINTRESOURCEW(IDI_WINDOWSM));
|
if (!hIcon) hIcon = LoadIconW(hInst, bLargeIcon ? MAKEINTRESOURCEW(IDI_WINDOW) : MAKEINTRESOURCEW(IDI_WINDOWSM));
|
||||||
}
|
}
|
||||||
|
#undef GET_ICON
|
||||||
|
|
||||||
bHung = FALSE;
|
bHung = FALSE;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue