[USER32] Fix Task Switcher (#976)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Thu, 25 Oct 2018 13:59:44 +0000 (22:59 +0900)
committerGitHub <noreply@github.com>
Thu, 25 Oct 2018 13:59:44 +0000 (22:59 +0900)
This fix is needed for the Delphi GUI programs.
- Don't enumerate the windows whose owner window exists.
- Use PostMessage SC_RESTORE instead of ShowWindowAsync SW_RESTORE.
CORE-15165

win32ss/user/user32/controls/appswitch.c

index c776008..c2898b9 100644 (file)
@@ -125,7 +125,7 @@ void ResizeAndCenter(HWND hwnd, int width, int height)
 void MakeWindowActive(HWND hwnd)
 {
    if (IsIconic(hwnd))
-      ShowWindowAsync(hwnd, SW_RESTORE);
+      PostMessageW(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
 
    BringWindowToTop(hwnd);  // same as: SetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); ?
    SetForegroundWindow(hwnd);
@@ -171,6 +171,9 @@ BOOL CALLBACK EnumerateCallback(HWND window, LPARAM lParam)
    if (!IsWindowVisible(window))
             return TRUE;
 
+   if (GetWindow(window, GW_OWNER) != NULL)
+       return TRUE;
+
    GetClassNameW(window, windowText, _countof(windowText));
    if ((wcscmp(L"Shell_TrayWnd", windowText)==0) ||
        (wcscmp(L"Progman", windowText)==0) )