tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

window_capture_utils.h (5871B)


      1 /*
      2 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #ifndef MODULES_DESKTOP_CAPTURE_WIN_WINDOW_CAPTURE_UTILS_H_
     12 #define MODULES_DESKTOP_CAPTURE_WIN_WINDOW_CAPTURE_UTILS_H_
     13 
     14 #include <shlobj.h>
     15 #include <windows.h>
     16 #include <wrl/client.h>
     17 
     18 #include "modules/desktop_capture/desktop_capturer.h"
     19 #include "modules/desktop_capture/desktop_geometry.h"
     20 
     21 namespace webrtc {
     22 
     23 // Outputs the window rect. The returned DesktopRect is in system coordinates,
     24 // i.e. the primary monitor on the system always starts from (0, 0). This
     25 // function returns false if native APIs fail.
     26 bool GetWindowRect(HWND window, DesktopRect* result);
     27 
     28 // Outputs the window rect, with the left/right/bottom frame border cropped if
     29 // the window is maximized or has a transparent resize border.
     30 // `avoid_cropping_border` may be set to true to avoid cropping the visible
     31 // border when cropping any resize border.
     32 // `cropped_rect` is the cropped rect relative to the
     33 // desktop. `original_rect` is the original rect returned from GetWindowRect.
     34 // Returns true if all API calls succeeded. The returned DesktopRect is in
     35 // system coordinates, i.e. the primary monitor on the system always starts from
     36 // (0, 0). `original_rect` can be nullptr.
     37 //
     38 // TODO(zijiehe): Move this function to CroppingWindowCapturerWin after it has
     39 // been removed from MouseCursorMonitorWin.
     40 // This function should only be used by CroppingWindowCapturerWin. Instead a
     41 // DesktopRect CropWindowRect(const DesktopRect& rect)
     42 // should be added as a utility function to help CroppingWindowCapturerWin and
     43 // WindowCapturerWinGdi to crop out the borders or shadow according to their
     44 // scenarios. But this function is too generic and easy to be misused.
     45 bool GetCroppedWindowRect(HWND window,
     46                          bool avoid_cropping_border,
     47                          DesktopRect* cropped_rect,
     48                          DesktopRect* original_rect);
     49 
     50 // Retrieves the rectangle of the content area of `window`. Usually it contains
     51 // title bar and window client area, but borders or shadow are excluded. The
     52 // returned DesktopRect is in system coordinates, i.e. the primary monitor on
     53 // the system always starts from (0, 0). This function returns false if native
     54 // APIs fail.
     55 bool GetWindowContentRect(HWND window, DesktopRect* result);
     56 
     57 // Returns the region type of the `window` and fill `rect` with the region of
     58 // `window` if region type is SIMPLEREGION.
     59 int GetWindowRegionTypeWithBoundary(HWND window, DesktopRect* result);
     60 
     61 // Retrieves the size of the `hdc`. This function returns false if native APIs
     62 // fail.
     63 bool GetDcSize(HDC hdc, DesktopSize* size);
     64 
     65 // Retrieves whether the `window` is maximized and stores in `result`. This
     66 // function returns false if native APIs fail.
     67 bool IsWindowMaximized(HWND window, bool* result);
     68 
     69 // Checks that the HWND is for a valid window, that window's visibility state is
     70 // visible, and that it is not minimized.
     71 bool IsWindowValidAndVisible(HWND window);
     72 
     73 // Checks if a window responds to a message within 50ms.
     74 bool IsWindowResponding(HWND window);
     75 
     76 enum GetWindowListFlags {
     77  kNone = 0x00,
     78  kIgnoreUntitled = 1 << 0,
     79  kIgnoreUnresponsive = 1 << 1,
     80  kIgnoreCurrentProcessWindows = 1 << 2,
     81 };
     82 
     83 // Retrieves the list of top-level windows on the screen.
     84 // Some windows will be ignored:
     85 // - Those that are invisible or minimized.
     86 // - Program Manager & Start menu.
     87 // - [with kIgnoreUntitled] windows with no title.
     88 // - [with kIgnoreUnresponsive] windows that are unresponsive.
     89 // - [with kIgnoreCurrentProcessWindows] windows owned by the current process.
     90 // - Any windows with extended styles that match `ex_style_filters`.
     91 // Returns false if native APIs failed.
     92 bool GetWindowList(int flags,
     93                   DesktopCapturer::SourceList* windows,
     94                   LONG ex_style_filters = 0);
     95 
     96 typedef HRESULT(WINAPI* DwmIsCompositionEnabledFunc)(BOOL* enabled);
     97 typedef HRESULT(WINAPI* DwmGetWindowAttributeFunc)(HWND hwnd,
     98                                                   DWORD flag,
     99                                                   PVOID result_ptr,
    100                                                   DWORD result_size);
    101 class WindowCaptureHelperWin {
    102 public:
    103  WindowCaptureHelperWin();
    104  ~WindowCaptureHelperWin();
    105 
    106  WindowCaptureHelperWin(const WindowCaptureHelperWin&) = delete;
    107  WindowCaptureHelperWin& operator=(const WindowCaptureHelperWin&) = delete;
    108 
    109  bool IsAeroEnabled();
    110  bool IsWindowChromeNotification(HWND hwnd);
    111  bool AreWindowsOverlapping(HWND hwnd,
    112                             HWND selected_hwnd,
    113                             const DesktopRect& selected_window_rect);
    114  bool IsWindowOnCurrentDesktop(HWND hwnd);
    115  bool IsWindowVisibleOnCurrentDesktop(HWND hwnd);
    116  bool IsWindowCloaked(HWND hwnd);
    117 
    118  // The optional `ex_style_filters` parameter allows callers to provide
    119  // extended window styles (e.g. WS_EX_TOOLWINDOW) and prevent windows that
    120  // match from being included in `results`.
    121  bool EnumerateCapturableWindows(DesktopCapturer::SourceList* results,
    122                                  bool enumerate_current_process_windows,
    123                                  LONG ex_style_filters = 0);
    124 
    125 private:
    126  HMODULE dwmapi_library_ = nullptr;
    127  DwmIsCompositionEnabledFunc func_ = nullptr;
    128  DwmGetWindowAttributeFunc dwm_get_window_attribute_func_ = nullptr;
    129 
    130  // Only used on Win10+.
    131  Microsoft::WRL::ComPtr<IVirtualDesktopManager> virtual_desktop_manager_;
    132 };
    133 
    134 }  // namespace webrtc
    135 
    136 #endif  // MODULES_DESKTOP_CAPTURE_WIN_WINDOW_CAPTURE_UTILS_H_