Page 1 of 1

A handily tool to open/close CDROM door with hotkey

Posted: Wed Apr 27, 2005 6:56 am
by arirsi
Code updated for 5.20+

Use the hotkey Ctrl + NumPadNumber(0~9) to toogle cddoor
For example, the hotkey for second cdrom is Ctrl + 1

Some function should be added to set hotkey, use mouse to control, and so on, but I am too lazy to do that.

You need a icon to compile the code

thanks to GeoTrail, PB, Pille, GPI

Code: Select all

Enumeration 1
  #MenuHotkey
  #MenuQuit
EndEnumeration

Global Dim CDRomStatus(26)
Global CDRomNumber, CDIcon, DefaultCDROM
CDRomNumber = 0
DefaultCDROM = 0
;CDIcon =  LoadIcon_(GetModuleHandle_(0), 1)
CDIcon = LoadImage(#PB_Any, "X:\sysTrayIcon.ico")

Procedure ToggleCDRomDoor(drive.s)
  mciSendString_("Open " + drive + " Alias Drive" + drive + " Type CDAudio", 0, 0, 0) 
  timer = GetTickCount_()
  mciSendString_("Set Drive" + drive + " Door Open", 0, 0, 0) 
  If GetTickCount_() - timer < 100
    mciSendString_("Set Drive" + drive + " Door Closed", 0, 0, 0)
  EndIf
EndProcedure

Procedure.s SelectDriveType(Drive$)
  Select GetDriveType_(Drive$) 
    Case #DRIVE_REMOVABLE : DriveType$="Removable" 
    Case #DRIVE_FIXED : DriveType$="Fixed" 
    Case #DRIVE_REMOTE : DriveType$="Remote" 
    Case #DRIVE_CDROM : DriveType$="CD-ROM" 
    Case #DRIVE_RAMDISK : DriveType$="RAM Disk" 
    Default : DriveType$="Unknown" 
  EndSelect 
  ProcedureReturn DriveType$ 
EndProcedure 

Procedure.s GetCDRomDriveName(n)
  ProcedureReturn Chr(CDRomStatus(n)) + ":"
EndProcedure

Procedure CheckAllCDRom()
  For i = 'A' To 'Z'
    If SelectDriveType(Chr(i) + ":") = "CD-ROM"
      CDRomStatus(CDRomNumber) = i
      CDRomNumber = CDRomNumber + 1
    EndIf
  Next
EndProcedure

CheckAllCDRom()

If CDRomNumber = 0 
  MessageRequester("Error", "No CD-ROM driver found!")
EndIf

Procedure WindowCallback(WindowID, message, wParam, lParam) 
  Result = #PB_ProcessPureBasicEvents 
  If message = #WM_HOTKEY
    Debug GetCDRomDriveName(wParam - 1)
    ToggleCDRomDoor(GetCDRomDriveName(wParam - 1))
  EndIf 
  ProcedureReturn Result 
EndProcedure 

If OpenWindow(0, 100, 150, 300, 100, "Set Hotkey", #PB_Window_Invisible | #PB_Window_ScreenCentered)
  
  If CreatePopupMenu(0)
    MenuItem(#MenuQuit, "E&xit")  
  EndIf 
  
  For i = 0 To CDRomNumber - 1
    RegisterHotKey_(WindowID(0), i + 1, #MOD_CONTROL, #VK_NUMPAD0 + i)
  Next
  
  AddSysTrayIcon(1, WindowID(0), ImageID(CDIcon))
  SetWindowCallback(@WindowCallback()) 
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_SysTray
        Select EventType()
          Case #PB_EventType_RightClick 
            DisplayPopupMenu(0, WindowID(0))
        EndSelect
      Case #PB_Event_Menu 
        Select EventMenu() 
          Case #MenuQuit : End
        EndSelect 
    EndSelect
  ForEver
EndIf