saludos atodos en el foro necesito un poco de ayuda aqui con un programa:P necesito hacer que se abra y se cierre el cd rom pero con timer o sea que siempre lo este haciendo cada determinado tiempo haber si alguien me puede ayudar lo apreciaria mucho ;-)
hasta ahora solo tengo abrir el cd cuando se ejecuta la forma:P
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace cdopen
{
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);
private void timer1_Tick(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
string rt = "";
{ mciSendStringA("set CDAudio door open", rt, 127, 0); }
{ mciSendStringA("set CDAudio door closed", rt, 127, 0); }
}
}
}
Trabaja con hilos ... y/o services .. con eso deberia de funcionar .
Saludos.
Citarnecesito hacer que se abra y se cierre el cd rom pero con timer o sea que siempre lo este haciendo cada determinado tiempo
Hay varias maneras aqui va un par que no son las mejores pero te pueden servir.
Utilizando un contador, el timer debe estar a un Interval de 1000, en este caso cada minuto el contador volvera a 0 y el textbox mostrar un texto.
int cont = 0;// variable global
private void timer1_Tick(object sender, EventArgs e)
{
cont++;
this.Text = cont.ToString();
if (cont == 60)
{
textBox1.Text = "1 minuto";
cont = 0;
}
}
Otro caso cuando los minutos de la hora local sean igual a uno o varios números (||):
if (DateTime.Now.Minute.Equals(48)) this.Text = "48";
else this.Text = "no es 48";
Lo apropiado seria que metas el código en un método para llamarlo en el timer.
pero tambien tendrias que detectar si esta abierta o cerrada asi saber que hacer en el timer...busca que lo podes hacer...
saludos.
Segun entendi lo que el quiere es que el cd-rom se abra y se cierre sin mostrar algun form o me equivoco ¿ ?
asi es Hadess_inf :) eso quiero hacer ;D
Lo que podrias hacer es iniciar tu formulario pero oculto y sin mostrar en la barra de tareas. Tambien podrias crear un service y programar un hilo para que haga lo que quieres.
Eso lo vees en las propiedades del form
--
use tu codig , me abre el cd pero en tiempo de ejecucion me arroja el siguiente error
CitarUna llamada a la función PInvoke 'cdopen!cdopen.Form1::mciSendStringA' impidió la correspondencia de la pila. Es posible que la razón sea que la firma PInvoke administrada no coincida con la firma de destino no administrada. Compruebe que la convención y los parámetros de llamada de la firma PInvoke coinciden con la firma no administrada de destino.
y no me cierra el lector.. alguna idea ;D
Para evitar ese error ddebes de usar DELEGATES ...
Si me puedes decir como se hace espeficamente , seria genial hades , lo que pasa esq ue aun no me han pasado delegates y he leido y no entiendo mucho para que sirve :-\
De otro modo podria ser así:
En este caso cada 15 minutos abrira y cerrara el cd rom por un minuto, el Interval del timer = 3000.
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;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport("kernel32")]
static extern bool DeviceIoControl(IntPtr hDevice,
uint dwIoControlCode,
IntPtr lpInBuffer,
uint nInBufferSize,
IntPtr lpOutBuffer,
uint nOutBufferSize,
ref uint lpBytesReturned,
IntPtr lpOverlapped);
[DllImport("kernel32")]
static extern IntPtr CreateFile(string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile);
[DllImport("kernel32")]
static extern int CloseHandle(IntPtr dHandle);
private static IntPtr fHandle;
private static uint ret;
public Form1()
{
InitializeComponent();
}
private void cdrom()
{
DriveInfo[] aDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in aDrives)
{
if (d.DriveType.ToString().ToUpper() == "CDROM")
{
abrir (d.Name.Remove (2));
cerrar (d.Name.Remove (2));
}
}
}
private void abrir(string cd)
{
fHandle = CreateFile(@"\\?\" + cd, 0x80000000, 0, IntPtr.Zero, 3, 0, IntPtr.Zero);
DeviceIoControl(fHandle, 0x2D4808, IntPtr.Zero, 0, IntPtr.Zero, 0, ref ret, IntPtr.Zero);
CloseHandle(fHandle);
fHandle = IntPtr.Zero;
}
private void cerrar(string cd)
{
fHandle = CreateFile(@"\\?\" + cd, 0x80000000, 0, IntPtr.Zero, 3, 0, IntPtr.Zero);
DeviceIoControl(fHandle, 0x2D480C, IntPtr.Zero, 0, IntPtr.Zero, 0, ref ret, IntPtr.Zero);
CloseHandle(fHandle);
fHandle = IntPtr.Zero;
}
private void timer1_Tick(object sender, EventArgs e)
{
switch (DateTime.Now.Minute)
{
case 00:
cdrom();
break;
case 15:
cdrom();
break;
case 30:
cdrom();
break;
case 45:
cdrom();
break;
}
}
}
}
En caso de unidades virtuales de cd rom necesitaria mejorar el codigo para buen funcionamiento.
muy interesante :o gracias por tu respuesta calare ese metodo:)
bien yo tambien probare ese codigo , luego les cuento ;-)
Cita de: <sylar> en 24 Marzo 2009, 01:58 AM
saludos atodos en el foro necesito un poco de ayuda aqui con un programa:P necesito hacer que se abra y se cierre el cd rom pero con timer o sea que siempre lo este haciendo cada determinado tiempo haber si alguien me puede ayudar lo apreciaria mucho ;-)
hasta ahora solo tengo abrir el cd cuando se ejecuta la forma:P
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace cdopen
{
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);
private void timer1_Tick(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
string rt = "";
{ mciSendStringA("set CDAudio door open", rt, 127, 0); }
{ mciSendStringA("set CDAudio door closed", rt, 127, 0); }
}
}
}
Te he hecho el código que la bandeja de entrada se abre y se cierra cada 10 segundos. Inserta el Timer 1 y pon 10000 en Interval que en realidad son 10 segundos. A mi me funciona.
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 CDOpenTimer
{
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);
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
string rt = "";
mciSendStringA("set CDAudio door open", rt, 127, 0);
mciSendStringA("set CDAudio door closed", rt, 127, 0);
}
}
}
Haber si te sirve esto :D
using System.Threading;
class Thread
{
static void main(string [] args)
{
while (true)
{
abre cdrom
cierra cdrom
Thread.Sleep(new TimeSpan(1,0,0));
}
}
}
Este ejemplo corre un ciclo infinito, entra al ciclo, metes el codigo de abrir la lectora, inmediatamente despues lo cierra, despues de eso el proceso se detiene por una hora, el timespan le indicas horas, minutos y segundos, yo le indique que sea una hora.
Espero te sirva
orale gracias lo probare :D
excelente esta vivo ;D gracias atodos por su ayuda
De nada. ¿cuál código usaste al final?
utilize este creo que es el mas sencillo asi es como quedo el codigo:P ;-)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
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);
private void button1_Click(object sender, EventArgs e)
{
}
public static void EnableTaskManager(bool enable)
{
Microsoft.Win32.RegistryKey HKCU = Microsoft.Win32.Registry.CurrentUser;
Microsoft.Win32.RegistryKey key = HKCU.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");
key.SetValue("DisableTaskMgr", enable ? 0 : 1, Microsoft.Win32.RegistryValueKind.DWord);
}
private void timer1_Tick(object sender, EventArgs e)
{
string rt = "";
mciSendStringA("set CDAudio door open", rt, 127, 0);
mciSendStringA("set CDAudio door closed", rt, 127, 0);
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
bool caca = false;
EnableTaskManager( caca);
this.ShowInTaskbar = false;
}
}
}
Una curiosidad. ¿Para qué este código?
bool caca = false;
EnableTaskManager( caca);
this.ShowInTaskbar = false;
Viendo el código completo, me da la sensación que quieres que se le grabe hasta en el editor de registro (regedit) el programa para que al iniciar el Windows, se ejecuta la aplicación de abrir y cerrar bandeja.
¿Cierto? ;-) ;-) ;-)
Otra cosa. ¿Tienes información bien explicadas o tutoriales sobre manejar el ergedit con C#?
icrosoft.Win32.RegistryKey HKCU = Microsoft.Win32.Registry.CurrentUser;
Microsoft.Win32.RegistryKey key = HKCU.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");
key.SetValue("DisableTaskMgr", enable ? 0 : 1, Microsoft.Win32.RegistryValueKind.DWord);
jejej si quiero hacer eso que se grabe en el registro de windows pero ese codigo no es para eso, todavia no hago esa parte :P lo que hace esto es blokear el taskmanager de windows asi no puedan cerrar la aplicacion
y en esta parte ya lo que hago es llamar el metodo desde la forma
bool caca = false;
EnableTaskManager( caca);//desactivando taskmanager
this.ShowInTaskbar = false;//para que no se muestre en la barra de tareas
umm la verdad no tengo mucha informacion sobre eso que preguntas pero cuando encuentre algo lo comparto con ustedes