Index: webrtc/modules/desktop_capture/cropping_window_capturer_win.cc |
diff --git a/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc b/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc |
index e14efe609c39698e9cfc9f51eb98926adbbca301..2585014478752c2e002a187460e3bc88ef32532d 100644 |
--- a/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc |
+++ b/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc |
@@ -23,17 +23,20 @@ namespace { |
// Used to pass input/output data during the EnumWindow call for verifying if |
// the selected window is on top. |
struct TopWindowVerifierContext { |
- TopWindowVerifierContext(HWND selected_window, HWND excluded_window) |
+ TopWindowVerifierContext(HWND selected_window, |
+ HWND excluded_window, |
+ DesktopRect selected_window_rect) |
: selected_window(selected_window), |
excluded_window(excluded_window), |
- is_top_window(false), |
- selected_window_process_id(0) {} |
+ selected_window_rect(selected_window_rect), |
+ is_top_window(false) { |
+ RTC_DCHECK_NE(selected_window, excluded_window); |
+ } |
- HWND selected_window; |
- HWND excluded_window; |
+ const HWND selected_window; |
+ const HWND excluded_window; |
+ const DesktopRect selected_window_rect; |
bool is_top_window; |
- DWORD selected_window_process_id; |
- DesktopRect selected_window_rect; |
}; |
// The function is called during EnumWindow for every window enumerated and is |
@@ -70,13 +73,12 @@ BOOL CALLBACK TopWindowVerifier(HWND hwnd, LPARAM param) { |
WCHAR window_title[kTitleLength]; |
GetWindowText(hwnd, window_title, kTitleLength); |
if (wcsnlen_s(window_title, kTitleLength) == 0) { |
- DWORD enumerated_process; |
- GetWindowThreadProcessId(hwnd, &enumerated_process); |
- if (!context->selected_window_process_id) { |
- GetWindowThreadProcessId(context->selected_window, |
- &context->selected_window_process_id); |
- } |
- if (context->selected_window_process_id == enumerated_process) { |
+ DWORD enumerated_window_process_id; |
+ DWORD selected_window_process_id; |
+ GetWindowThreadProcessId(hwnd, &enumerated_window_process_id); |
+ GetWindowThreadProcessId(context->selected_window, |
+ &selected_window_process_id); |
+ if (selected_window_process_id == enumerated_window_process_id) { |
return TRUE; |
} |
} |
@@ -127,8 +129,13 @@ bool CroppingWindowCapturerWin::ShouldUseScreenCapturer() { |
if (!rtc::IsWindows8OrLater() && aero_checker_.IsAeroEnabled()) |
return false; |
- // Check if the window is a translucent layered window. |
HWND selected = reinterpret_cast<HWND>(selected_window()); |
+ // Check if the window is hidden or minimized. |
+ if (IsIconic(selected) || !IsWindowVisible(selected)) { |
+ return false; |
+ } |
+ |
+ // Check if the window is a translucent layered window. |
LONG window_ex_style = GetWindowLong(selected, GWL_EXSTYLE); |
if (window_ex_style & WS_EX_LAYERED) { |
COLORREF color_ref_key = 0; |
@@ -148,18 +155,13 @@ bool CroppingWindowCapturerWin::ShouldUseScreenCapturer() { |
return false; |
} |
- TopWindowVerifierContext context( |
- selected, reinterpret_cast<HWND>(excluded_window())); |
- |
RECT selected_window_rect; |
if (!GetWindowRect(selected, &selected_window_rect)) { |
return false; |
} |
- context.selected_window_rect = DesktopRect::MakeLTRB( |
- selected_window_rect.left, |
- selected_window_rect.top, |
- selected_window_rect.right, |
- selected_window_rect.bottom); |
+ window_region_rect_ = DesktopRect::MakeLTRB( |
+ selected_window_rect.left, selected_window_rect.top, |
+ selected_window_rect.right, selected_window_rect.bottom); |
// Get the window region and check if it is rectangular. |
win::ScopedGDIObject<HRGN, win::DeleteObjectTraits<HRGN> > |
@@ -178,17 +180,17 @@ bool CroppingWindowCapturerWin::ShouldUseScreenCapturer() { |
region_rect.top, |
region_rect.right, |
region_rect.bottom); |
- rgn_rect.Translate(context.selected_window_rect.left(), |
- context.selected_window_rect.top()); |
- context.selected_window_rect.IntersectWith(rgn_rect); |
+ rgn_rect.Translate(window_region_rect_.left(), window_region_rect_.top()); |
+ window_region_rect_.IntersectWith(rgn_rect); |
} |
- window_region_rect_ = context.selected_window_rect; |
// Check if the window is occluded by any other window, excluding the child |
// windows, context menus, and |excluded_window_|. |
// TODO(zijiehe): EnumWindows enumerates root window only, so the window may |
// be covered by its own child window. See bug |
// https://bugs.chromium.org/p/webrtc/issues/detail?id=8062 |
+ TopWindowVerifierContext context( |
+ selected, reinterpret_cast<HWND>(excluded_window()), window_region_rect_); |
EnumWindows(&TopWindowVerifier, reinterpret_cast<LPARAM>(&context)); |
return context.is_top_window; |
} |