[英]Monitor (Display) Names and Bounds
我的應用程序可以使用雙顯示器配置。 在應用程序的設置中,我列出了用戶將選擇其輔助屏幕的可用顯示。
我使用以下方式獲取(真實)監視器設備名稱:
http://msdn.microsoft.com/en-us/library/aa394122%28VS.85%29.aspx
SelectQuery q = new SelectQuery("SELECT Name, DeviceID, ScreenHeight, ScreenWidth FROM Win32_DesktopMonitor");
using (ManagementObjectSearcher mos = new ManagementObjectSearcher(q))
{
foreach (ManagementObject mo in mos.Get())
{
...
}
}
但是我也需要顯示邊界(頂部,左邊等),這不會給我。 但System.Windows.Forms.Screen
確實給了我邊界但不是真正的設備名稱。 如果我確定每次都以相同的順序返回設備,我可以一起使用它們。 這些都會每次按時間順序返回“設備1”,“設備2”等嗎? 或者有沒有一種方法可以包含我所需要的所有信息?
[編輯]嗯。 Win32_DesptopMonitor不給我我的輔助監視器名稱。 它只是稱它為Default Monitor。 它在我的主要版本之前列出它。
[edit2]好吧,它的名字和他們的決議搞砸了.....任何人都知道這里發生了什么?
我在使用Win API調用之前已經這樣做了。 我粘貼了下面的代碼,這可能對你有所幫助......
public void Store()
{
Screens.Clear();
uint iAdaptorNum = 0;
Win.User32.DISPLAY_DEVICE adaptor = new Win.User32.DISPLAY_DEVICE();
adaptor.cb = (short)Marshal.SizeOf(adaptor);
Win.User32.DISPLAY_DEVICE dd = new Win.User32.DISPLAY_DEVICE();
dd.cb = (short)Marshal.SizeOf(dd);
while (Win.User32.EnumDisplayDevices(null, iAdaptorNum, ref adaptor, Win.User32.EDD_GET_DEVICE_INTERFACE_NAME))
{
uint iDevNum = 0;
while (Win.User32.EnumDisplayDevices(adaptor.DeviceName, iDevNum, ref dd, Win.User32.EDD_GET_DEVICE_INTERFACE_NAME))
{
log.WriteFormat(LogLevel.Debug, "Adaptor {0}:{1} {2}='{3}', Device {4}='{5}', State flags = {4}",
iAdaptorNum, iDevNum, adaptor.DeviceName, adaptor.DeviceString, dd.DeviceName, dd.DeviceString, dd.StateFlags);
if ((dd.StateFlags & Win.User32.DisplayDeviceStateFlags.AttachedToDesktop) > 0)
Screens.Add(new ScreenInfo(adaptor, dd));
iDevNum++;
}
iAdaptorNum++;
}
}
這就是new ScreenInfo
背后的new ScreenInfo
:
public void StoreScreen(Win.User32.DISPLAY_DEVICE Adaptor, Win.User32.DISPLAY_DEVICE Device)
{
adaptor = Adaptor.DeviceName;
device = Device.DeviceName;
name = string.Format("{0} on {1}", Device.DeviceString, Adaptor.DeviceString);
Win.User32.DEVMODE dm = newDevMode();
if (Win.User32.EnumDisplaySettings(Adaptor.DeviceName, Win.User32.ENUM_CURRENT_SETTINGS, ref dm) != 0)
{
isAttached = (Adaptor.StateFlags & Win.User32.DisplayDeviceStateFlags.AttachedToDesktop) > 0;
isPrimary = (Adaptor.StateFlags & Win.User32.DisplayDeviceStateFlags.PrimaryDevice) > 0;
mode = findMode(Adaptor.DeviceName, dm);
if ((dm.dmFields & Win.User32.DM.PelsWidth) > 0) width = dm.dmPelsWidth;
if ((dm.dmFields & Win.User32.DM.PelsHeight) > 0) height = dm.dmPelsHeight;
if ((dm.dmFields & Win.User32.DM.BitsPerPixel) > 0) bpp = dm.dmBitsPerPel;
if ((dm.dmFields & Win.User32.DM.Orientation) > 0) orientation = dm.dmOrientation;
if ((dm.dmFields & Win.User32.DM.DisplayFrequency) > 0) frequency = dm.dmDisplayFrequency;
if ((dm.dmFields & Win.User32.DM.DisplayFlags) > 0) flags = dm.dmDisplayFlags;
if ((dm.dmFields & Win.User32.DM.Position) > 0)
{
posX = dm.dmPosition.x;
posY = dm.dmPosition.y;
}
}
}
private static Win.User32.DEVMODE newDevMode()
{
Win.User32.DEVMODE dm = new Win.User32.DEVMODE();
dm.dmDeviceName = new String(new char[31]);
dm.dmFormName = new String(new char[31]);
dm.dmSize = (short)Marshal.SizeOf(dm);
return dm;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.