@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