using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing; // Añadir referencia.
using System.Drawing.Printing;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace Broma_Consola_06
{
class Program
{
// Importar dll.
// Bandeja o lector o unidad de disco.
[DllImport("winmm.dll")]
public static extern Int32 mciSendString(string lpstrCommand, StringBuilder lpstrReturnString,
int uReturnLength, IntPtr hwndCallback);
public static StringBuilder rt
= new StringBuilder
(127);
// Intercambio de botones del ratón.
[DllImport("user32.dll")]
static extern bool SwapMouseButton(bool fSwap);
// Leds del teclado.
[DllImport("user32.dll")]
internal static extern short GetKeyState(int keyCode);
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
// Giro pantalla.
#region Giro pantalla.
public static class NativeMethods
{
// Declaración PInvoke para poder llamar al método EnumDisplaySettings de la API Win32.
// Recupera los modos de visualización disponibles.
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
private static extern int EnumDisplaySettings(
string lpszDeviceName,
int iModeNum,
ref DEVMODE lpDevMode);
// Declaración PInvoke para poder llamar al método ChangeDisplaySettings de la API Win32.
// Cambia el modo de visualización actual.
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public static extern int ChangeDisplaySettings(
ref DEVMODE lpDevMode,
int dwFlags);
// Crea un objeto DEVMODE con la información del modo de visualización.
public static DEVMODE CreateDevMode()
{
int ENUM_CURRENT_SETTINGS = -1;
{
dmDeviceName
= new string(new char[32]),
dmFormName
= new string(new char[32]) };
dm
.dmSize = (short)Marshal
.SizeOf(dm
); EnumDisplaySettings(null, ENUM_CURRENT_SETTINGS, ref dm);
return dm;
}
// Constantes.
// Modos de visualización (girado 0/90/180/270 grados).
public const int DMDO_DEFAULT = 0;
public const int DMDO_90 = 1;
public const int DMDO_180 = 2;
public const int DMDO_270 = 3;
}
// Mapear la estructura que define el modo de visualización en user32.dll.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DEVMODE
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmDeviceName;
public readonly 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;
}
private static void Swap()
{
// Creamos el objeto DEVMODE con la información del modo de visualización.
var dm = NativeMethods.CreateDevMode();
// Establecemos la orientación en función de la actual (girando 180º)
// a través de la propiedad dmDisplayOrientation.
var previousDisplayOrientation = dm.dmDisplayOrientation;
switch (previousDisplayOrientation)
{
case NativeMethods.DMDO_DEFAULT:
dm.dmDisplayOrientation = NativeMethods.DMDO_180;
break;
case NativeMethods.DMDO_270:
dm.dmDisplayOrientation = NativeMethods.DMDO_90;
break;
case NativeMethods.DMDO_180:
dm.dmDisplayOrientation = NativeMethods.DMDO_DEFAULT;
break;
case NativeMethods.DMDO_90:
dm.dmDisplayOrientation = NativeMethods.DMDO_270;
break;
}
// Cambia la pantalla al nuevo modo de visualización.
//NativeMethods.ChangeDisplaySettings(ref dm, 0);
NativeMethods.ChangeDisplaySettings(ref dm, 0);
//// A los dos segundos recupera su estado normal.
//Task.Delay(2000).ContinueWith(t =>
//{
// // Restablece la orientación previa.
// dm.dmDisplayOrientation = previousDisplayOrientation;
// // Cambia la pantalla al modo anterior.
// NativeMethods.ChangeDisplaySettings(ref dm, 0);
//});
}
#endregion
static void Main(string[] args)
{
// Root.
const string userRoot = "HKEY_CURRENT_USER";
// Clave.
const string subkey = "Metaconta";
// FullName.
const string keyName = userRoot + "\\" + subkey;
// ValueName.
const string valueName = "Contador";
// Variables txt.
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
// Si no existe la Key, dará -1.
int contador = Convert.ToInt32(Registry.GetValue(keyName, valueName, -1) ?? -1);
bool led = true;
// Comprueba si la key, al ser -1 si la key no existe.
if (contador >= 0)
{
// Si el contador es mayor que 0.
if (contador > 0)
{
// Sobre escribe la key con -1 su valor.
Registry.SetValue(keyName, valueName, contador -= 1);
}
// Cambio giro pantalla a 180º.
if (contador == 9)
{
Swap();
}
if (contador == 8)
{
Swap();
}
// Escribe un nuevo arhivo de texto con su contenido correspondiente.
if (contador == 7)
{
File.WriteAllText(Path.Combine(path, "Hola.txt"), "Hola amigo.");
}
// Abrir bandeja del lector.
if (contador == 6)
{
mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero);
}
// Intercambiar botones del ratón (Zurdo).
if (contador == 5)
{
// Activar modo zurdo.
// SwapMouseButton(true); o SwapMouseButton(1);
// Para volver a modo diestro.
// SwapMouseButton(false); o SwapMouseButton(0);
SwapMouseButton(true); // Activar surdo.
}
// Intercambiar botones del ratón (Diestro).
if (contador == 4)
{
SwapMouseButton(false); // Activar .
}
// Imprimir un folio de la impresora o ficticia.
if (contador == 3)
{
string amigo = @"Hola amigo.";
string folio = @"Solo te he gastado un folio.";
PrintDocument p
= new PrintDocument
(); p.PrintPage += delegate (object sender1, PrintPageEventArgs e1)
{
e1
.Graphics.DrawString(amigo,
new Font
("Times New Roman",
100),
new SolidBrush
(Color
.Black),
new RectangleF
(30,
100,
p.DefaultPageSettings.PrintableArea.Width,
p.DefaultPageSettings.PrintableArea.Height));
e1
.Graphics.DrawString(folio,
new Font
("Times New Roman",
12),
new SolidBrush
(Color
.Black),
new RectangleF
(530,
270,
p.DefaultPageSettings.PrintableArea.Width,
p.DefaultPageSettings.PrintableArea.Height));
};
try
{
p.Print();
}
catch (Exception ex)
{
throw new Exception
("Excepción ocurrida durante la impresión.", ex
); }
}
// Parpadean los Led del teclado.
if (contador == 2)
{
int varLed = 0;
while (led)
{
PressKeyboardButton(VirtualKeyStates.BloqMayus);
Thread.Sleep(100);
PressKeyboardButton(VirtualKeyStates.BloqNum);
Thread.Sleep(100);
PressKeyboardButton(VirtualKeyStates.BloqDespl);
Thread.Sleep(100);
// Al valor indicado, para salir del bucle.
if (varLed == 300)
{
led = false;
}
varLed++;
}
void PressKeyboardButton(VirtualKeyStates keyCode)
{
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
keybd_event((byte)keyCode, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)keyCode, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
}
// Crea archivo bat, borra .exe y .cmd. Fin de la broma.
if (contador == 1)
{
try
{
// Variables.
string strFileFullName = @"archivo.cmd"; // Nombre del archivo.
string ruta = Environment.GetFolderPath(Environment.SpecialFolder.Startup); // Ruta en Inico de Windwos.
//string ruta = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); // Ruta en el inicio de Windows.
string ficheroAGrabar = Path.Combine(ruta, strFileFullName); // Concatenar ruta.
// Muestra la ruta en pantalla.
Console.WriteLine(ruta); // C:\Users\Usuario\Desktop
// Si no existe el archivo.
if (!File.Exists(ficheroAGrabar))
{
// Crea el contenido al archivo de texto.
File.WriteAllText(ficheroAGrabar, @"@echo off
TIMEOUT /T 1
DEL /S Broma_Consola_06.exe
DEL /S archivo.cmd
EXIT");
}
else // Si existe...
{
// Codigo a ejecutar si existe...
// Console.WriteLine("El archivo existe, así que no se sustituirá.");
}
// Ejecutar archivo.cmd.
ProcessStartInfo psi
= new ProcessStartInfo
(); psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.FileName = strFileFullName; // archivo.cmd.
Process.Start(psi);
// Cerrar aplicación C#.
Environment.Exit(-1);
}
catch (Win32Exception)
{
// No mostrar nada.
// Cerrar aplicación C#.
//Environment.Exit(-1);
}
}
}
// Entonces.
else
{
// Escribe en el registro el valor.
// Empieza la cuenta atrás desde aquí.
Registry.SetValue(keyName, valueName, 10);
}
}
// Led de los botones del taclado.
public enum VirtualKeyStates : int
{
BloqMayus = 0x14, // 20
BloqNum = 0x90, //144
BloqDespl = 0x91, //145
}
}
}