Ручка DC C ++ для Windows

Я хочу получить пиксели каждого физического экрана отдельно, но MSDN говорит GetDC нужно окно, чтобы знать, какой экран получить ручку. Есть ли способ сказать, какой дескриптор использовать без использования окна или мыши?

Так что я могу позвонить EnumDisplayDevices и в соответствии с предложенным циклом найдите количество подключенных мониторов и информацию о каждом из них: Проблема в том, что я использую код, предоставленный Microsoft:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd144942(v=vs.85).aspx

Используя этот код, он имеет ошибки на EnumDisplayDevices call «Слишком много аргументов в вызове функции»

BOOL GetDisplayMonitorInfo(int nDeviceIndex, LPSTR lpszMonitorInfo)
{
FARPROC EnumDisplayDevices;
HINSTANCE  hInstUser32;
DISPLAY_DEVICE DispDev;
char szSaveDeviceName[33];
BOOL bRet = TRUE;
HRESULT hr;

hInstUser32 = LoadLibrary("c:\\windows\User32.DLL");
if (!hInstUser32) return FALSE;

EnumDisplayDevices = (FARPROC)GetProcAddress(hInstUser32, "EnumDisplayDevicesA");
if (!EnumDisplayDevices) {
FreeLibrary(hInstUser32);
return FALSE;
}

ZeroMemory(&DispDev, sizeof(DispDev));
DispDev.cb = sizeof(DispDev);
if (EnumDisplayDevices(NULL, nDeviceIndex, &DispDev, 0))
{
hr = StringCchCopy(szSaveDeviceName, 33, DispDev.DeviceName);
if (FAILED(hr))
{
}
EnumDisplayDevices(szSaveDeviceName, 0, &DispDev, 0);
hr = StringCchCopy(lpszMonitorInfo, 129, DispDev.DeviceString);
if (FAILED(hr))
{
// TODO: write error handler
}

}
else    {
bRet = FALSE;
}

FreeLibrary(hInstUser32);

return bRet;
}

0

Решение

Это было обработано в KB117428 из-за переноса кода с C на C ++ (то есть этот код изначально был написан на C).

Предлагаемое решение заключается в правильной обработке typedefs

typedef BOOL (WINAPI *EDDType)(LPCSTR,DWORD,PDISPLAY_DEVICEA,DWORD);

BOOL GetDisplayMonitorInfo(int nDeviceIndex, LPSTR lpszMonitorInfo)
{
EDDType EnumDisplayDevices;
HINSTANCE  hInstUser32;
DISPLAY_DEVICE DispDev;
char szSaveDeviceName[33];
BOOL bRet = TRUE;
HRESULT hr;

hInstUser32 = LoadLibrary("c:\\windows\\User32.DLL"); // You forgot the double backslash
if (!hInstUser32) return FALSE;

EnumDisplayDevices = (EDDType)GetProcAddress(hInstUser32, "EnumDisplayDevicesA");
1

Другие решения


По вопросам рекламы [email protected]