I am working with screen sharing project.I am capturing desktop screen using below function.it works fine. But whenever secure desktop prompting for elevation.it returns black/empty image.
But when i turn off secured desktop from local security policy.It works fine.
Is there any way to capture secure desktop without disabling Local Security Policy.
static Bitmap CaptureDesktop()
{
SIZE size;
Bitmap printscreen = null;
size.cx = Win32Stuff.GetSystemMetrics
(Win32Stuff.SM_CXSCREEN);
size.cy = Win32Stuff.GetSystemMetrics
(Win32Stuff.SM_CYSCREEN);
int width = size.cx; int height = size.cy;
IntPtr hWnd = Win32Stuff.GetDesktopWindow();
IntPtr hDC = Win32Stuff.GetDC(hWnd);
if (hDC != IntPtr.Zero)
{
IntPtr hMemDC = GDIStuff.CreateCompatibleDC(hDC);
if (hMemDC != IntPtr.Zero)
{
IntPtr m_HBitmap = GDIStuff.CreateCompatibleBitmap(hDC, width, height);
if (m_HBitmap != IntPtr.Zero)
{
IntPtr hOld = (IntPtr)GDIStuff.SelectObject(hMemDC, m_HBitmap);
GDIStuff.BitBlt(hMemDC, 0, 0, width, height, hDC, 0, 0, GDIStuff.SRCCOPY);
GDIStuff.SelectObject(hMemDC, hOld);
GDIStuff.DeleteDC(hMemDC);
printscreen = System.Drawing.Image.FromHbitmap(m_HBitmap);
GDIStuff.DeleteObject(m_HBitmap);
}
}
}
Win32Stuff.ReleaseDC(hWnd, hDC);
return printscreen;
}
Edit:
In order to get the screen contents of the Secure Desktop, your application needs to fulfill some special criteria:
To test it, you could e.g. use the SysInternals PsExec tool to run your application in that mode:
PsExec /h /x /d /s "path_to\your_application.exe"
The /x
and /s
switches are important: they run the process under the SYSTEM account and on the Winlogon desktop.
If you want to avoid using third-party tools, you need to create your own Windows service which will perform the screen captures of the Secure Desktop.
There is no source code of PsExec
available, but you can look at the PAExec
tool's source code - it's an open source alternative.