EnumMonitors (winspool)
Last changed: -90.13.13.68

.
Summary
TODO - a short description

C# Signature:

[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);

VB Signature:

Declare Function EnumMonitors Lib "winspool.dll" (TODO) As TODO

User-Defined Types:

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

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

  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());

    }

Documentation