[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool EnumMonitors(string pName, uint level, IntPtr pMonitors, uint cbBuf, ref uint pcbNeeded, ref uint pcReturned);
Declare Function EnumMonitors Lib "winspool.dll" (TODO) As TODO
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct MONITOR_INFO_2
{
[MarshalAs(UnmanagedType.LPTStr)]
public string pName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pEnvironment;
[MarshalAs(UnmanagedType.LPTStr)]
public string pDLLName;
}
Do you know one? Please contribute it!
None.
Please add some!
public const int ERROR_INSUFFICIENT_BUFFER = 122;
public static List<MONITOR_INFO_2> GetMonitors()
{
List<MONITOR_INFO_2> ports = new List<MONITOR_INFO_2>();
uint pcbNeeded = 0;
uint pcReturned = 0;
if (EnumMonitors(null, 2, IntPtr.Zero, 0, ref pcbNeeded, ref pcReturned))
{
//succeeds, but must not, because buffer is zero (too small)!
throw new Exception("EnumMonitors should fail!");
}
int lastWin32Error = Marshal.GetLastWin32Error();
if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER)
{
IntPtr pMonitors = Marshal.AllocHGlobal((int)pcbNeeded);
if (EnumMonitors(null, 2, pMonitors, pcbNeeded, ref pcbNeeded, ref pcReturned))
{
IntPtr currentMonitor = pMonitors;
for (int i = 0; i < pcReturned; i++)
{
ports.Add((MONITOR_INFO_2)Marshal.PtrToStructure(currentMonitor, typeof(MONITOR_INFO_2)));
currentMonitor = (IntPtr)(currentMonitor.ToInt32() + Marshal.SizeOf(typeof(MONITOR_INFO_2)));
}
Marshal.FreeHGlobal(pMonitors);
return ports;
}
}
throw new Win32Exception(Marshal.GetLastWin32Error());
}