2017-03-01 3 views
0

zu platzieren. Also habe ich durch das Internet nach Hinweisen gesucht, wie man das macht, aber ich kann nicht scheinen, es richtig zu machen. Ich habe standardmäßig ein Dual-Monitor-Setup und möchte "Monitor 2" auswählen, damit ich ein Fenster dort im Vollbildmodus anzeigen kann, wenn ein Benutzer eine Taste im Programm drückt.Erhalte den Handler eines bestimmten Monitors, um ein Popup-Fenster in

Soweit ich verstanden habe brauche ich den Handler des angegebenen Monitors als ersten Schritt, mein Ansatz ist EnumDisplayMonitors nach msdn aufrufen "Um Informationen über alle Bildschirm Monitore abrufen, verwenden Sie Code wie folgt" :

int main() 
{  
    EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0); 
} 

wo MyInfoEnumProc Callback wie folgt definiert ist:

std::vector<HMONITOR> handlerList; 
static BOOL CALLBACK MyInfoEnumProc(HMONITOR hMon, HDC hdc, LPRECT lprcMonitor, LPARAM pData) 
{ 
    MONITORINFOEX info_; 
    info_.cbSize = sizeof(MONITORINFOEX); 
    GetMonitorInfo(hMon, &info_); // retrieve monitor info, put it in info_? 
    handlerList.push_back(hMon); // push handler to array 
    std::cout << info_.szDevice; // attempt to print data 
    std::cout << std::endl; 

    return true; 
} 

dieser Rückruf aller an das System angeschlossenen Monitore durch so sollte, aber ich verstehe nicht ganz ho w Ich erhalte Daten wie Auflösung, ID und Name? Wie wenn ich Monitor-Einstellungen von Desktop gehe, ist jedem Monitor eine ID zugewiesen, es wäre nützlich, diese zu bekommen, damit ich mein Fenster in Monitor 2 anstelle meines primären Monitors, Monitor 1, platzieren kann. Auch hinsichtlich des Handlers, Ich lege das in ein Array, aber ich brauche wirklich die Daten, damit ich weiß, welcher Monitor-Handler, den ich erworben habe, nehme ich an? Wenn ich den Gerätenamen des Monitors std::cout << info_.szDevice; drucke, bekomme ich nur die gleiche Nummer für beide Monitore.

Ich bin Neuling bei C++, also habe ich vielleicht etwas offensichtlich übersehen. Hoffe, dass jeder helfen kann.

Edit:

Dank Iinspectable erwähnte er, dass in der Callback-Funktion, können Sie grundsätzlich überprüfen Sie die dwFlags Attribut den primären Monitor zu finden und dann wissen Sie, welche der zweite Bildschirm ist:

static BOOL CALLBACK MyInfoEnumProc(HMONITOR hMon, HDC hdc, LPRECT lprcMonitor, LPARAM pData) 
{ 
    MONITORINFOEX info_; 
    info_.cbSize = sizeof(MONITORINFOEX); 
    GetMonitorInfo(hMon, &info_); 
    if (info_.dwFlags == 0) { 
     std::cout << std::endl; 
     std::cout << "Found the non-primary monitor" << std::endl; 
     handlerList.push_back(hMon); 
    } 
    return true; 
} 

Wäre nützlich, um eine allgemeine Lösung für dieses Problem zu haben, falls ich einen dritten Bildschirm anschließen möchte, dwFlags = 0 in 2 Fällen für ein Beispiel mit 3 Monitoren.

+0

Können Sie definieren, was Sie unter Monitor Nummer –

+0

verstehen Wenn Sie mit der rechten Maustaste auf den Desktop und gehen Sie zu Monitoreinstellungen -> Bildschirm. Bild: http://imgur.com/a/vO8tF. Dies ist beispielsweise meine 3-Monitor-Konfiguration. – jones

Antwort

1

MONITORINFOEX Die Struktur, die durch den Aufruf GetMonitorInfo bevölkert hat ein rcMonitor Feld, um die Größe des Anzeige Speicher (im virtuellen Koordinaten).

Das Feld dwFlags hat die MONITORINFOF_PRIMARY Einstellung für den primären Monitor. Da Sie nur 2 Anzeigen haben, suchen Sie nach dem Monitor, für den dieses Flag nicht gesetzt ist.

+0

Falls ich 3 Monitore habe, was mache ich dann? – jones

+0

In diesem Fall müssen Sie eine andere Frage stellen. Ich habe die Frage beantwortet, die du gestellt hast. – IInspectable

+0

Gut, danke, ich nehme an, Sie könnten das Attribut rcMonitor.left/right überprüfen, wenn Sie vorher gewusst hätten, wie das Setup aussehen würde. Wenn Sie den Bildschirm ganz links in einem 3-Monitor-Setup haben möchten, können Sie nach 'info_.rcMonitor.left == -1920' suchen, zum Beispiel – jones

Verwandte Themen