Winapi 屏幕截图算法在Win10中给出了空白区域-在所有其他Windows版本中工作良好

Winapi 屏幕截图算法在Win10中给出了空白区域-在所有其他Windows版本中工作良好,winapi,Winapi,我使用以下方法拍摄了所有监视器的屏幕截图。它可以完美地工作,但我刚刚升级到Windows10,我发现了一个主要问题。我得到了空白/透明区域 使用PrtScn的常规屏幕截图: 使用我的算法: 我的算法细节 我的算法是从Firefox调用的,5秒后截图。在截图时,记事本++是焦点 EnumDisplayDevices CreateDC使用从步骤1获得的lpszDriver和lpszDevice CreateCompatibleDC根据步骤2的结果 CreateDIBSection关于步骤2的结果 选

我使用以下方法拍摄了所有监视器的屏幕截图。它可以完美地工作,但我刚刚升级到Windows10,我发现了一个主要问题。我得到了空白/透明区域

使用
PrtScn
的常规屏幕截图:

使用我的算法:

我的算法细节 我的算法是从Firefox调用的,5秒后截图。在截图时,记事本++是焦点

  • EnumDisplayDevices
  • CreateDC
    使用从步骤1获得的
    lpszDriver
    lpszDevice
  • CreateCompatibleDC
    根据步骤2的结果
  • CreateDIBSection
    关于步骤2的结果
  • 选择Object
    步骤2的结果到步骤4的结果
  • BitBlt
  • 下面是我的代码中的WinAPI调用,它位于js ctypes中:

    ostypes.API('EnumDisplayDevices')(null, iDevNum, lpDisplayDevice.address(), 0);
    var hdcScreen = ostypes.API('CreateDC')(collMonInfos[s].otherInfo.lpszDriver, collMonInfos[s].otherInfo.lpszDevice, null, null);
    var hdcMemoryDC = ostypes.API('CreateCompatibleDC')(hdcScreen); 
    var hbmp = ostypes.API('CreateDIBSection')(hdcScreen, bmi.address(), ostypes.CONST.DIB_RGB_COLORS, pixelBuffer.address(), null, 0);
    var rez_SO = ostypes.API('SelectObject')(hdcMemoryDC, hbmp);
    var rez_BB = ostypes.API('BitBlt')(hdcMemoryDC, 0, 0, w, h, hdcScreen, 0, 0, ostypes.CONST.SRCCOPY);
    // i then draw pixelBuffer to a html5 canvas
    

    还有其他人经历过这些空白吗?有人知道解决方案吗?

    当你从普通应用程序而不是Firefox中执行此操作时会发生什么感谢@DavidHeffernan的快速回复,我已经昏倒了,时间是凌晨5点:p我不知道如何从普通应用程序执行此操作。你能告诉我如何才能尝试吗?你只需要从C++程序中调用同样的函数。哦,我没有C或C++环境,但我会下载VS2013并更新你。我认为在没有本地工具的情况下做这些事情是愚蠢的