Abrir y cerrar bandeja.

Iniciado por Meta, 17 Mayo 2009, 19:44 PM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hello.

Trabajo con el Visual C# Express 2008. ¿Se puede hacer con un Firm1 y dos button abrir y cerrar la bandeja de un lector de disco del PC?

Si es posible. ¿Cómo se hace?

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

Myth.ck

Hola meta te refieres a esto?:

Código (csharp) [Seleccionar]
using System;
using System.Text;
using System.Runtime.InteropServices;

namespace EjectMedia
{
class Program
{
static void Main(string[] args)
{
// My CDROM is on drive E:
EjectMedia.Eject(@"\\.\E:");
}
}

class EjectMedia
{
// Constants used in DLL methods
const uint GENERICREAD = 0x80000000;
const uint OPENEXISTING = 3;
const uint IOCTL_STORAGE_EJECT_MEDIA = 2967560;
const int INVALID_HANDLE = -1;


// File Handle
private static IntPtr fileHandle;
private static uint returnedBytes;

// Use Kernel32 via interop to access required methods

// Get a File Handle
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr CreateFile(string fileName,
uint desiredAccess,
uint shareMode,
IntPtr attributes,
uint creationDisposition,
uint flagsAndAttributes,
IntPtr templateFile);

[DllImport("kernel32", SetLastError=true)]
static extern int CloseHandle(IntPtr driveHandle);

[DllImport("kernel32", SetLastError = true)]
static extern bool DeviceIoControl(IntPtr driveHandle,
uint IoControlCode,
IntPtr lpInBuffer,
uint inBufferSize,
IntPtr lpOutBuffer,
uint outBufferSize,
ref uint lpBytesReturned,
IntPtr lpOverlapped);


public static void Eject(string driveLetter)
{
try
{
// Create an handle to the drive
fileHandle = CreateFile(driveLetter,
GENERICREAD,
0,
IntPtr.Zero,
OPENEXISTING,
0,
IntPtr.Zero);

if ((int)fileHandle != INVALID_HANDLE)
{
// Eject the disk
DeviceIoControl(fileHandle,
IOCTL_STORAGE_EJECT_MEDIA,
IntPtr.Zero, 0,
IntPtr.Zero, 0,
ref returnedBytes,
IntPtr.Zero);
}

}
catch
{
throw new Exception(Marshal.GetLastWin32Error().ToString());
}
finally
{
// Close Drive Handle
CloseHandle(fileHandle);
fileHandle = IntPtr.Zero;
}
}


}
}

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.

Myth.ck

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.

Meta

Gracias, dejo el código más simple.

El primer código que me pusiste lo veo muy grande y complejo.

Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CD_Control
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("winmm.dll", EntryPoint = "mciSendStringA")]
        public static extern void mciSendStringA(string lpstrCommand,
            string lpstrReturnString, long uReturnLength, long hwndCallback);
        //Why did i put this here?
        string rt = "";
        private void button1_Click(object sender, EventArgs e)
        {
            mciSendStringA("set CDAudio door open PROBANDO", rt, 127, 0);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            mciSendStringA("set CDAudio door closed PROBANDO", rt, 127, 0);
        }
    }
}


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

Myth.ck

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.

raul338

Hola!

no estoy seguro si tengo que abrir otro hilo. Pero esta es mi pregunta. Hay alguna forma de saber en verdad si la bandeja de cd esta abierta o cerrada??

Ejemplo, al codigo de aplicacion poner un timer que refresce en un label y este diga su estado (abierto/cerrado). O a travez de un Hook. Estuve buscando pero no salio nada....

alguien tiene alguna idea de como saberlo???

Meta

#6
Deja investigar a ver. Para mi lo del Timer no hace falta. Ahora te cuento.

EDITO:

Lo he probado. Inserta un label1. Al pulsar abrir la bandeja de abre y cuando termina de abrirse del todo, dice Abierto. Lo mismo al cerrarlo.

No hace falta nada de Timer, se comporta como lo tuviera.

Si te ha servido, hazlo saber. Gracias.

Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CD_Control
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       [DllImport("winmm.dll", EntryPoint = "mciSendStringA")]
       public static extern void mciSendStringA(string lpstrCommand,
           string lpstrReturnString, long uReturnLength, long hwndCallback);
       //Why did i put this here?
       string rt = "";
       private void button1_Click(object sender, EventArgs e)
       {
           mciSendStringA("set CDAudio door open", rt, 127, 0);
           label1.Text = "Abierto";
       }

       private void button2_Click(object sender, EventArgs e)
       {
           mciSendStringA("set CDAudio door closed", rt, 127, 0);
           label1.Text = "Cerrado";
       }
   }
}

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

raul338

 ::) No me entendiste meta  ;D

Lo que yo quiero lograr es algo asi:

· Presiono el botón1
Abre la bandeja y en el label aparece "abierto"

· Cierro la bandeja en forma manual (el boton de la lectora  :P o yo mismo empujo la bandeja  :xD etc)

quiero que aparezca "cerrado" en el label automáticamente

Y estoy si se tiene que poder (el mismo windows lo hace, sino como lee el autorun ¬¬)

Meta

Averiguando si se puede hacer lo que pides...
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

h0oke

Lo que pregunta raul338 es por lógica, tendría que pensar un poquito más. Pero meta, estuve buscando documentación sobre la función:

Citarfunction mciSendStringA(

  x1: LPCSTR;

  x2: LPSTR;

  x3: UINT;

  x4: HWND

):MCIERROR;

¿Cuál es el valor de retorno si falla? NULL?