La forma en que lo estás haciendo es muy básica. Lamentablemente si la cámara no ofrece una API es muy díficil hacerlo de otra manera.
Windows normalmente no pinta las ventanas o regiones de venta que no son visibles al usuario. Esto es para ahorrar recursos. Es por eso que no puedes obtener la imagen si la ventana no está activa.
Existen varias alternativas que puedes probar. La más fácil es enviar el mensaje WM_PAINT al control del explorador con el handle de tu BMO dónde quieres la imágen. Pero esto no está garantizado que funcione. Depende de la implementación interna del mensaje WM_PAINT.
Otra alternativa es utilizar la API de Desktop Window Manager (DWM). Pero la solución solo funciona en Windows Vista y posterior cre que necesitas Aero activado.
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Una solución más extraña y no estoy completamente seguro si funciona es utilizar los escritorios virtuales de Windows. Muchos desarrolladores desconocen que Windows ofrece escritorios virtuales. No tan potentes como los ofrecidos en los entornos Linux. Pero pueden ser suficientes para que obtengas una solución.
Lamentablemente los escritorios virtuales tienen muchas limitaciones de seguridad. No recuerdo todos los detalles porque fue hace un buen tiempo que trabajé con ellos.
En resumen, has la siguiente prueba.
Crea un escritorio virtual
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Crea tu venta o envíala al nuevo escritorio virtual.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Talvez necesites crear dos ejectuables para implementar SetThreadDesktop. El segundo ejecutable se creará en el segundo escritorio, tomará una el ScreenShot y lo guardará.
Al final, no te olvides de cerrar el escritorio virtual.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Saludos.