2014-10-14 8 views
0

모든 물리적 화면의 픽셀을 개별적으로 가져오고 싶지만 MSDN에서는 GetDC에 핸들을 가져올 화면을 알 필요가 있다고합니다. 창이나 마우스를 사용하지 않고 어떤 핸들을 사용할지 알려주는 방법이 있습니까?DC C++ Windows 핸들 Windows

그래서 EnumDisplayDevices를 호출 할 수 있습니다 및 제안 루프로를 통해 연결되어 얼마나 많은 모니터를 찾기 위해 각각의 정보 :이 코드를 사용하여

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

: 문제는 내가 Microsoft에서 제공하는 코드를 사용하고있다 그것은 ++ 코드를 포팅 EnumDisplayDevices 전화

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; 
} 
+1

을 처리하는 것입니다. 그리고 당신은 확실히 런타임 연결을 사용할 필요가 없습니다. –

+1

내가 물어볼 수도 있습니다 : 왜 수동으로 Windows 라이브러리를 처음으로로드합니까? 그걸 동적으로 링크 할 수 있기 때문에 완전히 불필요합니다. 모든 LOAD/EXEC는 Windows에서 처리 할 수 ​​있습니다 ... – specializt

+0

왜냐하면 저는 매우 새롭고 내가하는 일을 정말로 모르기 때문입니다. 내가 찾을 수있는 것을 스스로 가르친다. 당신이 저를 주제에 대한 정보로 인도 할 수 있다면, 나는 매우 감사 할 것입니다. –

답변

1

이 C에 있기 때문에 C의 KB117428으로 처리했다 "함수 호출에 너무 많은 인수"에 오류가 있습니다 (즉, 그 코드는 원래 C로 작성되었습니다).

제안 된 솔루션은 제대로`user32.dll`이 사는 곳이 아니다 그 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");