From d848d5e74aee56f454311756dc2032fad26d79ad Mon Sep 17 00:00:00 2001 From: Jiayang Liu Date: Thu, 16 Jul 2015 08:49:38 -0700 Subject: [PATCH] Enable cropping window capturing for Win7 when Aero is disabled. BUG=webrtc:496110 R=sergeyu@chromium.org Review URL: https://codereview.webrtc.org/1199073002 . Cr-Commit-Position: refs/heads/master@{#9595} --- .../cropping_window_capturer_win.cc | 4 ++- .../win/window_capture_utils.cc | 23 ++++++++++++++ .../win/window_capture_utils.h | 15 +++++++++ .../desktop_capture/window_capturer_win.cc | 31 ++----------------- 4 files changed, 44 insertions(+), 29 deletions(-) diff --git a/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc b/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc index deffe665ee..73a2aa9d6e 100644 --- a/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc +++ b/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc @@ -119,10 +119,12 @@ class CroppingWindowCapturerWin : public CroppingWindowCapturer { // The region from GetWindowRgn in the desktop coordinate if the region is // rectangular, or the rect from GetWindowRect if the region is not set. DesktopRect window_region_rect_; + + AeroChecker aero_checker_; }; bool CroppingWindowCapturerWin::ShouldUseScreenCapturer() { - if (!rtc::IsWindows8OrLater()) + if (!rtc::IsWindows8OrLater() && aero_checker_.IsAeroEnabled()) return false; // Check if the window is a translucent layered window. diff --git a/webrtc/modules/desktop_capture/win/window_capture_utils.cc b/webrtc/modules/desktop_capture/win/window_capture_utils.cc index bfe7363f32..83922ea7f8 100644 --- a/webrtc/modules/desktop_capture/win/window_capture_utils.cc +++ b/webrtc/modules/desktop_capture/win/window_capture_utils.cc @@ -43,4 +43,27 @@ GetCroppedWindowRect(HWND window, return true; } +AeroChecker::AeroChecker() : dwmapi_library_(nullptr), func_(nullptr) { + // Try to load dwmapi.dll dynamically since it is not available on XP. + dwmapi_library_ = LoadLibrary(L"dwmapi.dll"); + if (dwmapi_library_) { + func_ = reinterpret_cast( + GetProcAddress(dwmapi_library_, "DwmIsCompositionEnabled")); + } +} + +AeroChecker::~AeroChecker() { + if (dwmapi_library_) { + FreeLibrary(dwmapi_library_); + } +} + +bool AeroChecker::IsAeroEnabled() { + BOOL result = FALSE; + if (func_) { + func_(&result); + } + return result != FALSE; +} + } // namespace webrtc diff --git a/webrtc/modules/desktop_capture/win/window_capture_utils.h b/webrtc/modules/desktop_capture/win/window_capture_utils.h index 2a3a470c59..aa89c12a9a 100644 --- a/webrtc/modules/desktop_capture/win/window_capture_utils.h +++ b/webrtc/modules/desktop_capture/win/window_capture_utils.h @@ -22,4 +22,19 @@ bool GetCroppedWindowRect(HWND window, DesktopRect* cropped_rect, DesktopRect* original_rect); +typedef HRESULT (WINAPI *DwmIsCompositionEnabledFunc)(BOOL* enabled); +class AeroChecker { + public: + AeroChecker(); + ~AeroChecker(); + + bool IsAeroEnabled(); + + private: + HMODULE dwmapi_library_; + DwmIsCompositionEnabledFunc func_; + + DISALLOW_COPY_AND_ASSIGN(AeroChecker); +}; + } // namespace webrtc diff --git a/webrtc/modules/desktop_capture/window_capturer_win.cc b/webrtc/modules/desktop_capture/window_capturer_win.cc index c7e1fd879c..3d96881969 100644 --- a/webrtc/modules/desktop_capture/window_capturer_win.cc +++ b/webrtc/modules/desktop_capture/window_capturer_win.cc @@ -22,8 +22,6 @@ namespace webrtc { namespace { -typedef HRESULT (WINAPI *DwmIsCompositionEnabledFunc)(BOOL* enabled); - BOOL CALLBACK WindowsEnumerationHandler(HWND hwnd, LPARAM param) { WindowCapturer::WindowList* list = reinterpret_cast(param); @@ -81,48 +79,25 @@ class WindowCapturerWin : public WindowCapturer { void Capture(const DesktopRegion& region) override; private: - bool IsAeroEnabled(); - Callback* callback_; // HWND and HDC for the currently selected window or NULL if window is not // selected. HWND window_; - // dwmapi.dll is used to determine if desktop compositing is enabled. - HMODULE dwmapi_library_; - DwmIsCompositionEnabledFunc is_composition_enabled_func_; - DesktopSize previous_size_; + AeroChecker aero_checker_; + DISALLOW_COPY_AND_ASSIGN(WindowCapturerWin); }; WindowCapturerWin::WindowCapturerWin() : callback_(NULL), window_(NULL) { - // Try to load dwmapi.dll dynamically since it is not available on XP. - dwmapi_library_ = LoadLibrary(L"dwmapi.dll"); - if (dwmapi_library_) { - is_composition_enabled_func_ = - reinterpret_cast( - GetProcAddress(dwmapi_library_, "DwmIsCompositionEnabled")); - assert(is_composition_enabled_func_); - } else { - is_composition_enabled_func_ = NULL; - } } WindowCapturerWin::~WindowCapturerWin() { - if (dwmapi_library_) - FreeLibrary(dwmapi_library_); -} - -bool WindowCapturerWin::IsAeroEnabled() { - BOOL result = FALSE; - if (is_composition_enabled_func_) - is_composition_enabled_func_(&result); - return result != FALSE; } bool WindowCapturerWin::GetWindowList(WindowList* windows) { @@ -228,7 +203,7 @@ void WindowCapturerWin::Capture(const DesktopRegion& region) { // capturing - it somehow affects what we get from BitBlt() on the subsequent // captures. - if (!IsAeroEnabled() || !previous_size_.equals(frame->size())) { + if (!aero_checker_.IsAeroEnabled() || !previous_size_.equals(frame->size())) { result = PrintWindow(window_, mem_dc, 0); }