Mobile SDK for Windows Apps2.0
Transforming Windows apps into Mobile apps
// C# Display Settings example using Citrix Mobility Pack SDK
// Uses Citrix Mobility Pack SDK to reveal display settings
// Retrieves information on the device's display settings after a change 
// in the settings is detected (through a change orientation) and prints them out on the console window.
// Copyright (c) 2012 Citrix Systems

using System;
using System.Collections.Generic;
using System.Linq;
using CitrixMobility;
using System.Runtime.InteropServices;
using System.Threading;

using CMPRESULT = System.Int32;

namespace displaysettings
    class Program
        static CitrixMobile cmp;

        static void Main()
            // Initialise result to "No Error"

                Console.WriteLine("Creating CitrixMobile object");

                // Creates the CitrixMobile Object which contains all the CMP interfaces. e.g. IButton, ICamera
                cmp = new CitrixMobile();

                Console.WriteLine("Calling OpenSession");

                // Opens a connection to the remote mobile device
                // It is good practice to close the operation when no longer needed 
                rc = cmp.OpenSession();

                if (CMP_SUCCESS(rc))
                    // Creating the object "CMP Display Settings"
                    CMP_DISPLAY_SETTINGS displaySettings = new CMP_DISPLAY_SETTINGS();
                    Console.WriteLine("Hooking display settings changed event");

                    // register for the display settings event

                    // get the current display settings
                    rc = GetDisplaySettings(ref displaySettings);

                    if (CMP_SUCCESS(rc))
                        // Prints information of the current display settings of the device

                    Console.WriteLine("\nRotate the device to test the display settings change event\n");

                    // Let events come in over the next 30 seconds
                    // If this was a Windows program and we had a message loop, we would not need to do this
                    Console.WriteLine("OpenSession failed rc={0:X}", rc);
            catch (System.Exception ex)

        static void ReportDisplaySettings(CMP_DISPLAY_SETTINGS displaySettings)
            Console.WriteLine("Metrics flags({0:X})\n", displaySettings.MetricsFlags);
            Console.WriteLine("Pixel width({0:X}) height({1:X})\n", displaySettings.PixelWidth, displaySettings.PixelHeight);
            Console.WriteLine("Color depth({0:X})\n", displaySettings.ColorDepth);
            Console.WriteLine("PPI X({0:X}) Y({1:X})\n", displaySettings.HorizontalPixelsPerInch, displaySettings.VerticalPixelsPerInch);
            Console.WriteLine("Orientation({0:X})\n", displaySettings.DeviceOrientation);
            Console.WriteLine("Physical width({0:X}) height({1:X}) MilliInches\n", displaySettings.WidthMilliInches, displaySettings.HeightMilliInches);
            Console.WriteLine("Display settings structure length({0:X})\n", displaySettings.Length);

        static CMPRESULT RegisterForEvent()

            // Subscribed to DisplaySettings event.
            cmp.DisplaySettingsChanged += new ICMPEvents_DisplaySettingsChangedEventHandler(cmp_DisplaySettingsChanged);

            return (rc);

        static CMPRESULT GetDisplaySettings(ref CMP_DISPLAY_SETTINGS displaySettings)
            CMPRESULT rc;

            Console.WriteLine("initialize the length of display settings");

            // Best practice to initialize the length of the structure.
            displaySettings.Length = (short)Marshal.SizeOf(displaySettings);

            Console.WriteLine("Get display settings");

            // Gets the current display settings of the device.
            // and stores it into the variable "displaySettings" of type CMP_DISPLAY_SETTINGS.
            rc = cmp.GetDisplaySettings(out displaySettings);

            return (rc);

        // <summary>
        // Display Settings event handler.
        // </summary>
        // <param name="metricsFlags">Metrix flags.</param>
        // <param name="pixelWidth">Pixel width.</param>
        // <param name="pixelHeight">Pixel height.</param>
        // <param name="colorDepth">Colour depth.</param>
        // <param name="XPixelsPerInch">X-axis pixels per inch.</param>
        // <param name="YPixelsPerInch">Y-axis pixels per inch.</param>
        // <param name="DeviceOrientation">Device Orientation</param>
        // <param name="WidthMilliInches">Width milli-inches</param>
        // <param name="HeightMilliInches">Heigth milli-inches</param>
        // <param name="normalizedDPI">Normalised dots per inch</param>
        static void cmp_DisplaySettingsChanged(
            short metricsFlags,
            int pixelWidth,
            int pixelHeight,
            short colorDepth,
            int XPixelsPerInch,
            int YPixelsPerInch,
            CMP_ORIENTATION_POSITION DeviceOrientation,
            int WidthMilliInches,
            int HeightMilliInches,
            int normalizedDPI)
                "DisplaySettingsChanged MetricsFlags({0:X})" +
                "pixelWidth({1:X}) pixelHeight({2:X})\n colorDepth({3:X}) " +
                "xPixelsPerInch({4:X}) yPixelsPerInch({5:X})\n orientation({6:X}) " +
                "widthMilliInches({7:X}) heightMilliInches({8:X})\n normalizedDPI({9:X})\n",
                metricsFlags, pixelWidth, pixelHeight,
                colorDepth, XPixelsPerInch, YPixelsPerInch,
                DeviceOrientation, WidthMilliInches,
                HeightMilliInches, normalizedDPI);

        static bool CMP_SUCCESS(CMPRESULT rc)
            // Need to mask the result since the top half can have the component Id
            return ((rc & 0xffff) == (CMPRESULT)CMP_ERROR_ID.CMP_NO_ERROR);

        static void WaitForCMPEvents()
            for (int i = 0; i < 30; i++)

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Events Defines