Hacer funcionar el lector de bandeja de discos con este lenguaje .net

Iniciado por Meta, 15 Noviembre 2017, 21:59 PM

0 Miembros y 2 Visitantes están viendo este tema.

Meta

Buenas a todos y a todas:



Quiero pasar este código en consola de C#, VB .net o el C++ CLR a F#. Lo que hace el código es si pulsas A o la letra C abre o cierra la bandeja del lector de discos. A parte de C#, también está en C++ CLR y VB .net por si lo entienden mejor. Lo que hace el código es abrir y cerrar la bandeja de discos del lector, sea IDE o SATA.

Código C#:
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace Lector_teclado_consola_cs
{
   class Program
   {
       [DllImport("winmm.dll")]
       public static extern Int32 mciSendString(string lpstrCommand, StringBuilder lpstrReturnString,
       int uReturnLength, IntPtr hwndCallback);

       public static StringBuilder rt = new StringBuilder(127);

       public static void DoEvents()
       {
           // Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
           Console.SetCursorPosition(0, 6);
           Console.Write("Abriendo...");
       }

       public static void DoEvents2()
       {
           // Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
           Console.SetCursorPosition(0, 6);
           Console.Write("Cerrando...");
       }

       static void Main(string[] args)
       {
           // Título de la ventana.
           Console.Title = "Control lector de bandeja. C#";

           // Tamaño ventana consola.
           Console.WindowWidth = 29; // X. Ancho.
           Console.WindowHeight = 8; // Y. Alto.

           // Cursor invisible.
           Console.CursorVisible = false;

           // Posición del mansaje en la ventana.
           Console.SetCursorPosition(0, 0);
           Console.Write(@"Control bandeja del lector:

A - Abrir bandeja.
C - Cerrar bandeja.
===========================");



           ConsoleKey key;
           //Console.CursorVisible = false;
           do
           {
               key = Console.ReadKey(true).Key;

               string mensaje = string.Empty;

               //Asignamos la tecla presionada por el usuario
               switch (key)
               {
                   case ConsoleKey.A:
                       // mensaje = "Abriendo...";
                       Console.SetCursorPosition(0, 6);
                       DoEvents();
                       mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero);
                       mensaje = "Abierto.";
                       break;

                   case ConsoleKey.C:
                       // mensaje = "Cerrando...";
                       Console.SetCursorPosition(0, 6);
                       DoEvents2();
                       mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero);
                       mensaje = "Cerrado.";
                       break;
               }

               Console.SetCursorPosition(0, 6);
               Console.Write("           ");
               Console.SetCursorPosition(0, 6);
               Console.Write(mensaje);

           }
           while (key != ConsoleKey.Escape);
       }
   }
}


Código VB .net:
Imports System.Runtime.InteropServices
Imports System.Text

Module Module1
   <DllImport("winmm.dll")>
   Public Function mciSendString(lpstrCommand As String, lpstrReturnString As StringBuilder, uReturnLength As Integer, hwndCallback As IntPtr) As Int32
   End Function

   Public rt As New StringBuilder(127)

   Public Sub DoEvents()
       ' Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
       Console.SetCursorPosition(0, 6)
       Console.Write("Abriendo...")
   End Sub

   Public Sub DoEvents2()
       ' Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
       Console.SetCursorPosition(0, 6)
       Console.Write("Cerrando...")
   End Sub

   Sub Main()
       ' Título de la ventana.
       Console.Title = "Control lector de bandeja. Visual Basic"

       ' Tamaño ventana consola.
       Console.WindowWidth = 29 ' X. Ancho.
       Console.WindowHeight = 8 ' Y. Alto.
       ' Cursor invisible.
       Console.CursorVisible = False

       ' Posición del mansaje en la ventana.
       Console.SetCursorPosition(0, 0)
       Console.Write("Control bandeja del lector:" & vbCr & vbLf & vbCr & vbLf &
                     "A - Abrir bandeja." & vbCr & vbLf &
                     "C - Cerrar bandeja." & vbCr & vbLf &
                     "===========================")

       Dim key As ConsoleKey
       'Console.CursorVisible = false;
       Do
           key = Console.ReadKey(True).Key

           Dim mensaje As String = String.Empty

           'Asignamos la tecla presionada por el usuario
           Select Case key
               Case ConsoleKey.A
                   ' mensaje = "Abriendo...";
                   Console.SetCursorPosition(0, 6)
                   DoEvents()
                   mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero)
                   mensaje = "Abierto."
                   Exit Select

               Case ConsoleKey.C
                   ' mensaje = "Cerrando...";
                   Console.SetCursorPosition(0, 6)
                   DoEvents2()
                   mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero)
                   mensaje = "Cerrado."
                   Exit Select
           End Select

           Console.SetCursorPosition(0, 6)
           Console.Write("           ")
           Console.SetCursorPosition(0, 6)

           Console.Write(mensaje)
       Loop While key <> ConsoleKey.Escape
   End Sub

