Autor |
Beitrag |
van Dyke
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 05.01.09 14:58
Hallo,
ich würde gerne wissen wie man einen Ordner im aktuell geöffneten explorer öffnet. (in dem sich das Programm befindet)
Hintergrund:
Ich möchte eine exe Programmieren welche automatisch vom USB Stick startet wenn man auf dessen Dateiicon klickt um seine Dateien anzuzeigen (funktioniert wenn man die autorun.inf dementsprechend angepasst hat). Dieses Programm soll dann kurz prüfen ob der Rechner dem Besitzer des USB Sticks gehört und darauf soll das Programm halt den root des USB Sticks anzeigen. Wenn es sich nicht um den Besitzer handelt wird noch eine Meldung ausgegeben.
Also eigentlich hanz einfach, nur das ich schon Stunden damit verbracht habe nach meinem Problem zu googlen. Ich finde leider nur Möglichkeiten ein neues Explorerfenster zu starten. z.B. mit ShellExecute
Dann habe ich noch überlegt es so zu machen dass man die tastatureingaben sendet ([alt]+S+currentdir+enter) aber damit komme ich leider gar nicht klar. ich habe es ledeglich geschafft ein vbs script für das senden zu schreiben (Ich denke aber mal das das keine schöne Variante ist Tastatureingaben zu senden).
Ich möchte noch erwähnen das ich ein totaler Anfänger in Sachen Delphi bin und hoffe das mir jemand bei meinem Problem helfen kann.
bye
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mo 05.01.09 15:10
HI,
ShellExecute sollte da aber gehen, was hast du bis jetzt? Was kommt für'n Fehler?
Muss es der Explorer sein, oder reicht auch ein normales Fenster?
€:
so sollte das gehen:
Delphi-Quelltext 1:
| ShellExecute(Application.Handle,'open','C:\',nil,nil,SW_MAXIMIZE); |
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 15:13
Bergmann89 hat folgendes geschrieben : | ShellExecute sollte da aber gehen, was hast du bis jetzt? |
ShellExecute ruft ein neues Fenster auf, es ändert nicht die Anzeige in einem bestehenden. Jedenfalls wüsste ich nicht wie.
Das könnte via DDE gehen, falls der Explorer das unterstützt. Das ist zwar uralt, aber eine andere (saubere) Möglichkeit wüsste ich im Moment nicht.
Problem: Was wenn mehrere Instanzen offen sind? Zum Beispiel wenn Ordnerfenster in neuen Prozessen geöffnet werden wie bei mir? Hmmm...
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mo 05.01.09 15:17
achja, sry...
ich hab da ma was gemacht, habs aber leider nich mehr. Damit konnte man sich alle geöffneten Fenster anzeigen lassen und nach beliben beenden. Man kann sich ja das Explorerfenster raus suchen, es schließen und dann ein neues öffnen...weiß jetzt aber nich mehr wie das hieß!
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 15:30
Das hatte ich auch überlegt. Mit FindWindow z.B. oder EnumWindows o.ä. ginge das. Aber ob das so sinnvoll ist?
|
|
van Dyke 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 05.01.09 15:46
Danke ersmal für die schnellen antworten.
also scheint es gar nicht so einfach möglich zu sein.
Dann ist es vielleicht doch besser tastatureingaben an den Explorer zu schicken.
Eigentlich ist ja das ensprechende Explorerfenster automatisch im Vordergrund, da ja von dort aus das Programm gestartet wird, oder? Leider kann ich sowas nur im vbs.
Damit sendet man per vbs alt+s und nach einer kuzen pause den aktuellen programmpfad:
Set oShell = CreateObject("WScript.Shell")
Set sh = WScript.CreateObject("WScript.Shell")
sh.SendKeys "(%s)"
WScript.Sleep 50
sh.SendKeys oShell.CurrentDirectory & vbCr
Leider weiss ich nicht wie man das in Delphi umsetzen könnte, habe zwar eine Prozedur gefunden die es möglich macht Tasten zu senden, dann aber immer nur eine und z.b. nicht den gesamten Pfad. Außerdem finde ich, wie schon geschrieben, es keine gute alternative tasten zu senden, da dass ja schnell in die Hose geht wenn im gleichen moment ein anderes Fenster aktiv wird. Man müsste also die Eingaben direkt an dieses speziell schon offene Fenster senden, aber wie?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 17:42
Sowas geht auch in Delphi, aber das von dir genannte Problem ist nur eines von vielen. Es ist eben auch keine saubere Lösung.
Was ich mich frage: Wenn ich im Explorer den Stick anklicke lande ich doch ohnehin im Rootverzeichnis. Was ist da noch zu machen?
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mo 05.01.09 18:00
Ich denk ma, er will sowas wie n Passwortschutz machen, das nur er an die Daten rann kommt?! Aber das würde dann dem Sinn eines Wechseldatenträgers wiedersprechen, wenn man ihn bloß am eigenen PC benutzen kann...
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Mo 05.01.09 18:12
Bergmann89 hat folgendes geschrieben : | Ich denk ma, er will sowas wie n Passwortschutz machen, das nur er an die Daten rann kommt?! Aber das würde dann dem Sinn eines Wechseldatenträgers wiedersprechen, wenn man ihn bloß am eigenen PC benutzen kann... |
...und lässt sich umgehen (Shift gedrückt halten oder Autorun deaktivieren).
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
van Dyke 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 05.01.09 19:01
jaenicke hat folgendes geschrieben : | Sowas geht auch in Delphi, aber das von dir genannte Problem ist nur eines von vielen. Es ist eben auch keine saubere Lösung.
Was ich mich frage: Wenn ich im Explorer den Stick anklicke lande ich doch ohnehin im Rootverzeichnis. Was ist da noch zu machen? |
wenn man in der autorun.inf einen entsprechenden eintrag macht (shell\open\command=open.exe) kann man damit beim anklicken des laufwerks im dateiexplorer (nicht im explorer) ein programm starten lassen. dabei wird aber der ordner nicht angezeigt, das müsste dann also das programm übernehmen.
edit:
passwortschutz soll es nicht werden. es soll lediglich eine meldung ausgegeben werden wenn es sich um einen "fremden" rechner handelt, danach soll der ordner ganz normal geöffnet werden. das wäre dann sinnvoll wenn man z.b. seinen usb stick verliert. dann kann man ja seine telefonnummer in der meldung angeben.
|
|
van Dyke 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 06.01.09 00:18
hallo,
ich habe jetzt mal das bis jetzt fertige Programm angehangen, damit ihr genau wisst was ich meine.
Die Open.exe und autorun.inf ist in den Root eines USB Sticks zu entpacken, beim nächsten anschliessen am PC (Windows XP) sollte beim klick auf das Laufwerk im Dateiexplorer eine Meldung kommen und darauf der Ordner geöffnet werden (allerdings halt im neuen Fenster).
Das Programm wird in der autorun.inf mit dem Parameter -o aufgerufen.
Es lässt sich auch konfigurieren indem man es direkt ohne Parameter startet.
Einloggen, um Attachments anzusehen!
|
|
van Dyke 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 06.01.09 15:59
So leute,
ich habe es ENDLICH geschafft... nach weiterer googellei habe ich dann ein Super Programm namens Winspy gefunden -> www.delphipraxis.net...ic17426,0,asc,0.html
dieses findet den namen der felder von windows fenstern und erzeugte sogar schon fast den gesamten code den ich barauchte.
Ich benötigte dann nur noch folgende befehle:
Delphi-Quelltext 1: 2: 3:
| SetWinText(wndChild, RootFolder); PostMessage(wndChild, WM_KEYDOWN, VK_RETURN, 0); PostMessage(wndChild, WM_KEYUP, VK_RETURN, 0); |
um den pfad und ein RETURN zu senden.
Falls jemand interesse hat biete ich das Programm hier an.
-Normal starten um Einstellungen vorzunehmen.
-Mit Parameter "-o" starten (siehe autorun.inf) um den besagten "Check" durchzuführen und den root anzuzeigen.
-Mit Parameter "-s "Pfad\Dateiname.exe"" starten um nach dem Check ein Proiramm zu starten
Die autostartfunktion funktioniert allerding leider nur wenn man das Laufwerk über den Dateiexplorer startet (also das rechte Fenster im Explorer oder über den Arbeitsplatz)
Einloggen, um Attachments anzusehen!
|
|
|