winapi — C ++: обратный вызов EnumDisplayMonitors внутри класса

У меня проблема с обратными вызовами EnumDisplayMonitors. Я хочу узнать количество экранов и разрешение каждого экрана. Кажется, что он работает с использованием этого кода.

#include <windows.h>
#include <iostream>
#include <vector>

#pragma comment(lib, "user32.lib")

std::vector< std::vector<int> > screenVector;
int screenCounter = 0;

BOOL CALLBACK MonitorEnumProcCallback(  _In_  HMONITOR hMonitor,
_In_  HDC hdcMonitor,
_In_  LPRECT lprcMonitor,
_In_  LPARAM dwData ) {
screenCounter++;

MONITORINFO  info;
info.cbSize =  sizeof(MONITORINFO);

BOOL monitorInfo = GetMonitorInfo(hMonitor,&info);

if( monitorInfo ) {
std::vector<int> currentScreenVector;
currentScreenVector.push_back( screenCounter );
currentScreenVector.push_back( abs(info.rcMonitor.left - info.rcMonitor.right) );
currentScreenVector.push_back( abs(info.rcMonitor.top - info.rcMonitor.bottom) );
std::cout   << "Monitor "<< currentScreenVector.at(0)
<< " -> x: "<< currentScreenVector.at(1)
<< " y: "<< currentScreenVector.at(2)
<< "\n";
}

return TRUE;
}

int main() {
BOOL b = EnumDisplayMonitors(NULL,NULL,MonitorEnumProcCallback,0);
system("PAUSE");
return 0;
}

Но когда я перенес все в свою фактическую базу кода и содержал внутри класса, он возвращает ошибку. Я не знаю, правильно ли я это делаю.
-> Вот фрагмент:

ScreenManager::ScreenManager() {
BOOL monitorInitialized = EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(this) );
}

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

reinterpret_cast<ScreenManager*>(dwData)->callback(hMonitor,hdcMonitor,lprcMonitor);
return true;
}

bool ScreenManager::callback(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor){

screenCounter++;

MONITORINFO  info;
info.cbSize =  sizeof(MONITORINFO);

BOOL monitorInfo = GetMonitorInfo(hMonitor,&info);

if( monitorInfo ) {
std::vector<int> currentScreenVector;
currentScreenVector.push_back( screenCounter );
currentScreenVector.push_back( abs(info.rcMonitor.left - info.rcMonitor.right) );
currentScreenVector.push_back( abs(info.rcMonitor.top - info.rcMonitor.bottom) );

}

return true;
}

0

Решение

Я просто решил свою проблему, изменив функцию обратного вызова на public.

0

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


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