Ir para conteúdo
Fórum Script Brasil
  • 0

Abrir A Bandeja Do Dvd


luizf

Pergunta

Posts Recomendados

  • 0

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, este

tópico foi muito enriquecedor na minha opinião, principalmente aquela parte postada pelo s3c, para obter

a 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.

Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0
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 link

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

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)

[]s

Link para o comentário
Compartilhar em outros sites

  • 0
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? rsr

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 link

muito boa essa dica ;)

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Link para o comentário
Compartilhar em outros sites

  • 0
#&%#@!!!

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

Link para o comentário
Compartilhar em outros sites

  • 0

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 programador

Nã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.

Link para o comentário
Compartilhar em outros sites

  • 0
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

Isto 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.

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Opa

Mas então, esse código funciona pra XP porque é a partir do Windows 2000, então ai se inclui, 2000, NT, XP, 2003, Vista

Link para o comentário
Compartilhar em outros sites

  • 0

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 fechar

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;

Nada acontece.

PS: Desculpem não estar colocando os cotes, mas neste computador que estou eles não estão funcionando!!

Link para o comentário
Compartilhar em outros sites

  • 0

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 mim

1) 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ém

para 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 êxito

Outra coisa se usar o código 1 para abrir, fechar manualmente é claro e depois tentar abrir pelo código 2

ele não abre. Tenho que fechar o programa abrir novamente e mandar abrir o dvd pelo código 2, aí sim ele abre.

Link para o comentário
Compartilhar em outros sites

  • 0

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;

Link para o comentário
Compartilhar em outros sites

  • 0

É, 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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...