See the question and my original answer on StackOverflow

IDXGIOutputDuplication::AcquireNextFrame will receive nothing if nothing changes on the captured output.

It's not like a "PleaseCaptureScreenNow" command.

Timouts are expected and must taken into account. That's why you can't really design a workflow for example like capture => convert => copy/encode on just one unique thread.

Microsoft official DXGIDesktopDuplication sample is designed with multiple threads for that reason.

This method can perfectly capture at 100fps or more if the screen changes at that speed (and you have good GPU, drivers, etc.).