2016-11-23 4 views
0

Ich habe versucht, die Helligkeit des primären Monitors zu erhalten mit dem folgenden Code:Winapi C++ versuchen primäre Helligkeit des Monitors zu bekommen

POINT monitorPoint = { 0, 0 }; 
    HANDLE monitor = MonitorFromPoint(monitorPoint, MONITOR_DEFAULTTOPRIMARY); 

    DWORD minb, maxb, currb; 
    if (GetMonitorBrightness(monitor, &minb, &currb, &maxb) == FALSE) { 
     std::cout << GetLastError() << std::endl; 
    } 

Aber es scheitert und GetLastError() kehrt 87 die Invalid Parameter bedeutet.

EDIT: habe ich es geschafft, diese zu lösen EnumDisplayMonitors() und GetPhysicalMonitorsFromHMONITOR() wie folgt aus:

std::vector<HANDLE> pMonitors; 

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { 

    DWORD npm; 
    GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &npm); 
    PHYSICAL_MONITOR *pPhysicalMonitorArray = new PHYSICAL_MONITOR[npm]; 

    GetPhysicalMonitorsFromHMONITOR(hMonitor, npm, pPhysicalMonitorArray); 

    for (unsigned int j = 0; j < npm; ++j) { 
     pMonitors.push_back(pPhysicalMonitorArray[j].hPhysicalMonitor); 
    } 

    delete pPhysicalMonitorArray; 

    return TRUE; 
} 

// and later inside main simply: 
EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, NULL); 

// and when I need to change the brightness: 
for (unsigned int i = 0; i < pMonitors.size(); ++i) { 
    SetMonitorBrightness(pMonitors.at(i), newValue); 
} 

Jetzt treffe ich 2 neue Probleme:

1) Von EnumDisplayMonitors() I 2 Monitor erhalten Griffe, da ich 2 Monitore. Das Problem ist, dass nur mein Hauptwerk funktioniert. Jedes Mal, wenn ich so etwas mit dem sekundären Monitor versuchen, bekomme ich diesen Fehler:

0xC0262582: ERROR_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA

2) Nach der Verwendung von SetMonitorBrightness() seit einiger Zeit auch für den primären Monitor es nicht mehr funktioniert und ich erhalte die folgenden Fehler:

0xC026258D

+0

Haben Sie bestätigen, dass 'monitor' ist nicht' NULL' oder 'INVALID_HANDLE_VALUE'? – selbie

+0

Haben Sie GetMonitorCapabilities aufgerufen, um zu bestätigen, dass das Flag MC_CAPS_BRIGHTNESS verfügbar ist? – selbie

+0

'MonitorFromPoint()' gibt einen 'HMONITOR' zurück, kein' HANDLE'. Ihr Code konnte nicht kompiliert werden, wenn Sie mit 'STRICT' kompiliert wurden. –

Antwort

2

Sie übergeben eine HMONITOR an die Funktion. Die Dokumentation besagt jedoch, dass stattdessen ein Handle zu einem physischen Monitor erforderlich ist, und schlägt vor, dass Sie GetPhysicalMonitorsFromHMONITOR() aufrufen, um es zu erhalten. In der Tat, da MonitorFromPoint() einen HMONITOR zurückgibt, wäre Ihr Code nicht mit STRICT aktiviert kompiliert worden, eine Praxis, die hilft, solche Fehler zu verwurzeln.

Sie sollten die Fehlerprüfung für den Anruf an MonitorFromPoint() einschließen. Und die Dokumentation schlägt auch vor, dass Sie GetMonitorCapabilities() unter der Übergabe von MC_CAPS_BRIGHTNESS aufrufen sollten, um sicherzustellen, dass der Monitor Helligkeitsanforderungen unterstützt.

Bitte beachten Sie die Dokumentation von GetMonitorBrightness() für weitere Einzelheiten:

+0

'GetMonitorCapabilities()' gibt den Fehler 'ERROR_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE' zurück, was bedeutet, dass mein Problem die' HANDLE monitor = MonitorFromPoint (...) 'Zeile ist. Kannst du mir ein Beispiel geben, wie man 'GetPhysicalMonitorsFromHMONITOR' benutzt, um einen Griff zum Monitor zu bekommen? – DimChtz

+1

Haben Sie das Beispiel in der Dokumentation ['GetPhysicalMonitorsFromHMONITOR()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd692950.aspx) gesehen? Der einzige Unterschied ist, dass 'MonitorFromWindow()' anstelle von 'MonitorFromPoint()' verwendet wird, aber das ist in Ihrem Beispiel nicht wirklich wichtig. –

+0

@ Remy Ich habe es endlich geschafft zu arbeiten. Jetzt habe ich ein anderes Problem. Ich benutze 'SetMonitorBrightness()' in einer While-Schleife, nachdem ich einige Messungen von Arduino (serielle Kommunikation) erhalten habe. Es funktioniert für einige Minuten, aber nach einiger Zeit 'SetMonitorBrightness() 'scheitert mit Fehlercode' 3223725453', der> 15999 ist und ich kann nicht finden, was es bedeutet. – DimChtz

Verwandte Themen