Handle of DC C++ Windows

Handle of DC C++ Windows

本文关键字:Windows C++ DC of Handle      更新时间:2023-10-16

我想单独获得每个物理屏幕的像素,但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:\windowsUser32.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;
}

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