Ja, nachdem ich hier fast 2 Wochen rumprobiert habe, konnte ich das (undokumentierte) Rätsel lösen. Das wollte ich euch nicht vorenthalten, denn während meiner ganzen Recherchen habe ich immer nur Beiträge gefunden, die danach gesucht haben.
Racer Danke dir für deine Links, das schau ich mir gern an. In welcher dieser Dateien dort findet die eigentliche Magie statt? Ich hab mal durchgeschaut, aber nirgends ein RDP-Objekt gefunden, was bestückt wird?
Beiträge von card0384
-
-
ich habe das Rätsel mit dem loadbalanceinfo mittels Wireshark im Vergleich zur mstsc.exe etc. geknackt - es gibt bislang leider nirgends ein Codebeispiel, wie Autoit per GUI auf eine Sammlung zugreifen kann:
Beispiel:
Code$oRDP.Server = "IP des Verbindungsbrokers" $oRDP.Domain = "Domain" $oRDP.UserName = "Username" $oRDP.AdvancedSettings2.ClearTextPassword = "Passwort" $oRDP.AdvancedSettings8.EnableCredSspSupport = "TRUE" $lbinfo = "tsv://MS Terminal Services Plugin.1.Name_der_Sammlung_aus_Broker_RDP_Datei" & @CRLF $lbinfo = StringToBinary($lbinfo, 1) ;<<- damit wird der Sammlungs-Cookie korrekt formatiert, damit er als RDP-Protokoll an den Broker übergeben wird. $oRDP.AdvancedSettings2.LoadBalanceInfo = $lbinfo $oRDP.Connect()
In diversen Foren habe ich noch gelesen, das es sein kann, das hinter dem Namen der Sammlung noch ein Leerzeichen muss, wenn es sich um eine gerade/ungerade Anzahl Zeichen handelt - das müsstet ihr ggf ausprobieren - bei mir hat es mit meiner Sammlung so geklappt - mein String hieß "tsv://MS Terminal Services Plugin.1.TS-MS-Office"
ich habe mich damit zu einer RDP-Sammlung innerhalb einer Windows Server 2022-Domäne (alles W2022-Server) verbunden.
Mein gesamter Testcode
AutoIt
Alles anzeigen#include <GUIConstants.au3> $width = 1024 $height = 768 For $i = 9 To 1 Step -1 $oRDP = ObjCreate("MsTscAx.MsTscAx." & $i) If Not @error Then ExitLoop Next If IsObj($oRDP) = 0 Then $oRDP = ObjCreate("MsTscAx.MsTscAx") ConsoleWrite(@CRLF & $i & @CRLF) $GUI = GUICreate("Embedded RDP control Test", $width+20, $height+20, 0, -1, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS) $GUIActiveX = GUICtrlCreateObj($oRDP, 10, 10, $width, $height) GUICtrlSetResizing ($GUIActiveX,$GUI_DOCKAUTO) GUISetState() ; connect to the server. if this is not done first, the child controls are not rendered. ; which is a problem, because we have to change their styles to prevent clipping $oRDP.Server = "xx.xx.xx.xx" $oRDP.Domain = "xx" $oRDP.UserName = "xx" $oRDP.AdvancedSettings2.ClearTextPassword = "xx" $oRDP.AdvancedSettings8.EnableCredSspSupport = "TRUE" $lbinfo = "tsv://MS Terminal Services Plugin.1.TS-MS-Office" & @CRLF $lbinfo = StringToBinary($lbinfo, 1) $oRDP.AdvancedSettings2.LoadBalanceInfo = $lbinfo $oRDP.Connect() ; Determine the class name of the ATL control - it seems to be random from system to system Opt("WinTitleMatchMode", 4) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase Opt("WinSearchChildren", 1) ;0=no, 1=search children also $sATLClass = "" $aClasses = StringSplit(WinGetClassList($GUI,""),@LF) For $i = 1 To $aClasses[0] If StringLeft($aClasses[$i],4) = "ATL:" Then $sATLClass = $aClasses[$i] ExitLoop EndIf Next ; get the handles to the controls that must have their styles modified $hUIContainerClass = ControlGetHandle($GUI, "", "[CLASS:UIContainerClass]") $hUIMainClass = ControlGetHandle($GUI, "", "[CLASS:UIMainClass]") $hATL = ControlGetHandle($GUI, "", "[CLASS:"&$sATLClass&"]") ConsoleWrite("$hUIContainerClass (should not be 0 or blank):" & $hUIContainerClass & @crlf) ConsoleWrite("$hUIMainClass (should not be 0 or blank):" & $hUIMainClass & @crlf) ConsoleWrite("$hATL (should not be 0 or blank):" & $hATL & @crlf) ; modify the styles of the child controls to match those set by the offical client application ; this prevents clipping problems - though, I don't know why ;Const $WS_EX_NOPARENTNOTIFY = 0x4 ;Const $WS_EX_NOINHERITLAYOUT = 0x100000 $hUIContainerClassStyle = BitOR($WS_CHILD, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_VISIBLE) ; 0x56000000 $hUIContainerClassStyleEx = BitOR($WS_EX_NOINHERITLAYOUT, $WS_EX_NOPARENTNOTIFY) ; 0x00100004 $hUIMainClassStyle = BitOR($WS_CHILD, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_SYSMENU, $WS_VISIBLE) ; 0x56080000 $hUIMainClassStyleEx = 0x0 $hATLStyle = BitOR($WS_CHILD, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_VISIBLE) ; 0x56000000 $hATLStyleEx = 0x0 $guiStyle = BitOR($WS_BORDER, $WS_CAPTION, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_DLGFRAME, $WS_GROUP, $WS_MAXIMIZE, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SYSMENU, $WS_TABSTOP, $WS_THICKFRAME, $WS_VISIBLE) ; 0x17CF0100 $guiStyleEx = $WS_EX_WINDOWEDGE ; 0x00000100 _SetStyle($hUIContainerClass,$hUIContainerClassStyle,$hUIContainerClassStyleEx) _SetStyle($hUIMainClass,$hUIMainClassStyle,$hUIMainClassStyleEx) _SetStyle($hATL,$hATLStyle,$hATLStyleEx) _SetStyle($gui,$guiStyle,$guiStyleEx) Func _SetStyle($hwnd,$style,$exstyle) DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hwnd, "int", -16, "long", $style) DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hwnd, "int", -20, "long", $exstyle) EndFunc ; $WS_EX_NOPARENTNOTIFY and $WS_EX_NOINHERITLAYOUT seem to be fairly important ; This may still be important for other projects with similar problems. AdlibRegister ( "checkconn", 1000) Func checkconn() If $oRDP.Connected = 0 Then Exit EndIf EndFunc While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd GUIDelete() Exit
-
ich weiß nicht, wer das Thema als erledigt markiert hat, ich war es jedenfalls nicht - die Gegenleistung steht immer noch zur Übergabe bereit für den der die Lösung hat - Danke
-
HI Phil-IT,
sorry für die späte Antwort, war gebunden in anderen Projekten - jetzt geht's aber weiter.
Dein DLL-Call bringt leider keine Wirkung, ich habe auch verschiedene getestet - entweder nicht die richtige gefunden oder k.A. woran es liege könnte.
Fakt ist, der DLL-Call sollte doch ein Array zurückgeben - mit _arrayDisplay kommt aber nichts zurück - Die Rückgabe als MsgBox liefert "0".Irgendwas klappt da nicht...
Kann es sein, das die GUI $guirdp bereits multimonitorunterstützung benötigt? Denn $oRDP.DesktopWidth = 4096 veranlasst zwar, das die RDP-Oberfläche 4096 Pixel breit wird, aber die Anzeige erfolgt nur auf dem Primärmonitor mit Scrollbalken um in die andere Hälfte scrollen zu können.
-
Hi Phil-IT,
danke für deinen Ansatz, haste noch eine Idee, wie ich den DLL-Call mit meinem $oRDP-Objekt verbinde? Dem Objekt liegt ja schlussendlich mit Sicherheit eine Instanz der Funktionen aus Mstscax.dll zugrunde. Nur wie kann ich aus dem $oRDP-Objekt auf die dll-Instanz zugreifen?
-
Alles klar, mach ich...
haste denn eine Idee, wie ich das "IMsRdpClientNonScriptable5 Interface" mittels Überrsetzung ins Autoit einbinden kann? So soll es wohl gehen, aber ich hab keinen Plan, wie ich aus dem Active-X-Objekt auf das ocx-Objekt komme - das müsste dann wohl irgendwie so gehen: $oRDP.GetOcx() - hier fehlt mir die Idee, wie ich den Text in Klammern "(IMsRdpClientNonScriptable5)" behandlen muss und wie ich "IMsRdpClientNonScriptable5 UseMultiSetting" übersetze. Das "UseMultiSetting" wird die neue Variable sein, aber das "IMsRdpClientNonScriptable5 " davor gibt mir Rätsel auf. Ob das Ganze mit einem DLL-Call behandelt werden muss?
Hier nochmal vermutlich der Teil, der meiner Meinung nach des Rätsels Lösung sein könnte:
IMsRdpClientNonScriptable5 UseMultiSetting = (IMsRdpClientNonScriptable5)rdpClient.GetOcx();
UseMultiSetting.UseMultimon = true; -
Kerninhalt des Projektes: ein Programm, welches die Anmeldung an unserem W2012-R2-Terminalservern managt. Sprich, es werden teils mehrere RDP-Sitzungen gleichzeitig überwacht und gesteuert. Der Anwender loggt sich auf seinem Windows-7-PC nur einmal ein und kann dann mit seinen Anmeldedaten auf Knopfdruck verschiedene Terminalserver ansteuern (und auch Remotefreigaben öffnen etc). Hierzu nutze ich bereits seit Jahren das ActiveX-Control ObjCreate("MsTscAx.MsTscAx"). Nun muss ich den ersten Windows-7-Arbeitsplatz mit 2 Monitoren einbinden. Erfolgreich geschafft habe ich bereits SPAN, aber nicht UseMultimon = True. Sprich beide Full-HD-Monitore stehen nebeneinander und ich übergebe ein RDP-Control mit 3840x1020 Größe im Vollbild und bekomme ein großes Bild über beide Monitore - aber eben wie ein einziger Monitor.
Unterschied SPAN zu Multimon:
- wenn ich im SPAN-Mode ein Programm im Terminalserver auf Vollbild stelle, wird es 3840x1020px groß und erstreckt sich über beide Monitore.
- wenn ich im Multimon-Modus ein Programm im Terminalserver auf Vollbild stelle, wird es 1920x1020px groß und landet in dem Monitor als Vollbild, in dem es vorher als Fenster lag.Ich benötige useMultimon = True in Vollbilddarstellung FullScreen = TRUE, um z.B. zwei Programme im Vollbild auf den beiden Monitoren zu fahren.
Wenn ich einfach zur Gegenprobe die mstsc.exe aufrufe und dort bei "Optionen einblenden", Registerkarte "Anzeige" den Haken bei "Alle Monitore für Remotesitzung verwenden" aktiviere, klappt es genau so wie von mir gewünscht. Genau diese Konfiguration möchte ich mittels Scripting erreichen. Ich benötige aber das Axtive-X-Control, da ich die Zustände der Verbindung überwache (Connected etc.). Aktuell verwendet das Script auf Windows 7 SP1 "MsTscAx.MsTscAx.9".
Ich komme mit der Einbindung des "IMsRdpClientNonScriptable5 Interface" in das vorhandene Activex-X-Objekt nicht klar: https://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx
Vergütung: 150€
Noch hilfreiche Quellen könnten sein:
http://blogs.msdn.com/b/winsdk/archi…ol-session.aspx
https://social.technet.microsoft.com/Forums/Windows…rum=winserverTS
https://msdn.microsoft.com/en-us/library/…2(v=vs.85).aspxDas gesamte Anmeldeprogramm ist um Längen größer, aber ich habe mal die relevanten Teile in ein eigenes Testprogramm ausgelagert:
AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> For $i = 9 To 1 Step -1 $oRDP= ObjCreate("MsTscAx.MsTscAx." & $i) If NOT @error Then ExitLoop Next If IsObj($oRDP) = 0 Then $oRDP= ObjCreate("MsTscAx.MsTscAx") $guirdp = GUICreate("Test", 952, 675) $oRDP_Ctrl = GUICtrlCreateObj($oRDP, -1, -1) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) ;GUICtrlSetStyle($oRDP_Ctrl , $WS_VISIBLE) GUISetState() $oRDP.Server = "IP.des.RDP.Servers" $oRDP.Domain = "net-bios-Domain-name" $oRDP.UserName = "Benutzername" $oRDP.AdvancedSettings2.ClearTextPassword = "Passwort" $oRDP.ColorDepth = "32" $oRDP.FullScreenTitle = "Test" $oRDP.AdvancedSettings2.RedirectDrives = False $oRDP.AdvancedSettings2.RedirectPrinters = False $oRDP.AdvancedSettings2.RedirectPorts = False $oRDP.AdvancedSettings2.RedirectSmartCards = False $oRDP.SecuredSettings2.AudioRedirectionMode = 2 $oRDP.AdvancedSettings7.EnableCredSspSupport = TRUE ;$oRDP.AdvancedSettings.ContainerHandledFullScreen = 1 ;$oRDP.AdvancedSettings3.SmartSizing = True $desktopSize = WinGetPos("Program Manager") If $desktopSize[2] > 4096 Then $oRDP.DesktopWidth = 4096 Else $oRDP.DesktopWidth = $desktopSize[2] EndIf If $desktopSize[3] > 2048 Then $oRDP.DesktopHeight = 2048 Else $oRDP.DesktopHeight = $desktopSize[3] EndIf $oRDP.FullScreen = TRUE ;bis hier her funktioniert mein Code prima ;ab hier komm ich nicht mehr weiter und hab rumprobiert ;$oRDP.NonScriptable5.UseMultimon = TRUE ;ControlSend($oRDP,"", "UseMultimon", True) ;$test = $oRDP.GetOcx() ;$test.UseMultimon = true ;$oRDP.AdvancedSettings.ContainerHandledFullScreen = 1 ; ;das hier ist etwas, was ich gefunden habe, womit es gehen soll, ich kann es aber nicht nach Autoit übersetzen ;IMsRdpClientNonScriptable5 UseMultiSetting = (IMsRdpClientNonScriptable5)rdpClient.GetOcx(); ;UseMultiSetting.UseMultimon = true; ;rdpClient.AdvancedSettings.ContainerHandledFullScreen = 1; $oRDP.Connect() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE $oRDP.Disconnect() Exit EndSwitch If $oRDP.Connected < 1 Then Exit WEnd
-
Danke für dein Feedback, ich habe eine Bugmeldung eröffnet https://www.autoitscript.com/trac/autoit/ticket/2932
-
Für mich ein wenig schade, das es bei dir geht.
1. probier ich mal aus
2. ich teste aktuell nur als Admin, da es bei den Benutzern und bei mir nicht geht
3. das System ist jungfräulich - daran dachte ich auch bereits
4. kein Virenschutz, da ein "Rücksetzsystem" - HDD ist im "nur Lese Zugriff" - alle Schreibzugriffe werden in eine Datei geschrieben, diese wird bei jedem Start geleert
5. kann ich ausschließenBleibt also nur 1. - das teste ich nächste Woche
Zurück geht es mit einem extra Button ausserhalb der $GUI_ActiveX - bei mir aber kein klassisches zurück sondern nur ein "Ordner rauf" - ist aber für meinen Zweck ausreichend
musst oben noch das $object.navigate("C:\") ersetzen durch
damit verhindere ich ausserdem, das der Benutzer in der Ordnerstruktur höher kommt wie der Ausgang ($folderorg) - speziell in Verbindung mit Netzlaufwerken wichtigCodeauszug aus der while-wend-Schleife
-
Ich habe seit Jahren für Windows 7 ein größeres Script, mittels welchem ich Netzwerkfreigaben in einer GUI darstelle und somit ohne Wissen des Anwenders über den konkreten Netzwerkpfad innerhalb unserer Firma auf Button-Druck ein Drag&Drop auf verschiedene Freigaben ermögliche. Es gibt z.B. einen Ordner "Bilder hochladen", der Anwender drückt den Button Bilder hochladen und kann aus seinem Windows heraus (z.B. seiner Kamera) Bilder in die dann angezeigte Freigabe verschieben/kopieren.
Der Quellcode ist einfach runtergebrochen:
CodeGUICreate("",700,700) GUISetState() $object = ObjCreate("Shell.Explorer.2") $GUI_ActiveX = GUICtrlCreateObj($object, 10, 10, 300, 400) $object.navigate("C:\") While GUIGetMsg() <> -3 WEnd
Seit ner Weile (ich kann nicht genau sagen seit wann oder wodurch) klappt dies selbst mit diesem einfachen Code nicht mehr. Probiert hab ichs bei Windows 7 und bei, seit dem neu hinzugekommenen Windows 8.1.
Auch habe ich innerhalb dieser Zeit das Autoit von Version 3.3.6.1 (aus dem Jahr 2010) auf die Version autoit-v3-setup_3.3.12.0.exe (und zwischenzeitlich auf autoit-v3.3.13.19-beta-setup.exe wegen eines Bugs beim Kompilieren) geupdatet.Kann mir jemand sagen, warum bei diesen wenigen Codezeilen das Drag&Drop ins Fenster oder aus dem Fenster heraus nicht mehr klappt - bzw. was kann ich machen, damit es wieder geht?
Wenn ich innerhalb des Fensters auf eine Datei/Ordner mit rechts klicke->Kopieren, dann kann ich es weder innerhalb des Fensters noch ausserhalb auf dem Desktop einfügen. Acu so Sachen wie "Hierher kopieren" oder "Hierher verschieben" sind nicht vorhanden. Ich kann keine Datei/Ordner innerhalb der GUI verschieben, sie lassen sich nicht mit gedrückter Maustaste "aufnehmen". Ich kann aber rechte Maustaste auf einen Ordner "In neuem Fenster öffnen" machen, dann geht ein weiteres Explorerfenster ausserhalb der GUI auf - in dem hab ich dann volle Rechte mit allem wie es sein muss.Ich bitte um Hilfe, wie ich das Drag&Drop wieder herstellen kann - Vielen Dank
-
prima, daß ich nicht der einzige mit dem Farbspiel bin - in meinem eigenen Script hab ich noch viel größere Buttons, da fällt es natürlich auch mehr auf.
Mein Problem, wenn ein Button gedrückt wird, dann disable ich den Button und gebe im rechten GUI-Bereich etwas aus (ein shell.explorer.2-Objekt) - daran erkennt der Anwender, was da grad rechts dargestellt wird. Drück ich nun einen anderen Button, wird dieser disabled, der ursprüngliche wird wieder enabled - und hier ist das Problem, der flackert nach enablen genauso aktiv (sinusfarbe) weiter.
Ich vermute, daß ein Controlsend() da was bewirkt, aber wenn sich selbst MSDN ausschweigt
Ideen: kann man mit spy++ o.ä. die Zustandsänderung definieren (um sie dann in ein controlsend umzuwandlen)? Ich hab da noch nichts gefunden - gibts da noch andere "objekt"-sniffer, die da Unterschiede darstellen können? Ich denke da z.B. auch daran, daß die Buttons beim Mouse-Over sich ohne Sinus-Effekt auch z.B. blau-türkis einfärben... -
Wenn du mein Beispiel-Script unter Windows 7 ausführst und den Button drückst - siehst du, daß der Button nach dem Drücken so verschiedenfarbig (von grau nach hellblau/türkis und wieder zu grau usw.)vor sich hin leuchtet. Ich sprech hierbei NICHT vom Blau werden des Buttons, wenn ich mit der Maus drüber fahre.
Ich selbst mach mit dem Button nichts - mein Script ist nicht der Verursacher des Farbspieles, das wird wohl von Windows AERO oder so kommen...
Unter welchen Bedingungen ich das Farbspiel wieder weg haben will ist vollkommen egal, mir kommt es auf den Befehl an, der dem Button explizit sagt "Leuchte vor dich hin" oder "leuchte nicht mehr"
Aber wenn ich es dir einfacher machen kann - sagen wir nach einem sleep von 30sek. soll das Farbspiel von allein wieder verschwinden... -
ok - sorry - sorry - ich dachte, mein Problem geht auch ohne Script aus der Erklärung hervor...
Es scheint dennoch - mein Script ist doch etwas größer - irgendwo im Script ein Fehler zuliegen.
Daher formuliere ich meine Frage um, um eine entsprechende Lösung zu bekommen. Hier mein Bsp.-Script:
[autoit]GUICreate("",700,700)
[/autoit][autoit][/autoit][autoit]
GUISetState()$i1 = GUICtrlCreateButton("Test1", 20, 20, 100, 30)
[/autoit][autoit][/autoit][autoit]
$i2 = GUICtrlCreateButton("Test2", 20, 60, 100, 30)While 1
[/autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
EndSwitch
WEndIch drücke Button $i1. Der Button beginnt in Windows 7 selbstständig seine Farbe zu drehen - er scheint also eine aktive Funktion aus Usersicht auszuführen.
Wie bekomm ich, ohne etwas anderes zu drücken, das Farbspiel wieder weg? -
Ich möchte gern eine optische Feinheit richten.
Ich hab ne einfache GUI mit 5 Buttons - jeder macht was anderes...
Der Urzustand: Bei Start unter Windows 7 sind alle Buttons grau (default) und werden beim Drüberfahren mit der Mouse bläulich (auch per default). So weit - so gut...Der Aktivzustand: Wenn ich unter Windows 7 einen der Buttons drücke, fängt er an von allein Grau -> hellblau -> wieder grau -> usw. zu werden.
Dieser Effekt gefällt mir solange der Button einen aktiven Prozess anzeigt.Wenn ich aber einen der anderen Buttons drücke, hat mein zuerst in meinem Beispiel gedrückter Button keine Funktion mehr - dennoch wechselt er immer noch die Farbe, als wäre er noch aktiv. Wie kann ich gezielt einzelne Button wieder in den Urzustand bringen.
-
Hi Sprenger,
dein Code liefert wirklich ein funktionierendes Kontext-Menü, ich hatter derlei Codezeilen auch schon getestet - wahrscheinlich wird sich mein Kontext-Menü aufgrund anderer Codezeilen aufhängen - es ist gut zu wissen, daß es generell erstmal klappt.
[autoit]
Das zweite Problem ist aber dennoch gegeben - shell.explorer.2 ist ein Ableger des Internet-Explorers - was bedeutet, W7 übergibt alle Ordneraktionen an den Windows-Explorer, also es geht ein separates Fenster auf, sobald man einen Ordner anklickt - wie auch Magnus schon bemerkte.
Wenn ich darüber nachdenke, hier ein Kontext-Menü jetzt lauffähig zu haben (meine anderen Codezeilen kann ich ja rausfiltern, die das Aufhängen verursachen), gibt es eine Möglichkeit das Klicken eines Ordners abzufangen, bevor die Übergabe an den Windows-Explorer stattfindet und mittels dem$object.navigate("Klick-Ordner")
[/autoit]
den shell.explorer.2 zum Navigieren zu bewegen?
Dann wäre alles optimal...PS: das mit der Freigabe-Sicherheitsabfrage geht auch weg, wenn du die IP-Adresse (oder DNS-Adresse) deiner Freigabe im Internet-Explorer -> Extras -> Internetoptionen -> Registerkarte Sicherheit -> Lokales Intranet -> Button Sites -> Erweitert -> ohne Serverüberprüfung hinzufügst.
shell.explorer.2 ist eben eine Internet-Explorer-Application, daher will sie auch entsprechend bedient werden... -
-
-
-
Hi autoBert,
danke für deine Hilfe. Leider klappt dies ab Windows 7 nicht mehr so. da tritt genau der Effekt ein, den ich bei der shell.explorer.2-Methode erwähnte.
-Ich geb in dein Beispiel oben ein: \\Server\Freigabe\Ordner und drück auf GO
-Der Browser zeigt die Freigabe an - die Optik ist genau, wie von mir gewünscht - ohne jeden Schnick-Schnack
-Sobald ich einen Ordner anklicke, öffnet sich ein separates Explorer-Fenster außerhalb der GUI mit dem Inhalt.
-Drag&Drop klappt nicht.
-usw...Daher bin ich ja auf der Suche nach einer neuen Variante...
Hast du noch andere Ideen?
Ich glaube, ich muss mittels ControlCommand ( "title", "text", controlID, "command" [, "option"] )
und (Auszug aus der Hilfe)
"SendCommandID", Command ID - Simulates the WM_COMMAND message. Usually used for ToolbarWindow32 controls - use the ToolBar tab of Au3Info to get the Command ID.
ein WM_COMMAND an das Explorer-Fenster senden, was nichts anderes macht wie im Explorer auf "Organisieren" -> "Layout" -> "Navigationsbereich" virtuell zu klicken und damit den Navigationsbereich auszublenden.
Hier steht was dazu -> MSDNMit
[autoit]ControlGetHandle ($hExplorer, "", "[CLASS:DirectUIHWND; INSTANCE:2]")
[/autoit]bekomm ich das Handle des Hauptfensters - also ohne Adressleiste aber incl. Navigations-, Vorschau- und Statusleiste. Dem Handle muss ich mittels einer Message (event. DLLCall) begreifbar machen, die ganzen Leisten auszublenden.
Aber wie?
-
Hat keiner eine Idee, wie ich der explorer.exe Befehle senden kann, die z.B. die Adress-Leiste ausblenden oder die Navigationsseite?
Entweder über dllcall oder per object-Zugriff?Es wäre toll, wenn jemand Ansätze dafür liefern kann...
Ein weniog weiter bin ich bereits in sofern gekommen, daß ich mittels:
[autoit]
[/autoit]
ControlHide ($hExplorer, "", ControlGetHandle ($hExplorer, "", "[CLASS:SysTreeView32; INSTANCE:1]")); Navigationsleiste
ControlHide ($hExplorer, "", ControlGetHandle ($hExplorer, "", "[CLASS:Search Box; INSTANCE:1]")) ; Suchfeld
ControlHide ($hExplorer, "", ControlGetHandle ($hExplorer, "", "[CLASS:Address Band Root; INSTANCE:1]")); Adressleiste
ControlHide ($hExplorer, "", ControlGetHandle ($hExplorer, "", "[CLASS:ReBarWindow32; INSTANCE:2]")); Menüleiste
[autoit]
die benötigten Leisten abschalten kann.
Das ganze vorWinSetState($hExplorer, "", @SW_SHOW)
[/autoit]
macht den Explorer direkt mit abgeschaltenen Leisten sichtbar - ich hab sogar noch die Vorwärts-Rückwärts-Leiste sichtbar - die müsste ich sonst extra programmieren.Jetzt stört nur noch, das die Navigationsleiste zwar weiß - also versteckt ist, aber die weiße Fläche eben immer noch sichtbar ist.
Und ich möchte gerne die Leiste oben, wo z.B. CD-Brennen, Organisieren etc. steht und die Statusleiste unten noch weg haben - da find ich aber keine CLASS-INSTANCE-Werte.
Wie bekomm ich die Leisten auch noch weg?