End Module


Código C++ CLR:
#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::Text;

[DllImport("winmm.dll")]
extern Int32 mciSendString(String^ lpstrCommand, StringBuilder^ lpstrReturnString,
int uReturnLength, IntPtr hwndCallback);

static void DoEvents()
{
Console::SetCursorPosition(0, 6);
Console::Write("Abriendo...");
}

static void DoEvents2()
{
Console::SetCursorPosition(0, 6);
Console::Write("Cerrando...");
}

int main(array<System::String ^> ^args)
{
StringBuilder^ rt = gcnew StringBuilder(127);

// Título de la ventana.
Console::Title = "Control lector de bandeja. C++ CLR";

// Tamaño ventana consola.
Console::WindowWidth = 29; // X. Ancho.
Console::WindowHeight = 8; // Y. Alto.

 // Cursor invisible.
Console::CursorVisible = false;

// Posición del mansaje en la ventana.
Console::SetCursorPosition(0, 0);
Console::WriteLine("Control bandeja del lector : \n\n" +
"A - Abrir bandeja. \n" +
"C - Cerrar bandeja. \n" +
"========================== \n");
//Console::WriteLine("A - Abrir bandeja.");
//Console::WriteLine("C - Cerrar bandeja.");
//Console::Write("==========================");

ConsoleKey key;
//Console::CursorVisible = false;
do
{
key = Console::ReadKey(true).Key;

String^ mensaje = "";

//Asignamos la tecla presionada por el usuario
switch (key)
{
case ConsoleKey::A:
mensaje = "Abriendo...";
Console::SetCursorPosition(0, 6);
DoEvents();
mciSendString("set CDAudio door open", rt, 127, IntPtr::Zero);
mensaje = "Abierto.";
break;

case ConsoleKey::C:
mensaje = "Cerrando...";
Console::SetCursorPosition(0, 6);
DoEvents2();
mciSendString("set CDAudio door closed", rt, 127, IntPtr::Zero);
mensaje = "Cerrado.";
break;
}

Console::SetCursorPosition(0, 6);
Console::Write("           ");
Console::SetCursorPosition(0, 6);
Console::Write(mensaje);

} while (key != ConsoleKey::Escape);
   return 0;
}


Del .net me falta F# y acabo esta curiosidad y retillo que tengo pendiente desde hace vete a saber.

¿Algún atrevido para poder abrir y cerrar la bandeja del lector usando el lenguaje F#?

Tienes que tener iniciativa para empezar y convencido para terminarlo.

Un cordial saludos a todos y a todas. ;)
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

okik

Buen aporte Meta, gracias  ;-)

Lo que no entiendo es porqué al usar el comando "status" mciSendString siempre me devuelve "open"

Código (vbnet) [Seleccionar]

 Const cchReturnLen As UInteger = 255
       Dim sRet As New StringBuilder(CInt(cchReturnLen))
       Dim err As UInteger = mciSendString("status cdaudio mode", sRet, cchReturnLen, IntPtr.Zero)
       MessageBox.Show(sRet.ToString)



