CellPhone wie einen "normalen" USB Stick handhaben

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    CellPhone wie einen "normalen" USB Stick handhaben

    Hi,

    ich habe die Thematik "Cell Phone" schon in einem vorangehenden Tread angesprochen. Leider kann ich damit mein Problem nicht lösen ... da habe ich wohl meine Anforderungen nicht klar genug gemacht:

    ich will gelegentlich von meinem Cell Phone Fotos auf meinen PC hochladen.

    Den Namen des Geräts z.B. "Apple iPhone") habe ich mir gemerkt. Dieser Name kann sich auch ändern, weil es mehr als ein Cell Phone gibt.

    Meine Anwendung sollte folgende Logik haben:

    1. Beim Funktionsaufruf will ich prüfen ob, das Gerät mit diesem Model Namen montiert ist ... (ich müsste etwa eine Liste der verfügbaren COM Geräte erstellen und den Namen darin suchen).

    2. Wenn das Gerät montiert ist, möchte ich zum Unterordner "DCIM" navigieren. Wenn ich diesen Folder im Zugrif habe, dann ist alles in trockenen Tüchern, weil ich weiß wie ich die Files aus so einem Ordner (Com Object) extrahieren und anzeigen kann.

    3. Wenn das Gerät aber nicht montiert ist, oder wenn der Unterordner DCIM nicht existiert, dann will ich einen "PickFolderDialog" starten ... um dann ein geeignetes alternatives Gerät auswählen zu können und dieses Gerät dann ggfs. als neuen Default zu setzen, d.h den Model Name zu speichern. Wie man so einen PickFolderDialog macht, hab ich im vorangegangenen Thread gelernt

    Anmerkung: Mein Programm muss mit einem festehenden Begriff Model-Name, Geräte-Name etc. arbeiten! Es genügt nicht, sich das "Handle" zu merken, denn mein Cell Phone hänge ich nur zum Download an den PC ... und danach "ziehe ich den Stöpsel". Wenn ich dann später das Handy erneut montiere, dann ist das alte Handle natürlich nicht mehr gültig. Insbesondere ist das der Fall, wenn der PC heruntergefahren und neu gestartet wird.

    Was ich hier vorhabe ist für "normale" Geräte, wie, z.B. Festplatten, USB-Sticks, DVD Drives etc. kein Problem ... da gibt es geeeignete .NET Funktioen. Hier handelt es sich aber um ein Cell Phone und da ist die Welt halt eine andere !

    Uff ... ich hoffe, ich habe mein Problem verständlich machen können. Vielleicht kann mir ja jemand helfen ...

    @Franky: falls du hier noch mitlesen solltest - könnte man diese Anforderungen mit deinem Sample Programm abdecken ? Ich hab mir das durchgelesen .. aber mir scheint dass du dir das Handle in der Variablen m_FileOpenDialog, m_DialogHwnd merkst und der Open Dialog in jedem Fall aufgerufen wird. Ich will mir das Gerät aber "sessionübergreifend" merken. Und will den Open Dialog auch nur aufrufen, wenn das Gerät nicht gefunden wird. Ich hab das Gefühl, dass dies mit deinem Code nicht so ohne weiteres zu realisieren ist. Oder verstehe ich das nicht richtig ...

    LG
    Peter

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Peter329“ ()

    @'Franky

    Ok, danke, dass du mich auf meinen eigenen Thread hingewiesen hast. Das ist die Diskussion, nach der ich meine erste funktionierende Lösung geschrieben habe. Das sind rund 1.000 Zeilen Code auf Basis von

    Dim CellPhoneFolder = shell.BrowseForFolder(Hwnd, "Choose folder", 0, ssfDRIVES)

    'Get DCIM folder
    Dim fi2 As FolderItem = (TryCast(FromFolder, Folder3)).Self

    ...

    Wie schon früher geschrieben funktioniert diese Lösung auch. Mich stört an dieser Lösung nur der veraltete BrowseForFolder Dialog und die Tatsache, dass ich in diesem Dialog das Startverzeichnis nur über vordefinierte Konstanten (z.B. ssfDRIVES) setzen kann und deshalb jedesmal den CellPhone Ordner erneut auswählen muss. So kamen wir dann auf den "moderneren" PickFolder Dialog.

    Aber diese Diskussion gebe ich jetzt auf. Ich bleibe bei meinem jetzigen Verfahren mit BrowseForFolder ... Man kann eben nicht alles im Leben haben ... :)

    Ich hätte nur noch eine Frage: wie kann ich den ausgewählten CellPhoneFolder in die SETTINGS speichern ? Da finde ich mit "Browse" nichts Passendes .. (s. Anhang) Klappt das überhaupt ? Das würde mir schon sehr viel weiterhelfen ...

    ich hoffe, dass ich euch mit meinen Problemen nicht zu sehr auf die Nerven falle. Herzlichen Dank für eure immense Geduld.

    LG
    Peter
    Bilder
    • s 2023-03-16 22-57-123.jpg

      93,26 kB, 952×854, 53 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    @Peter329
    -> BrowseForFolder Dialog und die Tatsache, dass ich in diesem Dialog das Startverzeichnis nur über vordefinierte Konstanten (z.B. ssfDRIVES) setzen kann
    Schaust Du Dir dazu den Code vom letzten Posting von mir in FolderBrowserDialog in .Net nachbilden an. Da zeige ich eine Mögliche Lösung für den alten BrowseForFolder Dialog. Meine Meinung zu diesem alten Dialog ist ja bekannt. Versuch mal was neues. ;)

    -> Man kann eben nicht alles im Leben haben.
    Doch. Man kann. Man muss nur über den Tellerrand des .Net-Framework schauen. ;) Mögliche Lösungen, alles kleine Puzzleteile (IPortableDeviceManager, IFileDialog, IFileOperation usw), muss man nur zu einem ganzen zusammen setzen (können).

    -> Ich hätte nur noch eine Frage: wie kann ich den ausgewählten CellPhoneFolder in die SETTINGS speichern ?
    Da wirst Du mit Sicherheit etwas über die Forumssuche zu finden.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

    -Franky- schrieb:

    @Peter329
    Doch. Man kann. Man muss nur über den Tellerrand des .Net-Framework schauen. ;)
    .


    Vielen Dank erst mal für deinen Rat.

    Natürlich kann man alles haben. Aber es fragt sich schon, ob der Aufwand vertretbar ist, um zwei Clicks einzusparen.

    Mir scheint, dass die COM Objekte nicht so ganz glücklich im .NET eingebunden sind. Da muss man schon erheblichen Aufwand treiben, um das zum Laufen zu bringen. Der Tellerrand ist für meinen Geschmack ganz schön weit entfernt. :)

    -Franky- schrieb:

    @Peter329
    Da wirst Du mit Sicherheit etwas über die Forumssuche zu finden.


    Na, wie man einen String in den Settings abspeichert, das weiß ich schon. Wie man aber ein Folder COM-Object darin abspeichert, das weiß ich nicht. Und nach längerem Suchen und vielen Tests habe ich inzwischen das Gefühl gewonnen, dass dies vielleicht auch gar nicht so ohne Weiteres möglich ist.

    Na ja, nach vier Testprojekten bin ich jetzt zur Überzeugung gelangt, dass ich einfach damit leben muss, dass ich mir den Folder des BrowseForFolder Dialogs halt nicht sessionübergreifend in den Settings merken kann. Vermutlich müsste man das Dingens dazu serialisieren. Oder hat da jemand noch eine einfachere praktikable Idee?

    Vielen Dank an die Ratgeber und

    LG
    Peter

    Peter329 schrieb:

    Na, wie man einen String in den Settings abspeichert, das weiß ich schon. Wie man aber ein Folder COM-Object darin abspeichert, das weiß ich nicht

    Du musst schon den String vom Folder abspeichern. aus dem String kann man später wieder ein COM-Object machen.
    Mfg -Franky-

    -Franky- schrieb:


    Du musst schon den String vom Folder abspeichern. aus dem String kann man später wieder ein COM-Object machen.


    Ach so geht das ...

    VB.NET-Quellcode

    1. Dim CellPhoneFolder =
    2. shell.BrowseForFolder(Hwnd, "Choose folder", 0, ssfDRIVES)
    3. Dim myString As String = CellPhoneFolder.ToString
    4. Debug.Print("FolderString=" & myString & "<<<")


    Bei mir erscheint dann im Debugger die Anzeige:

    FolderString=System.__ComObject<<<

    Jetzt brauche ich nur noch den Code, der aus diesem String dann wieder das ursprüngliche COM Objekt erstellt. Dann ist ja schon alles gelöst.

    LG
    Peter
    @Peter329
    CellPhoneFolder ist ein COM Objekt (System.__ComObject). Evtl. ein (I)ShellFolder. Wahrscheinlicher wohl ein (I)ShellItem und diese besitzen evtl. eine Eigenschaft ParseDisplayName oder so ähnlich (falls man sich an die Namen der COM-Interfaces gehalten hat). Darüber kommst an den Pfad zu Ordner. Ich hab diesen shell.BrowseForFolder noch nie verwendet. Ich geh ja direkt über die APIs bzw. direkt über die COM-Interfaces.

    Ich denke das auch hierfür diverse Bsp.über die Forensuche zu finden sind. Mehr kann ich an dieser Stelle nicht machen.
    Mfg -Franky-
    Also erst einmal recht herzlichen Dank, dass du dich so eingehend mit meinem Problem beschäftigt hast. Selbst wenn wir jetzt letzten Ende nicht weiter kommen. Aber dein erkennbares Engagement mir zu helfen, ist schon bemerkenswert. Auch wenn der ständige Verweis auf die Suchfunktion vielleicht nicht immer ganz so erhebend war. :)

    -Franky- schrieb:

    Ich geh ja direkt über die APIs bzw. direkt über die COM-Interfaces.


    Das will ich ja gerade vermeiden, dass ich den Dialog jedesmal erneut aufrufe. Sondern ich will die "gemerkte" Selection ohne Dialog einsetzen.

    Aber das hat einen ganz anderen Haken, den Leute die sich mit einem ählichen Problem befassen, kennen sollten:

    Wenn das Cell Phone "abgestöpselt" wird und danach (etwa in der gleichen Session) erneut montiert wird, dann passiert folgendes: Wenn man dem Programm das alte COM Objekt präsentiert, dann gibt es KEINEN Fehler, sondern es werden ganz einfach keine Files mehr gefunden !

    Und damit ist das Theme "merken des COM Objects" für meine Anwendung definitiv erledigt. Damit man nicht in solche Fallen tappt, ist es zwingend erforderlich,, den Dialog "from Scratch" neu zu starten. Also es bleibt bei meiner bisherigen Lösung. Man muss bei jedem Start den BrowseForFolder Dialog neu durchlaufen.

    Zur Erbauung habe ich mal einen Screenshot von meiner Anwendung angehängt - vielleicht liefert das ja dem ein oder anderen ein paar Anregungen, wie man so einen Dialog zum CellPhone Download gestalten kann:

    1. Ein Preview Picture und ein Discard Button ist ganz nützlich, damit man keinen Schrott auf den PC lädt.

    2. Mit dem Shrink Button kann ich die Größe der zu speichernden Bildchen reduzieren. Cell Phones haben zwar eine immense Pixel Auflösung aber leider meist ein sehr schwaches Objektiv ... da kann man die Größe der Bildchen ohne wesentlichen Qualitätsverlust reduzieren.

    3. Files, die bereits auf dem PC vorhanden sind, sollte man farblich kennzeichnen, damit man sie nicht nochmal lädt.

    Alles in allem hat sich meine kleine Anwendung als recht brauchbar und stabil erwiesen.

    Als nochmals vielen Dank an den Ratgeber und ein schönes Wochenende

    LG
    Peter
    Bilder
    • s 2023-03-18 10-35-406.jpg

      86,04 kB, 908×532, 46 mal angesehen

    Peter329 schrieb:

    Auch wenn der ständige Verweis auf die Suchfunktion vielleicht nicht immer ganz so erhebend war.

    Weil ich den shell.BrowseForFolder nicht kenne und ich Dir da keine Hilfe geben kann. Ich kenne mich eher mit den APIs und COM-Interfaces aus. ;)

    Peter329 schrieb:

    Wenn das Cell Phone "abgestöpselt" wird und danach (etwa in der gleichen Session) erneut montiert wird, dann passiert folgendes: Wenn man dem Programm das alte COM Objekt präsentiert, dann gibt es KEINEN Fehler, sondern es werden ganz einfach keine Files mehr gefunden !

    Das ist logisch. Normalerweise würde man im Programm auf entsprechende Messages warten ob ein entsprechendes USB-Gerät angeschlossen oder entfernt wurde und darauf entsprechend reagieren, entsprechende Infos auswerten usw usw.

    Wie bereits oft geschrieben, die alten Dialoge interessieren mich nicht mehr wirklich. Ich kann nur darauf hinweisen das es bessere Möglichkeiten gibt. Diese zu nutzen, liegt ausschließlich beim Anwender. ;)
    Mfg -Franky-