2017-03-01 90 views
0

因此,我一直在通過網絡尋找線索如何做到這一點,但我似乎無法做到正確。我有一個默認的雙顯示器設置,我想「挑選」「顯示器2」,所以當用戶按下程序中的按鈕時,我可以在全屏中顯示一個窗口。獲取特定顯示器的處理程序以在彈出窗口中放置彈出窗口

所以據我瞭解,我需要指定顯示器作爲第一步的處理程序,我的做法是根據MSDN 「檢索所有顯示監視器,使用這樣的代碼信息」來稱呼EnumDisplayMonitors

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

其中MyInfoEnumProc的回調定義如下:

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

所以這個回調應該通過所有連接到系統的顯示器,但我不太明白浩W我獲得像解析,ID和名稱的數據?就像我從桌面進入顯示器設置一樣,有一個ID分配給每臺顯示器,這將是有用的,所以我可以把我的窗口放在顯示器2,而不是我的主顯示器,顯示器1. 關於處理程序,我把它放在一個數組中,但我真的需要數據,所以我知道我已經獲得了哪個監視器的處理程序,我想?當我打印顯示器的設備名稱std::cout << info_.szDevice;我只是得到兩個顯示器相同的號碼。

我是C++新手,所以我可能已經錯過了明顯的東西。希望任何人都能幫忙。

編輯:

感謝Iinspectable,他提到,在回調函數中,你基本上可以檢查dwFlags屬性中找到此主監視器,然後你知道哪一個是第二個畫面:

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

如果我想連接第三個屏幕,對於這個問題有一個通用的解決方案,dwFlags = 0對於3個顯示器的例子有2個例子。

+0

你能定義你的意思嗎?監視器編號 –

+0

當你右鍵單擊桌面並轉到監視器設置 - >屏幕。圖片:http://imgur.com/a/vO8tF。例如,這是我的3個監視器設置。 – jones

回答

1

MONITORINFOEX結構由呼叫填充到GetMonitorInfo具有rcMonitor字段,存儲顯示器的尺寸(在虛擬座標)。

dwFlags該字段已將MONITORINFOF_PRIMARY設置爲主監視器。由於您只有2臺顯示器,因此您正在尋找沒有設置此標誌的顯示器。

+0

如果我有3臺顯示器,那麼我該怎麼做? – jones

+0

在這種情況下,您需要提出一個不同的問題。我回答了你問的問題。 – IInspectable

+0

好吧,謝謝,我想你可以檢查rcMonitor.left/right屬性,如果你事先知道設置的樣子。如果你想在3監視器設置中的最左邊的屏幕,你可以尋找'info_.rcMonitor.left == -1920'例如 – jones