Código (vbnet) [Seleccionar]
    <DllImport("winmm.dll")> _
    Private Shared Function mciSendString(sCommand As String, sReturn As StringBuilder, cchReturn As UInteger, hwnd As IntPtr) As UInteger
    End Function


Meta

Hola:

Buscando mciSendString encontré algunas cosas.

Comandos.

status.

¿Qué información quieres sacar exactamente con status?

La verdad no se el motivo.

Mi objeto al tema principal que pregunto. Es conseguir el mismo resultado de abrir y cerrar la bandeja del lector de disco con el lenguaje F#. Puse otros lenguajes que si funciona de C#, VB y C++ para que lo entienda mucha gente. Mi problema que no se hacerlo con F#.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

okik

Cita de: Meta en 16 Noviembre 2017, 09:55 AM
Hola:

Buscando mciSendString encontré algunas cosas.

Comandos.

status.

¿Qué información quieres sacar exactamente con status?

La verdad no se el motivo.

Mi objeto al tema principal que pregunto. Es conseguir el mismo resultado de abrir y cerrar la bandeja del lector de disco con el lenguaje F#. Puse otros lenguajes que si funciona de C#, VB y C++ para que lo entienda mucha gente. Mi problema que no se hacerlo con F#.

Saludos.

mmm no se programar en F# :-\

El objetivo del comando "status" era saber el estado de apertura del lector si abierto o cerrado. Al menos para eso creía yo que serbia.

Meta

Buenas:

También queiro saber lo que buscas, saber si el lector está cerrado o abierto el programa, sea del lenguaje que sea. Por ejemplo, si meto con la mano la bandeja, entra solo y el programa sabe cuando está abierto la bandeja o no. Si tngo l abandeja abierta por Windows, ejecuto después el programa, que detecte si está abierto. Los programas que puse arriba no lo sabe.

¿A lo mejor sysinfo vale para lo que buscas?

Veo que en status has comprobado que no vale.

La cuestión es saber si esa posibilidad que buscamos existe.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#5
Cita de: Meta en 16 Noviembre 2017, 12:06 PMTambién queiro saber lo que buscas, saber si el lector está cerrado o abierto el programa, sea del lenguaje que sea. Por ejemplo, si meto con la mano la bandeja, entra solo y el programa sabe cuando está abierto la bandeja o no. Si tngo l abandeja abierta por Windows, ejecuto después el programa, que detecte si está abierto. Los programas que puse arriba no lo sabe.

La cuestión es saber si esa posibilidad que buscamos existe.

Esto me parece un cachondeo. Tal vez si te molestases en leer las respuestas que te dejo en tus preguntas, entonces ya sabrías de sobra como hacer eso que quieres saber...


Sinceramente, por mi parte no tenía pensado comentar a este tema por que casi siempre haces lo mismo, por las razones que tengas sueles ignorar completamente las soluciones que te dan, o al menos las que yo te ofrezco (error mio por ayudar a quien no sabe valorar) y sigues preguntando como hacer cuando ya tienes la solución. Es que he leido ese comentario que has escrito y me he cabreado, de lo contrario no habría escrito nada directamente... pero no me he podido contener al leer eso que has comentado... ¡es que no me lo puedo creer, si ya se te dijo como hacer lo que pides, pero parece que no te de la gana leer!.

En fin, un saludo. Suerte con esta duda y las futuras dudas que tengas, aquí termina mi intervención y mi ayuda definitivamente, por que estar escribiéndote siempre ejemplos completos para que no sirva absolutamente para resolverte nada (cuando en realidad si que te lo resuelven, simplemente ignoras la ayuda)... no merece la pena seguir ayudando.








Meta

Cita de: okik en 16 Noviembre 2017, 08:41 AM
Buen aporte Meta, gracias  ;-)

