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 s3c Postado Novembro 25, 2006 Denunciar Share Postado Novembro 25, 2006 Olá Paulo, após o CreateFile coloque: ShowMessage(IntToStr(hDevice)); E poste o número que aparece. 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 Olá Paulo, após o CreateFile coloque:CODE ShowMessage(IntToStr(hDevice));E poste o número que aparece.Olá,s3c,O número que aparece é o 4294967295 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Novembro 25, 2006 Autor Denunciar Share Postado Novembro 25, 2006 E aí pessoal, beleza.Obrigado pela atenção, aguardo respostas.Parece que tá meio difícil de abrir e fechar a bandeja do DVD, mas ...T+ 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 Parece que tá meio difícil de abrir e fechar a bandeja do DVD, mas ...Realmente luizf não está fácil não, mas mesmo que não se consiga a resposta total, estetópico foi muito enriquecedor na minha opinião, principalmente aquela parte postada pelo s3c, para obtera lista das opções obtidas com o botão direiot do mouse(simulação).Repare que já se tem como abrir a gaveta do DVD, tá faltando obter como se fecha. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 26, 2006 Denunciar Share Postado Novembro 26, 2006 Parece que tá meio difícil de abrir e fechar a bandeja do DVD, mas ...mas luizf pra que você quer que seu programa faça com que a bandeja fecha sendo que se ela abre pro usuário por ou tirar o dvd, então impossível um programa saber se ele já colocou ou tirou, então acho que cabe ao usuário fechar e não ao sistema, onde entre ele clicar em um botao no seu sistema pra fechar a gaveta ou fecha-la manualmente é mais conveniente fechar manualmente pois ele vai tar colocando ou tirando um dvd mesmo, já vai estar com a mão na massa rsr Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 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.s3c, aparentemente não há problemas com o abrir e fechar pelo menos com o W2K e XP, mas fico em dúvida se funcionaria com as versões anteriores (tentarei testar no Me amanhã) porque pela nota que lí no final deste artigo (msdn - Calling DeviceIoControl), há risco de não funcionar (tem que testar para comprovar).Mas, como eu faço para descobrir. via código, qual a letra do DVD.Paulo, Considerando a questão de compatibilidade, há um meio simples de listar as unidades de disco ótico (CD/DVD), através da combinação das funções da API GetLogicalDriveStrings e GetDriveType. O exemplo abaixo adiciona a uma lista a letra dos dipositivos óticos encontrados:procedure TForm1.Button1Click(Sender: TObject); var pIdx :PChar; sDrives :array[0..255] of char; sDrive :string; begin if GetLogicalDriveStrings(SizeOf(sDrives)-1, sDrives) > 0 then begin pIdx := sDrives; while pIdx^ <> '' do begin sDrive := Copy(pIdx, 1, 2); if GetDriveType(PChar(sDrive)) = DRIVE_CDROM then ListBox1.Items.Add('(CD/DVD) '+sDrive); Inc(pIdx, 4); end; end; end;Entretanto para saber se é um dispositivo de DVD ou CD, a coisa novamente complica um pouco. Utilizando das funções IOCTL só conseguimos a resposta correta a partir do W2K. Se interessar a alguém, tem uma versão em VB neste linkParece que tá meio difícil de abrir e fechar a bandeja do DVD, mas ...mas luizf pra que você quer que seu programa faça com que a bandeja fecha sendo que se ela abre pro usuário por ou tirar o dvd, então impossível um programa saber se ele já colocou ou tirou, então acho que cabe ao usuário fechar e não ao sistema, onde entre ele clicar em um botao no seu sistema pra fechar a gaveta ou fecha-la manualmente é mais conveniente fechar manualmente pois ele vai tar colocando ou tirando um dvd mesmo, já vai estar com a mão na massa rsrChurc, dá para saber sim se há ou não um CD na bandeja dentro do gabinete. O lance é processar a mensagem WM_DEVICECHANGE. O parâmetro DBT_DEVICEARRIVAL só chega quando a gaveta é fechada e tem uma mídia dentro. Tem um exemplo completo na página do Torry's (link)[]s Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Churc, dá para saber sim se há ou não um CD na bandeja dentro do gabinete. O lance é processar a mensagem WM_DEVICECHANGE. O parâmetro DBT_DEVICEARRIVAL só chega quando a gaveta é fechada e tem uma mídia dentro. Tem um exemplo completo na página do Torry's (link)Ah sim, mas não quis dizer nesse sentido, seria no sentido de quando o usuário colocar o dvd, sem fechar a gaveta...Pois a questão que mencionei é pra que ele quer que o sistema fecha a gaveta se o usuário vai ter que colocar o dvd na gaveta... entendeu? rsrEntretanto para saber se é um dispositivo de DVD ou CD, a coisa novamente complica um pouco. Utilizando das funções IOCTL só conseguimos a resposta correta a partir do W2K. Se interessar a alguém, tem uma versão em VB neste linkmuito boa essa dica ;) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Ah sim, mas não quis dizer nesse sentido, seria no sentido de quando o usuário colocar o dvd, sem fechar a gaveta...Pois a questão que mencionei é pra que ele quer que o sistema fecha a gaveta se o usuário vai ter que colocar o dvd na gaveta... entendeu? rsr#&%#@!!! Foi mal, entendi errado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 #&%#@!!! Foi mal, entendi errado.da nada, nem tem muito haver o que eu falei, é que tem bastante informação neste tópico, e ao meu entender o criador do tópico fez um ar de não satisfeito e desprezo rsr, ai por isso questionei sobre o porque ele quer que fecha a bandeja, não tem muito sentido... rsr Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Entretanto para saber se é um dispositivo de DVD ou CD, a coisa novamente complica um pouco. Utilizando das funções IOCTL só conseguimos a resposta correta a partir do W2K.Então se alguém souber o código, mesmo para XP apenas, poderia postar.Mesmo que só para uso particular para quem tem XP, já serviria.Em último caso, mesmo muito deselegantemente apelaria para a sugestão que dei num post anterior, embora não seja uma alternativa típica de um programadorNão havendo, a única coisa que me vem a cabeça é fazer uso do velho e amigo registro.Na primeira vez que o usuário 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, fornecido pelo s3c. O único problema é que não está funcionado para fechar a gaveta. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Olá Paulo, após o CreateFile coloque:CODE ShowMessage(IntToStr(hDevice));E poste o número que aparece.Olá,s3c,O número que aparece é o 4294967295Isto indica um Handle inválido e ao que parece CreateFile não está entendendo sua unidade g:, logo DeviceIoControl não funcionará nem para abrir, nem para fechar; assim como Shell.Application não entende ParseName('g:\').Outra sugestão seria retornar a letra do Drive(se é que existe neste caso) utilizando WMI. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 s3c, algo muito estranho então deve estar acontecendo, pois estou conseguindo abrir o DVD.Só fechar é que não. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Então se alguém souber o código, mesmo para XP apenas, poderia postar.Mesmo que só para uso particular para quem tem XP, já serviria.OpaMas então, esse código funciona pra XP porque é a partir do Windows 2000, então ai se inclui, 2000, NT, XP, 2003, Vista Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 s3c, algo muito estranho então deve estar acontecendo, pois estou conseguindo abrir o DVD.Só fechar é que não.Você consegue abrir pelo Shell.Application ou pelo DeviceIoControl ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 pelo DeviceIoControl ...Consigo abrir usando o código abaixo, que você forneceu: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;Quando uso para fecharconst 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;Nada acontece.PS: Desculpem não estar colocando os cotes, mas neste computador que estou eles não estão funcionando!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Paulo, retire Generic_Write, deixe somente Generic_Read; após CreateFile coloque: ShowMessage(SysErrorMessage(GetLastError));Com a bandeja aberta, chame o programa e execute somente o botão para fechar, veja qual a mensagem e clique em Ok. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 s3c, a mensagem é a seguinte:O arquivo já está sendo usado por outro processo.s3c, só para resumir tudo.Estou conseguindo abrir a gaveta do DVD por três códigos:PRIMEIRO(Fornecido por você) procedure TForm1.Button1Click(Sender: TObject); //uses Variants, ComObj; var SA:Variant; begin SA := CreateOleObject('Shell.Application'); //SA.NameSpace(17).ParseName('G:\').InvokeVerb('E&ject'); SA.NameSpace(17).ParseName('G:\').InvokeVerb('E&jetar'); SA := Unassigned; end; SEGUNDO(Fornecido por você) procedure TForm1.Button3Click(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; TERCEIRO(Fornecido pelo Churc) procedure TForm1.Button2Click(Sender: TObject); begin AbreSafado('G', 'open'); end; procedure 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; Problemas até agora para mim1) Não consigo fechar com nenhum código.2) Não consigo pegar a letra do DVD.Fiz esse resumo para facilitar até pra mim mesmo quando ficar consultando os códigos e tambémpara facilitar aos que, como eu, tem menos experiência na procura.Agora observe que coisa curiosa:SE abrir pelo código 1 e mandar fechar depois pelo código que estamos analisando ele não fecha mais a mensagem agora é A operação foi concluida com êxitoOutra coisa se usar o código 1 para abrir, fechar manualmente é claro e depois tentar abrir pelo código 2ele não abre. Tenho que fechar o programa abrir novamente e mandar abrir o dvd pelo código 2, aí sim ele abre. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Pode ser que ele não esteja liberando o Handle alocado; se não for isso, realmente não sei o que possa ser. Tente assim:Abrir:const IOCTL_Storage_Eject_Media = $002D4808; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\G:'), Generic_Read, File_Share_Read, nil, Open_Existing, 0, 0); DeviceIoControl(hDevice, IOCTL_Storage_Eject_Media, nil, 0, nil, 0, dRet, nil); CloseHandle(hDevice); end; Fechar:const IOCTL_Storage_Load_Media = $002D480C; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\G:'), Generic_Read, File_Share_Read, nil, Open_Existing, 0, 0); DeviceIoControl(hDevice, IOCTL_Storage_Load_Media, nil, 0, nil, 0, dRet, nil); CloseHandle(hDevice); end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Não funcionou.Deixa prá lá!Obrigado , s3c. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 É, se ele abre mas não fecha, também pode ser algum outro código IOCTL para DVD. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 É, se ele abre mas não fecha, também pode ser algum outro código IOCTL para DVD.É realmente, s3c, pode ser que seja outro código.Quem deve ter preocupação com este tipo de código são desenvolvedores de programas de players.Na realidade este tópico acabou virando uma fixação para muitos de nós, mas como o Churc, mencionou em um dos post, o principal seria saber abrir, pois como você vai tirar a mão do teclado ou mouse para colocar o DVD, então é só empurrar a gaveta. E mais um detalhe, em NOTEBOOK, este código nem teria sentido. O que achei muito interessante e que será aproveitado em códigos futuros é o uso do object Shell.Application. 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.