girar la pantalla en el acer aspire 1825PTZ con el botón programable (II)

Actualización: Mucho mas simple e interesante la nueva aproximación al problema de este otro post : Matar un proceso en C#

Bueno, el cutre script que puse hace unas semanas, funciona,  pero tiene un par de cosas que no me gustan:

- para girar se basa en un valor almacenado, y no en la posición actual

- usa “sendkeys”, luego dependo del driver de intel para que funcione

asi que me puse a buscar si había alguna forma de acceder a la API de video para saber la posición y manipularla, y encontre un ejemplo en C++ y en C# que hacía justo lo que necesitaba (http://msdn.microsoft.com/en-us/library/ms812499.aspx).

Lo unico que no me gusta en este caso es que practicamente es copia y pega (solo he cambiado el sentido de giro, a mi gusto), sin pensarlo ni nada :-)

Aquí va el codigo tal cual para una app de consola de c#:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace RotarPantalla
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DEVMODE
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
public short dmSize;
public short dmDriverExtra;
public int dmFields;
public int dmPositionX;
public int dmPositionY;
public int dmDisplayOrientation;
public int dmDisplayFixedOutput;
public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmFormName;
public short dmLogPixels;
public short dmBitsPerPel;
public int dmPelsWidth;
public int dmPelsHeight;
public int dmDisplayFlags;
public int dmDisplayFrequency;
public int dmICMMethod;
public int dmICMIntent;
public int dmMediaType;
public int dmDitherType;
public int dmReserved1;
public int dmReserved2;
public int dmPanningWidth;
public int dmPanningHeight;
};
public class NativeMethods
{
// PInvoke declaration for EnumDisplaySettings Win32 API
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public static extern int EnumDisplaySettings(
string lpszDeviceName,
int iModeNum,
ref DEVMODE lpDevMode);
// PInvoke declaration for ChangeDisplaySettings Win32 API
[DllImport("user32.dll", CharSet=CharSet.Ansi)]
public static extern int ChangeDisplaySettings(
ref DEVMODE lpDevMode,
int dwFlags);
// constants
public const int ENUM_CURRENT_SETTINGS = -1;
public const int DMDO_DEFAULT = 0;
public const int DMDO_90 = 1;
public const int DMDO_180 = 2;
public const int DMDO_270 = 3;
}
class Program
{
static void Main(string[] args)
{
// initialize the DEVMODE structure
DEVMODE dm = new DEVMODE();
dm.dmDeviceName = new string(new char[32]);
dm.dmFormName = new string(new char[32]);
dm.dmSize = (short)Marshal.SizeOf(dm);
if (0 != NativeMethods.EnumDisplaySettings(
null,
NativeMethods.ENUM_CURRENT_SETTINGS,
ref dm))
{
// swap width and height
int temp = dm.dmPelsHeight;
dm.dmPelsHeight = dm.dmPelsWidth;
dm.dmPelsWidth = temp;
// determine new orientation
switch (dm.dmDisplayOrientation)
{
case NativeMethods.DMDO_DEFAULT:
dm.dmDisplayOrientation = NativeMethods.DMDO_90;
break;
case NativeMethods.DMDO_270:
dm.dmDisplay

Orientation = NativeMethods.DMDO_DEFAULT;
break;
case NativeMethods.DMDO_180:
dm.dmDisplayOrientation = NativeMethods.DMDO_270;
break;
case NativeMethods.DMDO_90:
dm.dmDisplayOrientation = NativeMethods.DMDO_180;
break;
default:
// unknown orientation value
// add exception handling here
break;
}
}
}
}
}

PD.- despues de actualizar n veces la entrada para intentar que el codigo quede decente,no hay manera…

0 Respuestas a “girar la pantalla en el acer aspire 1825PTZ con el botón programable (II)”



  1. Dejar un comentario

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s




Enlaces en del.icio.us

Fotos en Flickr

patos0028

patos0027

patos0022

patos0018

More Photos

Seguir

Get every new post delivered to your Inbox.