elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Hacer funcionar el lector de bandeja de discos con este lenguaje .net
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Hacer funcionar el lector de bandeja de discos con este lenguaje .net  (Leído 6,552 veces)
Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Hacer funcionar el lector de bandeja de discos con este lenguaje .net
« en: 15 Noviembre 2017, 21:59 pm »

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#:
Código:
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:
Código:
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:
Código:
#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. ;)


« Última modificación: 16 Noviembre 2017, 08:39 am por Meta » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Hacer funcionar el lector de bandeja de discos con este lenguaje .net
« Respuesta #1 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
  1.  Const cchReturnLen As UInteger = 255
  2.        Dim sRet As New StringBuilder(CInt(cchReturnLen))
  3.        Dim err As UInteger = mciSendString("status cdaudio mode", sRet, cchReturnLen, IntPtr.Zero)
  4.        MessageBox.Show(sRet.ToString)
  5.  


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


« Última modificación: 16 Noviembre 2017, 08:43 am por okik » En línea

Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Hacer funcionar el lector de bandeja de discos con este lenguaje .net
« Respuesta #2 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.
« Última modificación: 16 Noviembre 2017, 10:04 am por Meta » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Hacer funcionar el lector de bandeja de discos con este lenguaje .net
« Respuesta #3 en: 16 Noviembre 2017, 11:24 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.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Hacer funcionar el lector de bandeja de discos con este lenguaje .net
« Respuesta #4 en: 16 Noviembre 2017, 12:06 pm »

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.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Hacer funcionar el lector de bandeja de discos con este lenguaje .net
« Respuesta #5 en: 16 Noviembre 2017, 15:14 pm »

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.

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.
« Última modificación: 16 Noviembre 2017, 16:34 pm por Eleкtro » En línea



Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Hacer funcionar el lector de bandeja de discos con este lenguaje .net
« Respuesta #6 en: 18 Noviembre 2017, 01:51 am »

Buen aporte Meta, gracias  ;-)

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

Código
  1.  Const cchReturnLen As UInteger = 255
  2.        Dim sRet As New StringBuilder(CInt(cchReturnLen))
  3.        Dim err As UInteger = mciSendString("status cdaudio mode", sRet, cchReturnLen, IntPtr.Zero)
  4.        MessageBox.Show(sRet.ToString)
  5.  


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


Hola oki:

Module1.bas:
Código:
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]:
Código:
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.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Hacer funcionar el lector de bandeja de discos con este lenguaje .net
« Respuesta #7 en: 19 Noviembre 2017, 01:52 am »

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
  1. // Más información acerca de F# en http://fsharp.org
  2.  
  3. open System
  4. open System.Runtime.InteropServices
  5. open System.Text;
  6.  
  7. // importar librería o dll externo.
  8. [<DllImport("winmm.dll")>]
  9. extern int mciSendString(string lpstrCommand, StringBuilder lpstrReturnString,
  10.        int uReturnLength, IntPtr hwndCallback)
  11.  
  12. let rt = StringBuilder(127)
  13.  
  14. // Evento.
  15. let DoEvents (transition:string) =
  16.    Console.SetCursorPosition(0, 6)
  17.    Console.Write transition
  18.  
  19. let action state transition (mensaje:string) =
  20.    Console.SetCursorPosition(0, 6);
  21.    DoEvents transition;
  22.    mciSendString(state, rt, 127, IntPtr.Zero) |> ignore
  23.    Console.SetCursorPosition(0, 6)
  24.    Console.Write("           ")
  25.    Console.SetCursorPosition(0, 6)
  26.    Console.Write(mensaje)
  27.  
  28. // Pulse letra A para abrir bandeja o C para cerrar bandeja.
  29. let rec loop() =
  30.    match Console.ReadKey(true).Key with
  31.    | ConsoleKey.Escape -> ()
  32.    | ConsoleKey.A -> action "set CDAudio door open" "Abriendo..." "Abierto."
  33.                      loop()
  34.    | ConsoleKey.C -> action "set CDAudio door closed" "Cerrando..." "Cerrado."
  35.                      loop()
  36.    | _ -> loop()
  37.  
  38. [<EntryPoint>]
  39. let main argv =
  40.    // Título de la ventana.
  41.    Console.Title <- "F#"
  42.  
  43.    // Tamaño ventana consola.
  44.    Console.WindowWidth <- 29 // X. Ancho.
  45.    Console.WindowHeight <- 8 // Y. Alto.
  46.  
  47.    // Cursor invisible.
  48.    Console.CursorVisible <- false
  49.  
  50.    // Posición del mansaje en la ventana.
  51.    Console.SetCursorPosition(0, 0)
  52.    Console.Write(@"Control bandeja del lector:
  53.  
  54. A - Abrir bandeja.
  55. C - Cerrar bandeja.
  56. ===========================")
  57.    loop()
  58.    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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines