Autor
|
Tema: Hacer funcionar el lector de bandeja de discos con este lenguaje .net (Leído 6,598 veces)
|
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.
|
|
« Última modificación: 16 Noviembre 2017, 08:39 am por Meta »
|
En línea
|
|
|
|
okik
Desconectado
Mensajes: 462
|
Buen aporte Meta, gracias Lo que no entiendo es porqué al usar el comando "status" mciSendString siempre me devuelve "open" 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)
<DllImport("winmm.dll")> _ Private Shared Function mciSendString(sCommand As String, sReturn As StringBuilder, cchReturn As UInteger, hwnd As IntPtr) As UInteger End Function
|
|
« Última modificación: 16 Noviembre 2017, 08:43 am por okik »
|
En línea
|
|
|
|
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.
|
|
« Última modificación: 16 Noviembre 2017, 10:04 am por Meta »
|
En línea
|
|
|
|
okik
Desconectado
Mensajes: 462
|
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
|
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
Mensajes: 9.885
|
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
|
Buen aporte Meta, gracias Lo que no entiendo es porqué al usar el comando "status" mciSendString siempre me devuelve "open" 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)
<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.
|
|
|
En línea
|
|
|
|
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#: // 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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Como hacer funcionar este batch perfectamente?
« 1 2 ... 6 7 »
Scripting
|
SoloAki
|
60
|
35,041
|
12 Abril 2008, 02:09 am
por SoloAki
|
|
|
Bandeja de Lector XBOX360 con problemas
Electrónica
|
Diabliyo
|
1
|
5,668
|
20 Agosto 2010, 05:00 am
por Ari Slash
|
|
|
buena me podrian dar una idea de como hacer este proyecto de lenguaje
Programación C/C++
|
eduardo17445
|
3
|
2,638
|
24 Enero 2015, 03:56 am
por rir3760
|
|
|
Cerrar y abrir la bandeja del lector con el botón manualmente, y que lo sepa C#
.NET (C#, VB.NET, ASP)
|
Meta
|
5
|
3,161
|
23 Marzo 2017, 14:16 pm
por Eleкtro
|
|
|
Detectar cuando la bandeja del lector está abierta o cerrada
.NET (C#, VB.NET, ASP)
|
Meta
|
5
|
6,252
|
19 Noviembre 2017, 03:06 am
por okik
|
|