Lo que no entiendo es porqué al usar el comando "status" mciSendString siempre me devuelve "open"

Código (vbnet) [Seleccionar]

 Const cchReturnLen As UInteger = 255
       Dim sRet As New StringBuilder(CInt(cchReturnLen))
       Dim err As UInteger = mciSendString("status cdaudio mode", sRet, cchReturnLen, IntPtr.Zero)
       MessageBox.Show(sRet.ToString)



Código (vbnet) [Seleccionar]
    <DllImport("winmm.dll")> _
    Private Shared Function mciSendString(sCommand As String, sReturn As StringBuilder, cchReturn As UInteger, hwnd As IntPtr) As UInteger
    End Function



Hola oki:

Module1.bas:
Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long


frmcd.frm[/U]:
Private Sub Command1_Click()

On Error Resume Next
Command2.Visible = True
Command1.Visible = False
frmcd.Caption = "Abriendo. . . ."
retvalue = mciSendString("set CDAudio door open", returnstring, 127, 0)

End Sub

Private Sub Command2_Click()

On Error Resume Next
Command1.Visible = True
Command2.Visible = False
frmcd.Caption = "Cerrando. . . ."
retvalue = mciSendString("set CDAudio door closed", returnstring, 127, 0)

End Sub

Private Sub Form_Load()

On Error Resume Next
Command1.Visible = True
Command2.Visible = False
frmcd.Caption = "C D . . . "

End Sub


Prueba y nos cuenta.

Poco a poco espero sacar algo del F#.

Haber si le cojo el truco de F# de una vez por todas.
https://msdn.microsoft.com/es-es/library/dd233160(v=vs.120).aspx

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Meta

Hola:

Ya está está solucionado. Hay que leerse bien hasta las narices los tutos estos deF#.
https://msdn.microsoft.com/es-es/library/ee241126(v=vs.110).aspx
https://msdn.microsoft.com/es-es/library/dd233160(v=vs.120).aspx

Código F#:
Código (csharp) [Seleccionar]
// Más información acerca de F# en http://fsharp.org

open System
open System.Runtime.InteropServices
open System.Text;

// importar librería o dll externo.
[<DllImport("winmm.dll")>]
extern int mciSendString(string lpstrCommand, StringBuilder lpstrReturnString,
        int uReturnLength, IntPtr hwndCallback)

let rt = StringBuilder(127)

// Evento.
let DoEvents (transition:string) =
    Console.SetCursorPosition(0, 6)
    Console.Write transition

let action state transition (mensaje:string) =
    Console.SetCursorPosition(0, 6);
    DoEvents transition;
    mciSendString(state, rt, 127, IntPtr.Zero) |> ignore
    Console.SetCursorPosition(0, 6)
    Console.Write("           ")
    Console.SetCursorPosition(0, 6)
    Console.Write(mensaje)

// Pulse letra A para abrir bandeja o C para cerrar bandeja.
let rec loop() =
    match Console.ReadKey(true).Key with
    | ConsoleKey.Escape -> ()
    | ConsoleKey.A -> action "set CDAudio door open" "Abriendo..." "Abierto."
                      loop()
    | ConsoleKey.C -> action "set CDAudio door closed" "Cerrando..." "Cerrado."
                      loop()
    | _ -> loop()

[<EntryPoint>]
let main argv =
    // Título de la ventana.
    Console.Title <- "F#"

    // Tamaño ventana consola.
    Console.WindowWidth <- 29 // X. Ancho.
    Console.WindowHeight <- 8 // Y. Alto.

    // Cursor invisible.
    Console.CursorVisible <- false

    // Posición del mansaje en la ventana.
    Console.SetCursorPosition(0, 0)
    Console.Write(@"Control bandeja del lector:

A - Abrir bandeja.
C - Cerrar bandeja.
===========================")
    loop()
    0 // return an integer exit code


Por cierto. Los códigos GeSHI no inclute F# de este foro.

¿Se incluirán en el futuro y no se puede?

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/