DC C ++ Windows的句柄

时间:2014-10-14 12:07:02

标签: c++ windows handles hdc

我想单独获取每个物理屏幕的像素,但是MSDN说GetDC需要一个窗口来知道要获取句柄的屏幕。有没有办法告诉它在不使用窗口或鼠标的情况下使用哪个句柄?

所以我可以调用EnumDisplayDevices并按照建议的循环来查找连接了多少个监视器以及每个监视器的信息:问题是我使用的是Microsoft提供的代码:

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

使用此代码时,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 个答案:

答案 0 :(得分:1)

这是在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");