Por fin a base de código y comiando desde C#, he logrado hacer que muestre en modo visual el F#, normalmente es en consola, pero bueno.
Quiero lograr de alguna vez por todas, que al pulsar el botón abrir, en el momento que lo pulses, dice el mensaje "Abriendo...".
Cuando la bandeja del lector se abrió del todo, dice, "Abierto.".
Logro que abra y cierre la bandeja pero no que muestre los mensajes.
¿Alguna idea?
Sigo dándole caña, me cansé.
Código Visual F#:
Código:
// En Opciones de Lector_Form_fs en el Explorador de soluciones. // Con el segundo botón del ratón, en Tipo de salida: Aplicación Windwos.
open System open System.Text open System.Windows.Forms // Añadir refrencias. open System.Drawing // Añadir referencias. open System.Runtime.InteropServices
// Importar librería o dll externo. [<DllImport("winmm.dll")>] extern int mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, IntPtr hwndCallback)
let rt = StringBuilder(127)
// Método necesario para admitir el Diseñador. No se puede modificar // el contenido de este método con el editor de código. let form = new Form() let label_Mensaje = new Label() let groupBox_Bandeja = new GroupBox() let button_Abrir = new Button(); let button_Cerrar = new Button(); groupBox_Bandeja.SuspendLayout() form.SuspendLayout()
// Crear formulario. let AutoScaleDimensions = new Size(6, 13) form.AutoScaleMode <- AutoScaleMode.Font form.BackColor <- Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(54)))), ((int)(((byte)(161))))) // Color violeta. let ClientSize = new Size(284, 261) form.Controls.Add(groupBox_Bandeja) // Añadir en el formulario. form.Name <- "Form1" form.StartPosition <- FormStartPosition.CenterScreen form.Text <- "Visual F# 2017" groupBox_Bandeja.ResumeLayout(false) form.ResumeLayout(false) form.PerformLayout() //----------------------------------------------------------------------------------
// Abrir la bandeja. let mensajeA abr = label_Mensaje.Text <- "Abriendo..." let abr = label_Mensaje.Click.Add(mensajeA) Application.DoEvents() let button_Abrir_Click abrir = mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero) |> ignore let abrir = button_Abrir.Click.Add(button_Abrir_Click) let mensajeAbierto2 ao = label_Mensaje.Text <- "Abierto." let ao = label_Mensaje.Click.Add(mensajeAbierto2)
// Cerrar la bandeja. let button_Cerrar_Click cerrar = mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero) |> ignore let cerrar = button_Cerrar.Click.Add(button_Cerrar_Click)
[<STAThread>] Application.Run(form)
Saludos.
PD: ¿Por qué Microsoft no hizo o hace una buena plantilla para crear formularios Windwos o WPF como se hace con C# y VB .net? Está dedicado a modo consola, pero en Visual, hay que programar todo.
Veo que usas funciones de la API, bien podrías hacerlo en C/C++ así tu broma no dependerá del netframework.
Saludos.
Gracias por la info caballero, pero no entiendo esto por ahora. Me centro primero en lo que estoy haciendo y luego observo lo que cuentas. Haber que ventajas tiene.
Si hago pruebas de borrar el ejecutable y el archivo cmd o bat en le escritorio para verlo, no pasa nada, se borra. Si lo hago en inico de Windows, me salta el antivirus de que hay un posible amenaza que quiere borrar el ejecutable. Vaya por Dios. Esto con Windows 10, con Windows 7 y 8 no se si lo detecta.
Rootkit Startup Method ( full hidden startup x32 x86 working ) vb.net
Sí.
Muchísimo.
Por ahora centrado en hacer el programa principal. A parte de eso, estaba aprendiendo también manejar servicios windows que es un rollo que no veas para lo que quiero.
Intentaré seguir la tónica de Visual Basic .net centrado a C#. Todavía no se desprenden del VB 6 ni loco.
Parece ser que es una broma pesada. En cuanto al icono de Java, nombré eso pro nombrar, puede ser otro. Hay muchos iconos por internet. Hay que intentar una cosa que lo primero que se le ocurra, es no formatear así sin más.
Hay una broma que le llegó a un amigo, salió una barra de formateando disco duro y haciendo mucho ruido. Al final salió un mensaje en castellano que dijo:
Citar
Es una broma. A la próxima ten mucho cuidado con los archivos que ejectutes.
Mi broma continua cuando al final de repente, aparezca la famosa pantalla azul sobre error de Windows, un segundo o dos, para que no le de tiempo a reiniciar ya, como hacen muchos, al final dirá letra por letra.
Citar
Es una broma.
Se quita la pantalla.
El ordenador del cliente tiene que estar intacto, como si no hubiera ocurrido nada, sano y salvo. Sin infecciones, sin modificaciones, sin huellas en el regedit, como el nombre el ejecutable que se queda guardado ahí, y sin ninguna otra majadería. el ejecutable debe desaparecer, sea desde el inico o en servivios, que es lo que estoy haciendo pruebas ahora mismo para conocerlo a fondo, nada de conectarse a internet, nada de robos de datos o información del usuario como saber que PC usa, aquí solo bromas, sin causar grandes molestias o sustos graves. Por ahora, no lo detecta ningún antivirus.
No es malicioso ni la rosa. Me he informado bien por Internet. Es broma, peligrosos si infecta, se propaga mientras hace daño por donde pase. En este caso, al final que sigo con la broma, tiene que estar el ordenador en buen estado, tal como lo encontró al principio. Sin pérdidas de datos, sin robo de contraseñas de Web o lo que sea, sin cosas maliciosas.
Ya pondré el programa final cuando lo acabe.
Para escapar, a lo mejor lo pongo en modo servicios para que no se den cuenta. Aquí leyendo un poco el tutorial haber como es.
Siguiendo la broma. Ahora está la parte de invertir la pantalla, cuando vuelvas a iniciar, se vuelve normal.
El problema que me di cuenta en Windows 10, pueden saber que en inicio hay un programa.
¿No hay otro sitio para esconderlo?
Tendré que usar trucos como , usar el icono de Java. Donde pone anunciante, poner su anuncio. Como pueden ver en Broma_Consola_06, no tiene nada en Anunciante.
Quiero ahcer un programa que al insertar un PenDrive o una disco duro externo por USB, lo detecte y borre todos los datos en su interior. Primero detecta, a los 10 segundos empieza a borrar todo.
Lo que he hecho pruebas que al conectar mi pendrive, es la letra L. Mi idea es tener siempre el programa en StartUp o inicio de Windows para que siempre esté activo, asechando que detecte una unidad L: para ser borrado.
He hecho este programa que solo lee todo lo que hay y se queda ahí. En C#.
Código
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Detector_PenDrive_HDD_Consola_01
{
class Program
{
staticvoid Main(string[] args)
{
// Título de la ventana.
string titulo ="Detectar alamcenamiento - C# 2017";
Console.Title= titulo;
// Tamaño ventana consola.
Console.WindowWidth=80;// X. Ancho.
Console.WindowHeight=40;// Y. Alto.
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
Console.WriteLine("Drive {0}", d.Name);
Console.WriteLine(" Tipo de unidad: {0}", d.DriveType);
if(d.IsReady==true)
{
Console.WriteLine(" Etiqueta de volumen: {0}", d.VolumeLabel);
Console.WriteLine(" Sistema de archivos: {0}", d.DriveFormat);
Console.WriteLine(
" Espacio disponible para el usuario actual:{0, 15} bytes",
d.AvailableFreeSpace);
Console.WriteLine(
" Espacio total disponible: {0, 15} bytes",
d.TotalFreeSpace);
Console.WriteLine(
" Tamaño total de la unidad: {0, 15} bytes ",
d.TotalSize);
}
}
// Pulse cualquier tecla para salir.
Console.ReadKey();
}
}
}
Si el programa está ejecutado, y introduces el pendrive o disco duro externo por USB, parace que necesita un plug & play. Esto parece complicado.
Ya funciona al 100 %. Solo falta pulir algunas cosas como iniciar el formulario en el centro de la pantalla y cambiar el tamaño del texto de la etiqueta STATIC.
Dejo el código completo aquí por si alguien lo necesita o solo le pica la curiosidad.
Código
#include "stdafx.h"
#include "Bandeja_Form_Win32_cpp.h"
#include "mmsystem.h" // No olvidar.
#define MAX_LOADSTRING 100
#define IDC_BUTTON_1 201 // No olvidar.
#define IDC_BUTTON_2 202 // No olvidar.
#define IDC_STATIC_1 303 // No olvidar.
// Variables globales:
HINSTANCE hInst;// Instancia actual
WCHAR szTitle[MAX_LOADSTRING];// Texto de la barra de título
WCHAR szWindowClass[MAX_LOADSTRING];// nombre de clase de la ventana principal
// Declaraciones de funciones adelantadas incluidas en este módulo de código:
// Abrir bandeja del lector. mciSendString("set CDAudio door open", nullptr, 0, nullptr);
// Mostrar mensaje Abierto. Que es cuando ya finalizó. SetWindowText(GetDlgItem(hWnd, IDC_STATIC_1), L"Abierto. "); break; case IDC_BUTTON_2: // Mostrar mensaje. SetWindowText(GetDlgItem(hWnd, IDC_STATIC_1), L"Cerrando... "); // Cerrar bandeja del lector. // mciSendString("set CDAudio closed open", nullptr, 0, nullptr); // Mostrar mensaje. SetWindowText(GetDlgItem(hWnd, IDC_STATIC_1), L"Cerrado. "); break; // #################################################################### End.
Errores: Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido Error (activo) E0167 un argumento de tipo "const char *" no es compatible con un parámetro de tipo "LPCWSTR" Bandeja_Form_Win32_cpp c:\Users\usuario\Documents\Visual Studio 2017\Projects\Bandeja_Form_Win32_cpp\Bandeja_Form_Win32_cpp\Bandeja_Form_Win32_cpp.cpp 201
Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido Error C2664 'MCIERROR mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND)': el argumento 1 no puede convertirse de 'const char [22]' a 'LPCWSTR' Bandeja_Form_Win32_cpp c:\users\usuario\documents\visual studio 2017\projects\bandeja_form_win32_cpp\bandeja_form_win32_cpp\bandeja_form_win32_cpp.cpp 201