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}
This commit is contained in:
@ -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.
|
||||
|
@ -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<DwmIsCompositionEnabledFunc>(
|
||||
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
|
||||
|
@ -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
|
||||
|
@ -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<WindowCapturer::WindowList*>(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<DwmIsCompositionEnabledFunc>(
|
||||
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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user