2016-03-18 14 views
1

Ich versuche, ein kleines Programm einzurichten, um die Monitorhelligkeit an die aktuelle Raumhelligkeit anzupassen.GetMonitorBrightness() stürzt mit Zugriffsverletzung ab

ich die Anweisungen von MSDN gefolgt und diese einrichten:

cout << "Legen Sie das Fenster bitte auf den zu steuernden Monitor.\n"; 
system("PAUSE"); 
HMONITOR hMon = NULL; 
char OldConsoleTitle[1024]; 
char NewConsoleTitle[1024]; 
GetConsoleTitle(OldConsoleTitle, 1024); 
SetConsoleTitle("CMDWindow7355608"); 
Sleep(40); 
HWND hWnd = FindWindow(NULL, "CMDWindow7355608"); 
SetConsoleTitle(OldConsoleTitle); 
hMon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTOPRIMARY); 


DWORD cPhysicalMonitors; 
LPPHYSICAL_MONITOR pPhysicalMonitors = NULL; 
BOOL bSuccess = GetNumberOfPhysicalMonitorsFromHMONITOR(
    hMon, 
    &cPhysicalMonitors 
    ); 

if(bSuccess) 
{ 
    pPhysicalMonitors = (LPPHYSICAL_MONITOR)malloc(
     cPhysicalMonitors* sizeof(PHYSICAL_MONITOR)); 

    if(pPhysicalMonitors!=NULL) 
    { 
     LPDWORD min = NULL, max = NULL, current = NULL; 
     GetPhysicalMonitorsFromHMONITOR(hMon, cPhysicalMonitors, pPhysicalMonitors); 

     HANDLE pmh = pPhysicalMonitors[0].hPhysicalMonitor; 

     if(!GetMonitorBrightness(pmh, min, current, max)) 
     { 
      cout << "Fehler: " << GetLastError() << endl; 
      system("PAUSE"); 
      return 0; 
     } 

     //cout << "Minimum: " << min << endl << "Aktuell: " << current << endl << "Maximum: " << max << endl; 

     system("PAUSE"); 
    } 

} 

Aber das Problem: jedes Mal wenn ich versuche GetMonitorBrightness() stürzt das Programm mit Access Violation while writing at Position 0x00000000 (I aus dem Deutschen übersetzt diesen Fehler) zu verwenden

Beim Debugging habe ich gesehen, dass pPhysicalMonitors tatsächlich den Monitor enthält, den ich verwenden möchte, aber pPhysicalMonitors[0].hPhysicalMonitor enthält nur 0x0000000. Könnte das ein Teil des Problems sein?

Antwort

2

jedes Mal wenn ich versuche GetMonitorBrightness() zu verwenden, das Programm mit Zugriffsverletzung abstürzt, während bei Position Schreiben 0x00000000 (I übersetzte diesen Fehler aus Deutsch)

Sie passieren NULL-Zeiger auf GetMonitorBrightness(), so stürzt wenn versucht wird, seine Ausgabewerte in ungültigen Speicher zu schreiben.

Genau wie GetNumberOfPhysicalMonitorsFromHMONITOR(), GetMonitorBrightness() erwartet Sie die Adresse der tatsächlichen Variablen übergeben, zB:

DWORD min, max, current; 
if (!GetMonitorBrightness(pmh, &min, &current, &max)) 

Während zu debuggen versuchen, ich sah, dass pPhysicalMonitors enthält tatsächlich den Monitor ich verwenden möchte, aber pPhysicalMonitors [ 0] .hPhysicalMonitor enthält nur 0x0000000. Könnte das ein Teil des Problems sein?

Nein, aber Sie überprüfen nicht sicher zu stellen, dass cPhysicalMonitors> 0 ist, und Sie ignorieren den Rückgabewert von GetPhysicalMonitorsFromHMONITOR() sicherzustellen, dass es tatsächlich mit Daten, die die PHYSICAL_MONITOR Array wird bevölkern.

+0

Vielen Dank, das DWORD und Adressen behoben. – DoktorMerlin