GetMonitorBrightness () падает с нарушением прав доступа

Я пытаюсь настроить небольшую программу для настройки яркости монитора в соответствии с текущей яркостью комнаты.

Я следовал инструкциям MSDN и настроил это:

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");
}

}

Но проблема: каждый раз, когда я пытаюсь использовать GetMonitorBrightness (), программа вылетает с Access Violation while writing at Position 0x00000000 (Я перевёл эту ошибку с немецкого)

При попытке отладки я увидел, что pPhysicalMonitors на самом деле содержит монитор, который я хочу использовать, но pPhysicalMonitors[0].hPhysicalMonitor содержит только 0x0000000. Может ли это быть частью проблемы?

1

Решение

каждый раз, когда я пытаюсь использовать GetMonitorBrightness (), происходит сбой программы с нарушением прав доступа при записи в позиции 0x00000000 (я перевел эту ошибку с немецкого)

Вы передаете нулевые указатели GetMonitorBrightness(), поэтому он вылетает при попытке записать свои выходные значения в недопустимую память.

Как GetNumberOfPhysicalMonitorsFromHMONITOR(), GetMonitorBrightness() ожидает, что вы передадите адрес фактических переменных, например:

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

При попытке отладки я увидел, что pPhysicalMonitors на самом деле содержит монитор, который я хочу использовать, но pPhysicalMonitors [0] .hPhysicalMonitor содержит только 0x0000000. Может ли это быть частью проблемы?

Нет. Однако вы не проверяете, чтобы убедиться, что cPhysicalMonitors > 0, и вы игнорируете возвращаемое значение GetPhysicalMonitorsFromHMONITOR() чтобы убедиться, что это на самом деле заполнение PHYSICAL_MONITOR массив с данными.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]