2010-08-24 15 views
0

所以我想要得到正確的設備上下文,所以我可以在N顯示器配置(2+)的個別顯示器上設置伽馬斜坡。做pInvoke並不能得到正確的hDC

我已經試過

[DllImport("gdi32.dll")] 
static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData); 

用這種方法我用字符串「顯示」爲lpszDriver,我列舉的顯示器與另一PInvoke的方法和得到其最終是什麼顯示設備名稱例如「\ Registry \ Machine \ System \ CurrentControlSet \ Control \ Class {4d36e96e-e325-11ce-bfc1-08002be10318} \ 0042」並傳入爲lpszDevice。 lpszOutput爲null,lpInitData爲IntPtr.Zero。回來的hDC工作,但似乎是全球性的。

[DllImport("user32.dll")] 
public static extern IntPtr GetDC(IntPtr hWnd); 

用這種方法我已經用實際的窗口句柄的形式嘗試。

我使用

[DllImport("gdi32.dll")] 
private static extern int SetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp); 

它設置伽馬坡道,但它總是將兩臺顯示器。 任何想法?

回答

2

使用設備名稱「DISPLAY」可以爲整個顯示系統提供DC,因此設置伽瑪斜坡(對於您的示例)會影響系統中的所有顯示。

您可以通過調用EnumDisplayMonitors來檢索HMONITOR每臺顯示器,然後GetMonitorInfoMONITORINFOEX結構爲每個HMONITOR爲個體監測得到的設備名稱。 MONITORINFOEX包含一個szDevice成員,您將其傳遞給GetDC以獲取專門用於(卡驅動)監視器的DC,併爲其設置伽馬曲線。

請注意,這實際上爲您獲取顯示器所連接的顯卡的設備名稱。如果內存用於較舊的硬件和/或軟件,則連接到同一卡上的兩臺顯示器始終卡在相同的伽馬斜坡上等。使用當前的硬件/軟件,具有兩個監視器的單張卡片將像兩張卡片一樣查看系統(如果存儲器服務,則在名稱末尾具有類似「:0」或「:1」的東西),所以即使從設置伽瑪斜坡的角度來看,兩個監視器連接到同一張物理卡上,但它仍被視爲兩個獨立的卡)。不管怎樣,我不確定需要多少新硬件和/或軟件來處理將多個顯示器驅動爲多個虛擬卡的單個物理卡。

+0

謝謝你的迴應,我試圖讓這個工作。 有一點奇怪的是我得到空白szDevice名稱回來。 我實際上使用互操作在.net中工作。 – 2010-08-24 06:46:27

+0

也不需要調用CreateDC? GetDC只接受一個hWnd作爲參數,其中szDevice是一個名字? – 2010-08-24 06:51:55

+0

找出我的問題與空名稱,愚蠢的錯誤在我的一部分。 非常感謝。 – 2010-08-24 07:12:12