Windows屏幕捕获GDI和;DirectX失败返回访问被拒绝
我根据操作系统分别使用DirectX和GDI在Windows上捕获屏幕(DirectX(桌面复制)-适用于Win8及以上版本,GDI适用于Win7及以下版本,或作为DirectX方法出现任何错误时的备用方法) 在一些机器上,我很少在winlogon屏幕上同时获得GDI和DirectX返回访问拒绝错误 正在检测并正确设置桌面交换机&应用程序正在以提升的用户权限运行,在桌面设置期间没有错误。捕获屏幕的同一线程正在调用将当前桌面设置为当前线程的函数。应用程序未在任何RDP会话上运行,如前面提到的问题& 我做了很多分析和研究。我确实查阅了开源截屏应用程序的源代码,但没有发现任何有用的东西。在这个问题上,我已经花了一个星期没有任何进展 下面是设置当前桌面的代码Windows屏幕捕获GDI和;DirectX失败返回访问被拒绝,windows,visual-c++,directx,screen-capture,desktop-duplication,Windows,Visual C++,Directx,Screen Capture,Desktop Duplication,我根据操作系统分别使用DirectX和GDI在Windows上捕获屏幕(DirectX(桌面复制)-适用于Win8及以上版本,GDI适用于Win7及以下版本,或作为DirectX方法出现任何错误时的备用方法) 在一些机器上,我很少在winlogon屏幕上同时获得GDI和DirectX返回访问拒绝错误 正在检测并正确设置桌面交换机&应用程序正在以提升的用户权限运行,在桌面设置期间没有错误。捕获屏幕的同一线程正在调用将当前桌面设置为当前线程的函数。应用程序未在任何RDP会话上运行,如前面提到的问题&
if (GetCurrentDesktop(aCurrentDesktop) && _tcscmp(aCurrentDesktop, aPrevDesktop) != 0)
{
ScreenCaptureUtils::SetProcessWindowStation();
HDESK hcurrentInputDesktop = OpenInputDesktop(0, FALSE, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE);
if(hcurrentInputDesktop != NULL)
{
if(!SetThreadDesktop(hcurrentInputDesktop))
{
errorCode = GetLastError();
LOG << _T("setCurrentInputDesktop: SetThreadDesktop failed. Error code: ") << errorCode;
}
else
{
errorCode = ERROR_SUCCESS;
_tcscpy_s (aPrevDesktop, MAX_PATH, aCurrentDesktop);
LOG << _T("setCurrentInputDesktop: SetThreadDesktop succeeded.");
}
hPrevDesk = hcurrentInputDesktop;
CloseDesktop(hcurrentInputDesktop);
}
else
{
errorCode = GetLastError();
LOG << _T("setCurrentInputDesktop: OpenInputDesktop failed. Error code: ") << errorCode;
}
}
else
{
LOG << _T("setCurrentInputDesktop: OpenInputDesktop failed. Error code: ") << errorCode;
}
bool GetCurrentDesktop ( TCHAR * desktopName )
{
{
HDESK hDesktop = ::OpenInputDesktop(0, FALSE, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE);
if (!hDesktop)
{
return false;
}
DWORD dw = 0;
TCHAR szName[MAX_PATH];
::memset(szName, 0, sizeof(szName));
if (!::GetUserObjectInformation(hDesktop, UOI_NAME, &szName, sizeof(szName), &dw))
{
::CloseDesktop(hDesktop);
return false;
}
_tcscpy(desktopName, szName);
::CloseDesktop(hDesktop);
}
}
我正在用当前监视器的名称调用GetDC。这与以NULL作为参数调用GetDC有关吗?。但这看起来不像是一个问题
任何帮助都将不胜感激。提前谢谢
int screenCapture()
{
int result = -1;
int width = 1000;
int height = 700;
HDC hdcTemp, hdc;
BYTE* bitPointer;
hdc = GetDC(HWND_DESKTOP);
if (hdc != NULL)
{
hdcTemp = CreateCompatibleDC(hdc);
if (hdcTemp != NULL)
{
BITMAPINFO bitmap;
bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = width;
bitmap.bmiHeader.biHeight = -height;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 24;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 0;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;
HBITMAP hBitmap = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)&bitPointer, NULL, NULL);
if (hBitmap != NULL)
{
HBITMAP hPrevBitmap = SelectObject(hdcTemp, hBitmap);
BitBlt(hdcTemp, 0, 0, width, height, hdc, 0, 0, SRCCOPY);
result = (int) bitPointer[0];
SelectObject(hdcTemp, hPrevBitmap);
DeleteObject(hBitmap);
}
DeleteDC(hdcTemp);
}
ReleaseDC(HWND_DESKTOP, hdc);
}
return result;
}