luizf Postado Novembro 12, 2006 Denunciar Share Postado Novembro 12, 2006 Será que alguém pode me dizer como faço para abrir a bandeja do DVD.Sei como abrir a do CD, mas não do DVD.Já procurei dicas em vários sites, mas não encontrei.Muito Obrigado.T+ B) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 paulobergo Postado Novembro 13, 2006 Denunciar Share Postado Novembro 13, 2006 Olá...Uso o código abaixo para abrir o leitor de gravador de CD no trabalho e também o gravador de CD/leitor de DVD em casa: procedure TForm1.BitBtn1Click(Sender: TObject); begin // Adicionar MMSystem; With MediaPlayer1 do Begin If (MediaPlayer1.Mode=mpOpen) then mciSendCommand(MediaPlayer1.DeviceID,MCI_SET, MCI_SET_DOOR_CLOSED,0) Else mciSendCommand(MediaPlayer1.DeviceID,MCI_SET, MCI_SET_DOOR_OPEN,0); {EndIf} End;{With MediaPlayer1} End; Funciona para ambos...Experimenta....Ok? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Novembro 13, 2006 Denunciar Share Postado Novembro 13, 2006 Sei como abrir a do CD, mas não do DVD.luizf, utilizo a função mciSendString que, comumente é utilizada para abrir CD's, funciona perfeitamente em meu gravador de DVD.Dê uma olhada se está sendo retornado algum erro: utilize mciGetErrorString para verificar. Ex.:procedure TForm1.Button1Click(Sender: TObject); var Erro :LongInt; Texto :array[0..128] of char; begin if Boolean(Button1.Tag) then Erro := mciSendString('set cdaudio door closed wait', nil, 0, handle) else Erro := mciSendString('set cdaudio door open wait', nil, 0, handle); if mciGetErrorString(Erro, Texto, SizeOf(Texto)) then ShowMessage(Texto); Button1.Tag := Ord(not Boolean(Button1.Tag)); end;[]s Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 13, 2006 Denunciar Share Postado Novembro 13, 2006 E caso se possua os dois dispositivos? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Novembro 13, 2006 Denunciar Share Postado Novembro 13, 2006 E caso se possua os dois dispositivos?Uma boa pergunta. Acho que teria que utilizar mciSendCommand e definir o dispositivo desejado. Alguém tem como testar? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 13, 2006 Denunciar Share Postado Novembro 13, 2006 Fiz a pergunta pois em casa tenho um computador com os dois dispositivos e com o código tradicional(mencionado acima) ele só abre o gravador de CD. Nos computadores que apresentam apenas um dispositivo ele abre qualquer um que esteja la´. (DVD ou CD) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 paulobergo Postado Novembro 13, 2006 Denunciar Share Postado Novembro 13, 2006 Oi pessoal...Isso é para abrir qualquer unidade pela letra...Só funciona com leitores de CD... não sei porque não funciona com os DVDs... quem quiser se arriscar a descobrir... Unit Unit1; Interface Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MMSystem, StdCtrls, MPlayer; Type TForm1 = class(TForm) MediaPlayer1: TMediaPlayer; Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Var Form1: TForm1; Implementation {$R *.dfm} {********* Abre qualquer unidade (desde que seja CD), pela letra ********} Function OpenCD(Drive: Char): Boolean; Var Res: MciError; OpenParm: TMCI_Open_Parms; Flags: DWORD; S: string; DeviceID: Word; Begin Result := False; S := Drive + ':'; Flags := MCI_OPEN_TYPE or MCI_OPEN_ELEMENT; With OpenParm do Begin dwCallback := 0; lpstrDeviceType := 'CDAudio'; lpstrElementName := PChar(S); End;{with OpenParm} Res := mciSendCommand(0, MCI_OPEN, Flags, Longint(@OpenParm)); if Res <> 0 then Exit; DeviceID := OpenParm.wDeviceID; Try Res := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0); if Res = 0 then Exit; Result := True; Finally mciSendCommand(DeviceID, MCI_CLOSE, Flags, Longint(@OpenParm)); End; End; {********* Fecha qualquer unidade (desde que seja CD), pela letra ********} Function CloseCD(Drive: Char): Boolean; Var Res: MciError; OpenParm: TMCI_Open_Parms; Flags: DWORD; S: string; DeviceID: Word; Begin Result := False; S := Drive + ':'; Flags := MCI_OPEN_TYPE or MCI_OPEN_ELEMENT; With OpenParm do Begin dwCallback := 0; lpstrDeviceType := 'CDAudio'; lpstrElementName := PChar(S); End; Res := mciSendCommand(0, MCI_OPEN, Flags, Longint(@OpenParm)); if Res <> 0 then Exit; DeviceID := OpenParm.wDeviceID; Try Res := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); if Res = 0 then Exit; Result := True; Finally mciSendCommand(DeviceID, MCI_CLOSE, Flags, Longint(@OpenParm)); End; End; {********** Jeito simples ***********} Procedure TForm1.Button1Click(Sender: TObject); Begin mciSendstring('SET CDAUDIO DOOR OPEN WAIT', nil, 0, Self.Handle); End; {********** Abrindo com as funções ***********} Procedure TForm1.Button2Click(Sender: TObject); Begin // Abre quando os dois são CDs.. quando um é dvd, não abre (o dvd)... OpenCD('E'); OpenCD('F'); End; Procedure TForm1.Button3Click(Sender: TObject); Begin // Fecha quando os dois são CDs.. quando um é dvd, não fecha (o dvd)... CloseCD('E'); CloseCD('F'); End; end. Ok? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Novembro 13, 2006 Autor Denunciar Share Postado Novembro 13, 2006 É justamente por isso que quero saber como abrir a bandeja do DVD, pois possuo os dois.Aguardo respostas.Obrigado a todos. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Novembro 15, 2006 Autor Denunciar Share Postado Novembro 15, 2006 Pô pessoal, ninguém sabe?? :( Ainda vou continuar aguardando.T+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Novembro 23, 2006 Autor Denunciar Share Postado Novembro 23, 2006 :( Please........ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 23, 2006 Denunciar Share Postado Novembro 23, 2006 Tente ejetar pelo Shell Application:uses Variants, ComObj; var SA:Variant; begin SA := CreateOleObject('Shell.Application'); SA.NameSpace(17).ParseName('E:\').InvokeVerb('E&ject'); SA := Unassigned; end;Troque 'E:\' pela sua unidade de DVD. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 s3c,testei, mas não funcionou.Tenho os dois dispositivos e não funcionou.Será que é porque tem os dois?A propósito, como poderia descobrir qual o diretório que está instalado o DVD?(Via código é claro?)Porque com esse abaixo: mciSendString('Set cdaudio door open wait', nil, 0, handle); ele abre o dispositivo sempre do cd quando tem os dois e abre o do dvd quando so tem ele.Para fechar é só trocar o opem pelo close.Ou seja, ele não precisa saber qual é a letra onde está o CD. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 uses Variants, ComObj;var SA:Variant;begin SA := CreateOleObject('Shell.Application'); SA.NameSpace(17).ParseName('E:\').InvokeVerb('E&ject'); SA := Unassigned;end;opatestei aqui não funcionou não...aproveitei e já testei nos 2 drive, não abriu nenhum... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 (editado) opaachei um aqui que funcionou aqui, testa aihttp://www.thescripts.com/forum/thread124082.htmlpassando pra delphi seriaprocedure AbreSafado(const Drive: Char; szAcao: String);var szBuff: String;begin szBuff := 'open ' + Drive + ':\ type cdaudio alias DRIVE'; mciSendString(PChar(szBuff), nil, 0, 0); mciSendString(PChar('set DRIVE door ' + szAcao), nil, 0, 0); mciSendString(PChar('close all'), nil, 0, 0);end;ai pra usarAbreSafado('E', 'open');troque o E pela letra do Drive só não consegui fazer fechar, mascomo o amigo quis somente saber como abre HUASHUA talvezajudeé marquei vi que acima já tem isso ai rsr fiz baseado no do s3cmas se eu achar uma maneira melhor eu posto aqui Editado Novembro 24, 2006 por Churc Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 Pessoal, não sei se é o caso mas este código:var SA:Variant; begin SA := CreateOleObject('Shell.Application'); SA.NameSpace(17).ParseName('E:\').InvokeVerb('E&ject'); SA := Unassigned; end;Simula o clique do botão direito do mouse no Explorer em cima do drive E, depois procura por Eject(com o 'j' sublinhado e invoca o comando. Como o meu é o XP em inglês, "Eject" é o comando que aparece no menu popup do Explorer. Vejam se o de vocês é diferente como Ejetar, ou outra coisa qualquer e troquem pelo que aparece. Talvez seja isso. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 s3c,usando SA.NameSpace(17).ParseName('G:\').InvokeVerb('E&jetar'); funciona!!Pena que não teria um análogo para fechar!!Mas, como eu faço para descobrir. via código, qual a letra do DVD.Tem algum código, tipo daqueles ,que descobrem onde está instalado o windows? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 Olá Paulo,1-O seu DVD, pelo Explorer você tem a opção no botão direito do mouse de ejetar ?2-Aonde ele aparece ? abaixo do My Computer no mesmo nível do CDROM ?3-Com que nome ele aparece ?ps: se não tiver a opção de ejetá-lo pelo mouse, acho que Shell Application não servirá. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 ahh sim verdade aqui funcionou também, achei que E&ject fosse comandoe não que tivesse haver com o Ejetar do menu do explorer rsraté tirei o & achando que era erro de escrita...pu.tz o Windows é foda meu, vai vendo os recursos que eleda suporte, olha isso que absurdo uhahuashu :rolleyes: abs Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 Bom, eu tenho apenas um Gravador de DVD, então acho que não estou entendendo direito o problema, pois a alguns posts acima (post do Paulo Bergo) o comando que está aparentemente configurado para executar no CD - cdaudio (ele comenta que funciona apenas com CD) está funcionando com meu gravador. E se eu trocar por digitalvideo ou videodisc não funciona. Alguém tentou com estes antes?Os device types deveriam ser um destes: cdaudio, digitalvideo, videodiscou MCI_DEVTYPE_CD_AUDIO, MCI_DEVTYPE_DIGITAL_VIDEO, MCI_DEVTYPE_VIDEODISC; quando aplicável (msdn).s3c, mas se pode haver problemas com o idima, será que é uma boa saída? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 24, 2006 Denunciar Share Postado Novembro 24, 2006 s3c, mas se pode haver problemas com o idima, será que é uma boa saída?Bom, você pode saber os ítens do menu popup que o Explorer apresenta:var i:Integer; SA:Variant; begin SA := CreateOleObject('Shell.Application'); for i := 0 to SA.NameSpace(17).ParseName('D:\').Verbs.Count-1 do Memo1.Lines.Add(SA.NameSpace(17).ParseName('D:\').Verbs.Item(i).Name); SA := Unassigned; end; Utilizei um TMemo para visualizar, mas a cada iteração do for você pode checar o E&ject pertinente para aquele computador e depois executar o InvokeVerb. Existe outra opção, sabendo-se a letra do drive, mandando diretamente o código de controle para o dispositivo(abrir ou fechar):const IOCTL_Storage_Eject_Media = $002D4808; IOCTL_Storage_Load_Media = $002D480C; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\E:'), Generic_Read or Generic_Write, 0, nil, Open_Existing, 0, 0); DeviceIoControl(hDevice, IOCTL_Storage_Eject_Media, nil, 0, nil, 0, dRet, nil); // Ejeta DeviceIoControl(hDevice, IOCTL_Storage_Load_Media, nil, 0, nil, 0, dRet, nil); // Fecha CloseHandle(hDevice); end;No caso foi utilizado E: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 25, 2006 Denunciar Share Postado Novembro 25, 2006 (editado) Olá, s3cOlá Paulo,1-O seu DVD, pelo Explorer você tem a opção no botão direito do mouse de ejetar ?Sim2-Aonde ele aparece ? abaixo do My Computer no mesmo nível do CDROM ?Abaixo do Meu Computador no mesmo nível do CDROM3-Com que nome ele aparece ?Unidade de DVD-RAM(G:)ps: se não tiver a opção de ejetá-lo pelo mouse, acho que Shell Application não servirá.Mas, eu já havia dito, s3c,no post acima do seu(#16), que funcionou para mim.O que eu disse foi o seguinte:funciona!!Pena que não teria um análogo para fechar!!Mas, como eu faço para descobrir. via código, qual a letra do DVD.Tem algum código, tipo daqueles ,que descobrem onde está instalado o windows?Tem como?Não havendo, a única coisa que me vem a cabeça é fazer uso do velho e amigo registro.Na primeira vez que usar o comando , abre uma tela para o usuário dizer qual a letra correspondente ao seu DVD, grava no registro e sempre que abrir o programa trás ela para o lugar ocupado pelo 'E" no código acima. Alguém tem outra idéia melhor?Testei DeviceIoControl(hDevice, IOCTL_Storage_Load_Media, nil, 0, nil, 0, dRet, nil); // Fecha Aqui não funciona. O compilador esta mandando também as mensagens de que: [Hint] Unit1.pas(91): Value assigned to 'hDevice' never used [Hint] Unit1.pas(89): Variable 'dRet' is declared but never used in 'TForm1.Button4Click' Editado Novembro 25, 2006 por Paulo Nobre Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Bittencourt Muniz Postado Novembro 25, 2006 Denunciar Share Postado Novembro 25, 2006 Legal esse tópico! Segui a dica do s3c ("Shell.Application") e funcionou! O mais legal é que eu não conhecia esse objeto COM/ActiveX chamado 'Shell.Application', interessante.Falows!P.S: Só que eu fiz o teste no VB6. Mas o que importa? É um objeto COM/ActiveX : ) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 25, 2006 Denunciar Share Postado Novembro 25, 2006 Unidade de DVD-RAM(G:)Mesmo trocando a unidade por G:\ não funciona?Se não funcionar, tente acessar o ítem pelo nome que aparece:var i:Integer; SA:Variant; begin SA := CreateOleObject('Shell.Application'); for i := 0 to SA.NameSpace(17).Items.Count-1 do begin if Pos('DVD-RAM', SA.NameSpace(17).Items.Item(i).Name) > 0 then SA.NameSpace(17).Items.Item(i).InvokeVerb('E&jetar'); end; SA := Unassigned; end; DeviceIoControl(hDevice, IOCTL_Storage_Load_Media, nil, 0, nil, 0, dRet, nil); // Fecha Aqui não funciona. O compilador esta mandando também as mensagens de que: [Hint] Unit1.pas(91): Value assigned to 'hDevice' never used [Hint] Unit1.pas(89): Variable 'dRet' is declared but never used in 'TForm1.Button4Click'Esses dois Hints acho que estão dizendo que ele está executando CreateFile mas não está executando DeviceIoControl. Poste o código do Button4Click. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Novembro 25, 2006 Denunciar Share Postado Novembro 25, 2006 s3c, essa idéia do uso do uso de DeviceIOControl (IOCTL) mais interessante, já que não depende de questões como idioma, o que torna mais genérico seu uso.Ficamos de quaquer modo, para ambas as opções, com a questão de saber qual a letra do CD ou DVD, certo?!Então, eu havia encontrado no site ma Micro$oft um exemplo de como obter informações, justamente utilizando recursos IOCTL, sobre como descobrir quantos, quais e detalhes dos drivers de CD's instalados. O detalhe é que achei o código meio comprido, em C++ e estou meio sem tempo para converter. Talvez algum colega, se habilite a dar uma enxugada no código de modo apenas a obter os drivers (respectivas letras) para serem utizados com com a opção que você postou utilizando IOCTL.[]s Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 25, 2006 Denunciar Share Postado Novembro 25, 2006 s3c, essa idéia do uso do uso de DeviceIOControl (IOCTL) mais interessante, já que não depende de questões como idioma, o que torna mais genérico seu uso.Ficamos de quaquer modo, para ambas as opções, com a questão de saber qual a letra do CD ou DVD, certo?!Pelo DeviceIOControl acho que sim, por outro lado, pelo Shell.Application, você consegue pesquisar o nome do FolderItem e aplicar o InvokeVerb sem saber a letra:var i:Integer; SA:Variant; begin SA := CreateOleObject('Shell.Application'); for i := 0 to SA.NameSpace(17).Items.Count-1 do begin if Pos('DVD-RAM', SA.NameSpace(17).Items.Item(i).Name) > 0 then SA.NameSpace(17).Items.Item(i).InvokeVerb('E&jetar'); end; SA := Unassigned; end;É claro que para um código que funcione em qualquer máquina, devem ser checados os possíveis nomes que possam vir de CD e DVD; o que tornaria uma rotina bastante trabalhosa, além do que você só consegue ejetar a unidade.Talvez pelo IOCTL e CreateFile retornando um Handle válido, o DeviceIOControl seria a forma mais direta e eficaz de abrir e fechar as bandejas. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 25, 2006 Denunciar Share Postado Novembro 25, 2006 s3cPara abrir está funcionando normalmente!!Para fechar, não.O código do button4click é: procedure TForm1.Button4Click(Sender: TObject); const IOCTL_Storage_Eject_Media = $002D4808; IOCTL_Storage_Load_Media = $002D480C; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\g:'), Generic_Read or Generic_Write, 0, nil, Open_Existing, 0, 0); //DeviceIoControl(hDevice, IOCTL_Storage_Eject_Media, nil, 0, nil, 0, dRet, nil); // Ejeta DeviceIoControl(hDevice, IOCTL_Storage_Load_Media, nil, 0, nil, 0, dRet, nil); // Fecha CloseHandle(hDevice); end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
luizf
Será que alguém pode me dizer como faço para abrir a bandeja do DVD.
Sei como abrir a do CD, mas não do DVD.
Já procurei dicas em vários sites, mas não encontrei.
Muito Obrigado.
T+ B)
Link para o comentário
Compartilhar em outros sites
46 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.