using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace UW.ClassroomPresenter.Misc {
class DispalyControlHelpers {
///
/// Returns the number of available displays on this device
///
///
public static int GetNumberOfDisplays() {
return 2;
}
///
/// TODO: This function should return the best guess procedure for this machine for changing displays
///
public static void GetDefaultSettings() {
}
public static string nViewCloneCommand = "nvcpl.dll,dtcfg setview 1 clone DA AA";
///
/// Execute a dll command using RunDLL32.exe
///
/// The parameter to rundll32.exe
public static void InvokeRunDLL32Command( string cmd )
{
Process dllProcess = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo("rundll32.exe");
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.Arguments = cmd;
dllProcess.StartInfo = startInfo;
dllProcess.Start();
}
///
/// Create the extended desktop
///
/// True if successful, false otherwise
public static bool AddUnattachedDisplayDeviceToDesktop() {
uint DispNum = 0;
Gdi32.DISPLAY_DEVICE DisplayDevice;
Gdi32.DEVMODE defaultMode;
IntPtr hdc;
int nWidth;
bool bFoundSecondary = false;
hdc = User32.GetDC( IntPtr.Zero );
nWidth = Gdi32.GetDeviceCaps( hdc, Gdi32.HORZRES );
User32.ReleaseDC( IntPtr.Zero, hdc );
// Initialize DisplayDevice
DisplayDevice = Gdi32.CreateDISPLAY_DEVICE();
// Get display device
while( (User32.EnumDisplayDevices( null, DispNum, ref DisplayDevice, 0)) &&
(bFoundSecondary == false) )
{
defaultMode = Gdi32.CreateDEVMODE();
if( !User32.EnumDisplaySettings( DisplayDevice.DeviceName,
User32.ENUM_REGISTRY_SETTINGS,
ref defaultMode) )
{
return false;
}
if( (DisplayDevice.StateFlags & Gdi32.DISPLAY_DEVICE_PRIMARY_DEVICE) == 0 )
{
// Found the first secondary device
bFoundSecondary = true;
defaultMode.dmPositionX += nWidth;
defaultMode.dmFields = Gdi32.DM_POSITION;
User32.ChangeDisplaySettingsEx( DisplayDevice.DeviceName,
ref defaultMode,
IntPtr.Zero,
User32.CDS_NORESET|Misc.User32.CDS_UPDATEREGISTRY,
IntPtr.Zero );
// A second call to ChangeDisplaySettings updates the monitor.
User32.ChangeDisplaySettings( IntPtr.Zero, 0 );
}
// Reinitialize DisplayDevice
DisplayDevice = Gdi32.CreateDISPLAY_DEVICE();
DispNum++;
}
return true;
}
///
/// Create the cloned desktop
///
/// True if successful, false otherwise
public static bool RemoveAttachedDisplayDeviceFromDesktop() {
uint DispNum = 0;
Gdi32.DISPLAY_DEVICE DisplayDevice;
Gdi32.DEVMODE defaultMode;
bool bFoundSecondary = false;
// Initialize DisplayDevice
DisplayDevice = Gdi32.CreateDISPLAY_DEVICE();
// Initialize DefaultMode
defaultMode = Gdi32.CreateDEVMODE();
// Get display device
while( (User32.EnumDisplayDevices( null, DispNum, ref DisplayDevice, 0)) &&
(bFoundSecondary == false) )
{
if( (DisplayDevice.StateFlags & Gdi32.DISPLAY_DEVICE_PRIMARY_DEVICE) == 0 )
{
// Found the first secondary device
bFoundSecondary = true;
defaultMode.dmPositionX = 0;
defaultMode.dmPositionY = 0;
defaultMode.dmPelsHeight = 0;
defaultMode.dmPelsWidth = 0;
defaultMode.dmFields = Gdi32.DM_POSITION | Gdi32.DM_PELSWIDTH | Gdi32.DM_PELSHEIGHT;
User32.ChangeDisplaySettingsEx( DisplayDevice.DeviceName,
ref defaultMode,
IntPtr.Zero,
User32.CDS_NORESET|User32.CDS_UPDATEREGISTRY,
IntPtr.Zero );
// A second call to ChangeDisplaySettings updates the monitor.
User32.ChangeDisplaySettings( IntPtr.Zero, 0 );
}
// Reinitialize DisplayDevice
DisplayDevice = Gdi32.CreateDISPLAY_DEVICE();
DispNum++;
}
return true;
}
}
}