return TRUE;
}
-static BOOL CALLBACK
-EnumWindowsProc(HWND hwnd, LPARAM lParam)
+static HWND GetNiceRootOwner(HWND hwnd)
{
HWND hwndOwner;
- WCHAR szClass[64];
+ DWORD ExStyle, OwnerExStyle;
+
+ for (;;)
+ {
+ // A window with WS_EX_APPWINDOW is treated as if it has no owner
+ ExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
+ if (ExStyle & WS_EX_APPWINDOW)
+ break;
+
+ // Is the owner visible?
+ // An window with WS_EX_TOOLWINDOW is treated as if it weren't visible
+ hwndOwner = GetWindow(hwnd, GW_OWNER);
+ OwnerExStyle = GetWindowLong(hwndOwner, GWL_EXSTYLE);
+ if (!IsWindowVisible(hwndOwner) || (OwnerExStyle & WS_EX_TOOLWINDOW))
+ break;
+
+ hwnd = hwndOwner;
+ }
+
+ return hwnd;
+}
+
+// c.f. http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx
+BOOL IsAltTabWindow(HWND hwnd)
+{
DWORD ExStyle;
+ RECT rc;
+ HWND hwndTry, hwndWalk;
+ WCHAR szClass[64];
+ // must be visible
if (!IsWindowVisible(hwnd))
- return TRUE;
+ return FALSE;
+
+ // must not be WS_EX_TOOLWINDOW
+ ExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
+ if (ExStyle & WS_EX_TOOLWINDOW)
+ return FALSE;
+
+ // must be not empty rect
+ GetWindowRect(hwnd, &rc);
+ if (IsRectEmpty(&rc))
+ return FALSE;
// check special windows
if (!GetClassNameW(hwnd, szClass, _countof(szClass)) ||
return TRUE;
}
- ExStyle = GetWindowLongPtrW(hwnd, GWL_EXSTYLE);
- if (ExStyle & WS_EX_TOOLWINDOW)
- return TRUE;
+ // get 'nice' root owner
+ hwndWalk = GetNiceRootOwner(hwnd);
+
+ // walk back from hwndWalk toward hwnd
+ for (;;)
+ {
+ hwndTry = GetLastActivePopup(hwndWalk);
+ if (hwndTry == hwndWalk)
+ break;
+
+ ExStyle = GetWindowLong(hwndTry, GWL_EXSTYLE);
+ if (IsWindowVisible(hwndTry) && !(ExStyle & WS_EX_TOOLWINDOW))
+ break;
+
+ hwndWalk = hwndTry;
+ }
+
+ return hwnd == hwndTry; // Reached?
+}
- hwndOwner = GetWindow(hwnd, GW_OWNER);
- if (!IsWindowVisible(hwndOwner) || (ExStyle & WS_EX_APPWINDOW))
+static BOOL CALLBACK
+EnumWindowsProc(HWND hwnd, LPARAM lParam)
+{
+ if (IsAltTabWindow(hwnd))
{
if (!EnumerateCallback(hwnd, lParam))
return FALSE;
}
-
return TRUE;
}