Einzelnen Beitrag anzeigen

Schwedenbitter

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

Re: USB - Autostart dynamisch unterbinden

  Alt 25. Sep 2009, 09:04
@Alter Mann

Zitat von Alter Mann:
Betriebssystem und Delphi-Version?
Die Rechner laufen alle mit Win XP Prof. und ich nutze TurboDelphi.

Ich habe es jetzt - Dank Deiner Hilfe - tatsächlich geschafft, dass WMDeviceChange wegzurationalisieren und alles aus "WndProc" heraus zu erledigen. Case klappt leider nicht, weil WM_AutoPlay keine Konstante ist. Da meckert bei mir der Compiler. Aber das lässt sich ja lösen:
Delphi-Quellcode:
Type
   TForm1            = Class(TForm)
                              CheckListBox1   : TCheckListBox;
                              Label1         : TLabel;
                              Procedure ReadRoot;
                              Procedure FormCreate(Sender: TObject);
                           Private
                              Procedure WMHandleUSB(Var Msg: TMessage);
                       End;

Var
   Form1         : TForm1;
   DVR         : Boolean;
   Root         : String;
   WM_AutoPlay   : Cardinal;

[...]

Procedure ShowMe(Value: HWND);
Var
   Th1,Th2      : Cardinal;
Begin
   Th1:=GetCurrentThreadId;
   Th2:=GetWindowThreadProcessId(GetForegroundWindow,nil);
   AttachThreadInput(Th2,Th1,True);
   Try
      SetForegroundWindow(Value);
   Finally
      AttachThreadInput(Th2,Th1,False);
   End;
End;

[...]

Procedure TForm1.FormCreate(Sender: TObject);
Begin
   ReadRoot;
   WM_AutoPlay:=RegisterWindowMessage('QueryCancelAutoPlay');
   Self.WindowProc:=WMHandleUSB;
End;

Procedure TForm1.WMHandleUSB(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
                  ReadRoot;
                  If DVR Then
                  Begin
                     Application.Restore;
                     ShowMe(Application.Handle);
                  End;
               End;
     $8004   :   If PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype=$00000002 Then
               Begin
                  ReadRoot;
               End;
      End;
   End
   Else
   If Msg.Msg = WM_AutoPlay Then
   Begin
      If DVR Then
      Begin
         Msg.Result:=1;   //disable autoplay
         DVR:=False;
      End
      Else
         Msg.Result:=0;   // enable autoplay
   End
   Else
     Inherited WndProc(Msg);
End;
In ReadRoot suche ich alle Wechseldatenträger, prüfe ob ein Medium eingelegt und mein Spezialverzeichnis vorhanden ist. Falls alles passt, habe ich meinen Digital Voice Recorder. Danke für die super Hilfe. PID und VID wäre vermutlich eleganter. Aber ich brauche es so nicht und das Binary ist damit am Ende auch kleiner, weil nicht zig fette Units gelinkt sind.

Jetzt habe ich nur noch ein einziges Problem:

Das mit dem Unterdrücken des AutoPlay/Autostart (... wie auch immer) klappt nur, wenn das Fenster im Vordergrund ist. Darauf wiesen die Autoren ja auch schon selbst hin. Aus diesem Grunde nutze ich die Procedure ShowMe();, um das zum machen. Manchmal klappt das auch. Manchmal ist aber ShowMe() zu langsam für das Autostart, so dass der Explorer trotzdem kommt.

Kann ich da noch bitte einen Tipp haben, wie ich sicher stellen kann, dass mein Fenster immer vor dem Autostart Restored und OnTop ist?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat