Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: USB - Autostart dynamisch unterbinden

  Alt 30. Sep 2009, 20:48
@soulies
Zitat von soulies:
ich konnte noch nicht so ganz rausfinden um was für ein 'USB Gerät' es sich handelt ...
Es ist ein digitales Diktiergerät von Olympus. Ich bin aber weder mit dem Gerät noch mit der mitgelieferten Software zufrieden. Also muss/will ich selbst ran Ich erweitere mal so ganz nebenbei das Ding um ein paar Features.

Die von Olympus haben das mit dem AutoPlay aber irgendwie hinbekommen. Denn wenn deren DeviceDetector(tm) geladen ist, dann kümmert der und eben nur der sich um das im übrigen als USBSTOR geführte Gerät/Laufwerk. Ist das Programm nicht geladen, bekommt man wieder das "heiß geliebte" Explorer-Fenster. Es muss also gehen.
Die Frage ist daher nicht ob, sonder "nur" wie?

Zitat von soulies:
Vllt gibt's anderen Lösungen für das Problem.
Da fällt mir nur gpedit.msc und dann ... ein. Das nervt aber, wenn man das auf zig Rechnern machen muss und elegant ist es eben auch nicht.

Das hier funktioniert leider nicht:
Delphi-Quellcode:
Type
   PDevBroadcastHdr   = ^TDevBroadcastHdr;
   TDevBroadcastHdr   = Packed Record
                              dbcd_size: DWORD;
                              dbcd_devicetype: DWORD;
                              dbcd_reserved: DWORD;
                       End;

   TForm1      = Class(TForm)
                     CheckBox1   : TCheckBox;
                     Procedure FormCreate(Sender: TObject);
                     Procedure CheckBox1Click(Sender: TObject);
                 End;

Var
   Form1            : TForm1;
   WM_AutoPlay      : Cardinal;
   Erlauben         : Boolean = False;   
   MsgWindow      : hWnd;

Implementation

{$R *.dfm}

Function InstallMessageWindow: hWnd;
Var
   S            : String;
   Ver         : TOSVersionInfoA;
Begin
   Ver.dwOSVersionInfoSize:=SizeOf(TOSVersionInfoA);
   If GetVersionEx(Ver) And (Ver.dwMajorVersion >= 5) Then
      S:='Message'
   Else
      S:='STATIC';
   Result:=CreateWindowExA(0, PChar(S), nil, WS_POPUP, 0, 0, 0, 0, 0, 0, GetCurrentProcessID, nil);
End;

Procedure WindowProcedure(Var Msg: TMessage);
Begin
   If Msg.Msg = WM_DeviceChange Then
   Begin
      Case Msg.WParam Of
      $8000   :   If PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype=$00000002 Then
               Begin
                  Application.Restore;
                  ShowMe(Application.Handle);   // auf Teufel komm raus nach vorn zwingen
               End;
      $8004   :   If PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype=$00000002 Then
               Begin
                  Application.Minimize;
               End;
      End;
   End
   Else If Msg.Msg=WM_AutoPlay Then
   Begin
      If Erlauben Then
         Msg.Result := 0 //enable auto-play
      Else
         Msg.Result := 1; //disable
   End;
//   Else Inherited WndProc(Msg);   // Wie hier weiter???
End;


procedure TForm1.CheckBox1Click(Sender: TObject);
begin
   Erlauben:=CheckBox1.Checked;
end;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
   WM_AutoPlay:=RegisterWindowMessage('QueryCancelAutoPlay');
   MsgWindow:=InstallMessageWindow;
   If MsgWindow <> Invalid_Handle_Value Then
   Begin
      If SetWindowLongA(MsgWindow, GWL_WNDPROC, Integer(@WindowProcedure)) <> 0 Then
      ShowMessage('OK');
   End;
End;

End.
Was mache ich verkehrt? Bin streng nach zusammengesammeltem Beispielcode vorgegangen

Noch irgendwelche sonstigen Ideen?

Gruß und Dank, Alex
Alex Winzer
  Mit Zitat antworten Zitat