简体   繁体   中英

Use Magnification API to capture sub screen failed on Windows10

Magnification API can work well when used to capture primary screen, but when i use it to capture sub screen,after MagSetWindowSource() called, MagSetImageScalingCallback() not triggerd.

I checked the window position is set correctly, in my computer is {-1080, -250, 0, 1670}, and i showed the window, it placed on the right position.

I use the following code to get sub screenshot, just same with the webrtc code, but MagSetImageScalingCallback() not triggerd.

// Create the host window.
host_window_ = CreateWindowExW(WS_EX_LAYERED, kMagnifierHostClass, 
                                 kHostWindowName, 0, 0,
                                 0, 0, 0, nullptr, nullptr, hInstance, nullptr);

// Create the magnifier control.
magnifier_window_ = CreateWindowW(kMagnifierWindowClass, 
                                  kMagnifierWindowName,
                                  WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
                                  host_window_, nullptr, hInstance, nullptr);

BOOL result = SetWindowPos(magnifier_window_, NULL, rect.left(), rect.top(),
                             rect.width(), rect.height(), 0);

// value is -1080, -250, 0, 1670
RECT native_rect = {rect.left(), rect.top(), rect.right(), rect.bottom()};

result = set_window_source_func_(magnifier_window_, native_rect);

In the documentation of the MagSetImageScalingCallback, which can be found here , it specifies a few things to take into account:

  • " This function requires Windows Display Driver Model (WDDM)-capable video cards. " You might want to check if the other screen is running via a different videocard, maybe the driver isn't WDDM capable.
  • " This function works only when Desktop Window Manager (DWM) is off. " I'm not sure how much of this statement is true, but as of Windows 8 DWM can no longer be programmatically disabled. You might come into some border cases, I do not think the documentation of this API is kept up to date with all the quicks it might have.

One very important note, you might want to look for a different solution, as this is specified in the documentation: " The MagSetImageScalingCallback function is deprecated in Windows 7 and later, and should not be used in new applications. There is no alternate functionality. "

Is there any specific reason why you want to use this Windows API, maybe an alternative is a better choice? I am quite familiar with making screenshots, but I'm more of a C# guy, but some c++ examples that look usable can be found here . The GDI way pretty much describes what I use in Greenshot , and this works without any big issues.

PS If my information doesn't help, you might want to extend your question with more information on your setup, like Windows version, is it 32/64 bit, is your application 32/64 bit, graphics card, screens etc.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM