Я пытаюсь настроить небольшую программу для настройки яркости монитора в соответствии с текущей яркостью комнаты.
Я следовал инструкциям 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. Может ли это быть частью проблемы?
каждый раз, когда я пытаюсь использовать GetMonitorBrightness (), происходит сбой программы с нарушением прав доступа при записи в позиции 0x00000000 (я перевел эту ошибку с немецкого)
Вы передаете нулевые указатели GetMonitorBrightness()
, поэтому он вылетает при попытке записать свои выходные значения в недопустимую память.
Как GetNumberOfPhysicalMonitorsFromHMONITOR()
, GetMonitorBrightness()
ожидает, что вы передадите адрес фактических переменных, например:
DWORD min, max, current;
if (!GetMonitorBrightness(pmh, &min, ¤t, &max))
При попытке отладки я увидел, что pPhysicalMonitors на самом деле содержит монитор, который я хочу использовать, но pPhysicalMonitors [0] .hPhysicalMonitor содержит только 0x0000000. Может ли это быть частью проблемы?
Нет. Однако вы не проверяете, чтобы убедиться, что cPhysicalMonitors
> 0, и вы игнорируете возвращаемое значение GetPhysicalMonitorsFromHMONITOR()
чтобы убедиться, что это на самом деле заполнение PHYSICAL_MONITOR
массив с данными.
Других решений пока нет …