1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • GuiCtrlVolume

    • Oscar
    • 19. Juli 2018 um 06:52
    Zitat von Bitnugger

    wenn ich unter Windows 10 in dem Example einen Linksklick auf eines der Controls mache, sehe ich nur noch eine weiße Fläche und erst wenn ich das Mausrad bewege, erscheint es wieder wie es soll, blinkt dabei aber auch bei jeder Änderung kurz weiß auf.

    Hmmm...kannst Du es mal mit dieser WindowProc versuchen:

    AutoIt
    Func _GuiCtrlVolume_Proc($hWnd, $iMsg, $wParam, $lParam)
        Local Const $WHEEL_DELTA = 120
        Local $iIndex, $hOldProc, $tMousePoint, $hChild, $iX, $iY
        $iIndex = _GuiCtrlVolume_GetIndex($hWnd) ; Get the Index of the Volume-Control
        $hOldProc = $__g_ahGuiCtrlVolume_Gui[$iIndex][1]
        Switch $iMsg
            Case $WM_DESTROY ; When deletes the Control (GUICtrlDelete)
                _GuiCtrlVolume_Remove($hWnd)
            Case $WM_NCHITTEST ; Test, which Volume-Control is under the Mouse
                $tMousePoint = _WinAPI_MakePoint($lParam) ; Create Point-Struct from Mouse-Position
                $hChild = _WinAPI_WindowFromPoint($tMousePoint) ; Get the Window (Volume-Control)
                _WinAPI_SetFocus($hChild) ; Set the focus to the Control under the Mouse
            Case $WM_MOUSEWHEEL ; A message even to the Parent-Window!
                $tMousePoint = _WinAPI_MakePoint($lParam) ; Create Point-Struct from Mouse-Position
                $hChild = _WinAPI_WindowFromPoint($tMousePoint) ; Get the Window (Volume-Control)
                $iIndex = _GuiCtrlVolume_GetIndex($hChild) ; Get the Index of the Volume-Control
                If @error Then Return True ; Dismiss the Message, when not over a Volume-Control (Parent-Window)
                $hOldProc = $__g_ahGuiCtrlVolume_Gui[$iIndex][1] ; Get previous WindowProc
                If Not BitAND($__g_ahGuiCtrlVolume_Gui[$iIndex][2], 0x80) Then ; Interpret the Message only when not muted
                    $__g_ahGuiCtrlVolume_Gui[$iIndex][2] += _WinAPI_HiWord($wParam) / $WHEEL_DELTA * 5 ; 5% per wheel rotation
                    If $__g_ahGuiCtrlVolume_Gui[$iIndex][2] < 0 Then $__g_ahGuiCtrlVolume_Gui[$iIndex][2] = 0 ; not below 0%
                    If $__g_ahGuiCtrlVolume_Gui[$iIndex][2] > 100 Then $__g_ahGuiCtrlVolume_Gui[$iIndex][2] = 100 ; not above 100%
                    _GuiCtrlVolume_SetVolumeGraphic($iIndex)
                    _GuiCtrlVolume_CallFunction($iIndex)
                EndIf
            Case $WM_LBUTTONUP ; When the User clicked left on the Volume-Control
                $iX = _WinAPI_LoWord($lParam) ; X-Mouseposition
                $iY = _WinAPI_HiWord($lParam) ; Y-Mouseposition
                If _WinAPI_PtInRectEx($iX, $iY, 0, 2, 32, 34) Then ; when over the Mute-Image
                    $__g_ahGuiCtrlVolume_Gui[$iIndex][2] = BitXOR($__g_ahGuiCtrlVolume_Gui[$iIndex][2], 0x80) ; Switch between muted and not muted
                Else
                    $__g_ahGuiCtrlVolume_Gui[$iIndex][2] = Int(100 / _WinAPI_GetWindowWidth($hWnd) * $iX) ; Else change the Volume based on the Mouseposition
                EndIf
                _GuiCtrlVolume_SetVolumeGraphic($iIndex)
                _GuiCtrlVolume_CallFunction($iIndex)
            Case $WM_PAINT
                _GuiCtrlVolume_SetVolumeGraphic($iIndex)
        EndSwitch
        Return DllCall('user32.dll', 'lresult', 'CallWindowProc', 'ptr', $hOldProc, 'hwnd', $hWnd, 'uint', $iMsg, 'wparam', $wParam, 'lparam', $lParam)[0]
        ; Bug in _WinAPI_CallWindowProc (https://autoit.de/index.php?thread/86028-mehrere-udfs-mit-windowproc-verketten/&postID=690695#post690695)
    EndFunc   ;==>_GuiCtrlVolume_Proc
    Alles anzeigen
  • GuiCtrlVolume

    • Oscar
    • 18. Juli 2018 um 18:15

    Schon wieder eine kleine UDF (ich bin mittlerweile vom WindowProc überzeugt)!

    Dieses Mal gibt es ein Volume-Controlelement. Das kann man irgendwo auf der eigenen GUI erstellen und es übernimmt dann eigenständig (Standardwert) die Wave-Lautstärke-Einstellung für das Script.

    Man kann dem Control-Element aber auch eine Funktion zuweisen, sodass bei einer Änderung nur diese Funktion aufgerufen wird. Das ist vor allem interessant, wenn man die BASS-UDF verwendet und die Lautstärke-Einstellung für den Stream verwenden will.

    Das kann man schlecht erklären, deswegen habe ich das in das Beispielscript mit eingebaut.

    Die Lautstärke kann man mit einem linken Mausklick auf das Controlelement oder durch drehen des Mausrades über dem Controlelement verändern. Ein linker Mausklick auf das Lautsprechersymbol schaltet das Stummschalten ein/aus.

    Das Controlelement passt sich standardmäßig an das Parent-Window an. Das heißt, dass die Hintergrundfarbe vom Volume-Control gleich der Hintergrundfarbe vom Fenster entspricht. Die Textfarbe ist dann eine Invertierung davon. Weil das aber nicht bei jeder Hintergrundfarbe passt, gibt es auch eine Funktion zum ändern der Farben.

    Die Größe des Controlelements habe ich fest auf 150x50 Pixel festgelegt. Anfangs wollte ich das noch konfigurierbar machen, aber der Aufwand das alles anzupassen war mir zu groß. Man kann also lediglich die Position (Left, Top) anpassen.

    Update v1.1.0.0 (19.07.2018):

    - Ein "Fehler" in "_WinAPI_HiWord" und "_WinAPI_LoWord". Die Funktionen interpretieren alles als Unsigned Int. Dadurch kam es bei Multi-Monitor-Umgebungen zu Fehlern. Behoben!

    - Kleine Änderung beim Refresh. Bei Änderungen wird jetzt nicht mehr "_WinAPI_RedrawWindow", sondern gleich die interne Funktion "_GuiCtrlVolume_SetVolumeGraphic" aufgerufen.

    Dateien

    GuiCtrlVolume.au3 30,19 kB – 453 Downloads GuiCtrlVolume_Example.au3 3,76 kB – 443 Downloads
  • VB Script?

    • Oscar
    • 17. Juli 2018 um 17:57

    [verschoben nach "Andere Programmiersprachen"]

  • TreeView Suche

    • Oscar
    • 16. Juli 2018 um 15:38
    Zitat von mirko2002

    Gibt's da irgend nen Trick für?

    $hItemFound muss global sein. Dann kannst Du das bei der nächsten Suche bei "_GUICtrlTreeView_FindItem" als vierten Parameter angeben.

  • WindowMinMax

    • Oscar
    • 15. Juli 2018 um 14:30

    Eine kleine UDF, um bei einem größenveränderbaren Fenster die Minimal- und die Maximalgröße festzulegen.

    Man übergibt einfach das Fensterhandle und ein Array mit 4 Werten [MinWidth, MinHeight, MaxWidth, MaxHeight] an die Funktion und schon wird das Fenster auf diese Werte begrenzt.

    Das funktioniert natürlich auch mit mehreren Fenstern und mit unterschiedlichen Werten für jedes Fenster.

    Die zu übergebenen Werte beziehen sich immer auf den Clientbereich des Fensters (innen, ohne Fensterrahmen).

    Wer möchte, kann auch die beiden UDFs ("WindowDocking.au3" und "WindowMinMax.au3") zusammen testen. Dafür ist das Beispielscript "WindowMinMax_Docking_Example.au3".

    Dateien

    WindowMinMax.au3 9,75 kB – 345 Downloads WindowMinMax_Example.au3 756 Byte – 383 Downloads WindowMinMax_Docking_Example.au3 842 Byte – 351 Downloads
  • WindowDocking

    • Oscar
    • 15. Juli 2018 um 14:21

    Noch eine neue Version (siehe Post#1).

    Im Wesentlichen, wegen des Bugs in "_WinAPI_CallWindowProc". Danke, Bitnugger! :):thumbup:

  • Mehrere UDFs mit WindowProc verketten

    • Oscar
    • 14. Juli 2018 um 16:00
    Zitat von Bitnugger

    So funktioniert es...

    Oh mann, also doch ein Bug!

    Und ich suche hier wie blöd, was ich falsch gemacht habe.

    Vielen Dank für Deine Hilfe! :thumbup:

  • Mehrere UDFs mit WindowProc verketten

    • Oscar
    • 14. Juli 2018 um 10:27

    Ich habe ja eine UDF "WindowDocking" geschrieben, die die Auswertung mit DllCallbackRegister und einer WindowProc-Funktion macht.

    Soweit funktioniert das auch einwandfrei, aber wenn ich jetzt noch eine WindowProc-Funktion (eine andere UDF) einbinden will, dann schmiert mir das Script ab (Fenster friert ein und ich muss den Process killen).

    Jede UDF für sich allein, läuft problemlos, nur zusammen geht es nicht. Ich habe jetzt mal ein Minimal-Beispielscript erstellt, womit das Problem immer noch auftritt (siehe unten).

    Ich habe mir auch schon die Adressen ausgeben lassen, um zu schauen, ob da irgendwas nicht passt, aber ich konnte nichts entdecken.

    Handelt es sich da um einen Bug oder übersehe ich etwas Gravierendes?

    AutoIt
    #include <WinAPISysInternals.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    OnAutoItExitRegister('_Exit')
    
    Global $hGui = GUICreate('Test', 640, 480)
    GUISetState()
    
    #Region stellt die 1.UDF dar
    Global $hProcNew1 = DllCallbackRegister('_WindowProc1', 'ptr', 'hwnd;uint;wparam;lparam')
    Global $hProcOld1 = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew1))
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : DllCallbackGetPtr($hProcNew1) = ' & DllCallbackGetPtr($hProcNew1) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hProcOld1 (Orig WinProc) = 0x' & Hex($hProcOld1) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    #EndRegion
    
    #Region stellt die 2.UDF dar
    Global $hProcNew2 = DllCallbackRegister('_WindowProc2', 'ptr', 'hwnd;uint;wparam;lparam')
    Global $hProcOld2 = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew2))
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : DllCallbackGetPtr($hProcNew2) = ' & DllCallbackGetPtr($hProcNew2) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hProcOld2 = 0x' & Hex($hProcOld2) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    #EndRegion
    
    Do
    Until GUIGetMsg() = -3
    Exit
    
    Func _Exit()
        Local $ret
        $ret = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hProcOld2)
        ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : ret $hProcOld2 = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
        DllCallbackFree($hProcNew2)
    
        $ret = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hProcOld1)
        ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : ret $hProcOld1 = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
        DllCallbackFree($hProcNew1)
    
        $ret = _WinAPI_GetWindowLong($hGui, $GWL_WNDPROC) ; zum testen, ob der Originalwert wieder bei der Gui eingetragen ist
        ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Orig WinProc = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    EndFunc   ;==>_Exit
    
    
    Func _WindowProc1($hWnd, $iMsg, $wParam, $lParam)
        Switch $iMsg
            Case $WM_MOUSEWHEEL
                ConsoleWrite('_WindowProc1 $WM_MOUSEWHEEL' & @CR)
        EndSwitch
        Return _WinAPI_CallWindowProc($hProcOld1, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc   ;==>_WindowProc1
    
    Func _WindowProc2($hWnd, $iMsg, $wParam, $lParam)
        Switch $iMsg
            Case $WM_WINDOWPOSCHANGED
                ConsoleWrite('_WindowProc2 $WM_WINDOWPOSCHANGED' & @CR)
        EndSwitch
        Return _WinAPI_CallWindowProc($hProcOld2, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc   ;==>_WindowProc2
    Alles anzeigen

    Dateien

    _Test.au3 2,72 kB – 298 Downloads
  • Assembler - Fortsetzung

    • Oscar
    • 14. Juli 2018 um 08:29
    Zitat von vcopsmtl

    Wollte nochmals das Problem mit grossen Dateien ansprechen.

    Was für ein Problem "mit grossen Dateien"?

    Auf welches Script beziehst Du Dich und wieso "nochmals"?

    Poste bitte Dein Script und das Bild, bei dem der Fehler auftritt.

  • Listview-Datenbank v3

    • Oscar
    • 13. Juli 2018 um 13:23
    Zitat von AutoMit

    Wie kann ich das Programmicon - ausgehend vom Fensterhandle - auslesen und im Listview anzeigen?

    Poste doch bitte mal Dein ganzes Script.

    Dann kann man besser verstehen, was Du vorhast und kann besser helfen.

  • Auf der Suche nach einem Script (Webviewer)

    • Oscar
    • 12. Juli 2018 um 05:21
    Zitat von AnMa

    dass für das ProgrammIcon, auch zwingend eine *.ico Datei notwendig wäre?

    Das "#AutoIt3Wrapper_Icon" ist dafür da der Exedatei (wenn Du das Script compilierst) ein Icon zuzuweisen.

    Um das Icon für das Fenster (GUI) verwenden zu können, brauchst Du den Befehl GuiSetIcon. Für ein evtl. vorhandenes TrayMenü gibt es TraySetIcon.

    Kommt halt darauf an, was Du vorhast.

  • Auf der Suche nach einem Script (Webviewer)

    • Oscar
    • 11. Juli 2018 um 18:53
    Zitat von AnMa

    Eigentlich dachte ich dass das keine Probleme macht, aber die Bilder will er mir nicht anzeigen. Woran kann das liegen?

    Du solltest mal die Hilfe zu "SplashImageOn" lesen: "...and should be a Bitmap, GIF, or JPEG image. Icons (ICOs) will not display, though the window still appears. PNG images throw an error..."

    Also nichts mit PNG-Dateien. Entweder nach JPG / BMP konvertieren oder mit GDI+ laden und auf einer eigenen GUI anzeigen.

    Ansonsten bitte Script und die verwendeten Grafiken posten!

  • WindowDocking

    • Oscar
    • 11. Juli 2018 um 18:35

    Ich musste die UDF doch noch mal verändern. :)

    Das mit dem "Minimize/Restore" funktionierte nicht auf einen zweiten Bildschirm und die rechte Maustaste war die physikalische rechte Maustaste, was bei Linkshändermäusen unpraktisch ist.

    Außerdem gibt es noch eine neue Funktion "_WindowDocking_SetVisible" (ok, eigentlich ist es eine alte Funktion von mir, aber sie passt hier besser rein).

    So nebenbei habe ich dann noch die Funktionsheader (und ein paar Kommentare) hinzugefügt.

    Neue Version in Post#1.

  • Auf der Suche nach einem Script (Webviewer)

    • Oscar
    • 10. Juli 2018 um 17:26

    Du suchst "GUICtrlSetResizing"!?

    Also so:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <IE.au3>
    #include <WindowsConstants.au3>
    
    Global $oIE = _IECreateEmbedded()
    GUICreate("WebViewer", 640, 480, -1, -1, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)
    GUISetBkColor(0x2244AA)
    GUICtrlCreateObj($oIE, 10, 10, 620, 460)
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
    GUISetState(@SW_SHOW)
    
    _IENavigate($oIE, "http://www.autoitscript.com")
    
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
    Alles anzeigen

    Edit: Hier noch eine erweiterte Version (ohne das Flackern beim Resizing):

    AutoIt
    #include <AutoItConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <IE.au3>
    #include <StructureConstants.au3>
    #include <WinAPISysInternals.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    OnAutoItExitRegister('_Exit')
    
    Global $oIE = _IECreateEmbedded()
    Global $iWidth = 800, $iHeight = 600
    Global $hGui = GUICreate('WebViewer', $iWidth, $iHeight, 20, 20, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN))
    GUISetBkColor(0xDDDDDD)
    GUICtrlCreateObj($oIE, 10, 10, $iWidth - 20, $iHeight - 20)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    GUISetState(@SW_SHOW, $hGui)
    ;~ GUISetState(@SW_SHOWMAXIMIZED, $hGui) ; <- wenn das Fenster gleich beim Start maximiert sein soll
    
    Global $hProcNew = DllCallbackRegister('_NewWindowProc', 'ptr', 'hwnd;uint;wparam;lparam')
    Global $hProcOld = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew))
    
    _IENavigate($oIE, 'https://www.autoitscript.com')
    
    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
    
    Func _Exit()
        _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcOld))
        DllCallbackFree($hProcNew)
    EndFunc
    
    Func _NewWindowProc($hWnd, $iMsg, $wParam, $lParam)
        Local $tWindowPos, $iFlags
        Switch $iMsg
            Case $WM_WINDOWPOSCHANGING
                $tWindowPos = DllStructCreate($tagWINDOWPOS, $lParam)
                $iFlags = BitOR(DllStructGetData($tWindowPos, 'Flags'), $SWP_NOREDRAW)
                DllStructSetData($tWindowPos, 'Flags', $iFlags)
        EndSwitch
        Return _WinAPI_CallWindowProc($hProcOld, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc
    Alles anzeigen
  • Auf der Suche nach einem Script (Webviewer)

    • Oscar
    • 10. Juli 2018 um 05:14

    Schau Dir mal die IE-UDF an (die Befehle, die mit "_IE..." beginnen). Besonders den Befehl "_IECreateEmbedded()" und das Besipielscript dazu. Da hast Du eigentlich schon alles, was Du brauchst (die Buttons kannst Du ja weglassen).

  • WindowDocking

    • Oscar
    • 9. Juli 2018 um 09:47

    Ich habe das jetzt doch standardmäßig auf die "Zwei-Maustasten-Methode" umgestellt. Das ist so doch benutzerfreundlicher.

    Außerdem gab es noch ein paar "kleine" Fehler. :rolleyes:

    Neue Version in Post#1.

  • WindowDocking

    • Oscar
    • 8. Juli 2018 um 19:21
    Zitat von Bitnugger

    guck mal, so geht es auch ohne...

    Dein Script funktioniert bei mir nicht korrekt. Wenn sich das Fenster in einer der unteren Ecken befindet, dann kann ich es weiter nach unten bewegen und am linken Rand docken die Fenster gar nicht an.

    Aber wem die Tasten-Methode bei meinem Script nicht gefällt, der kann statt: _IsPressed('11', $__g_hDockingUser32Dll) einfach: _IsPressed('02', $__g_hDockingUser32Dll) eintragen.

    Dann kann man durch zusätzliches drücken der rechten Maustaste das Fenster auf den anderen Bildschirm verschieben. Nur mit der linken Maustaste = Fenster dockt an, linke und rechte Maustaste = Fenster lässt sich weiterschieben.

  • WindowDocking

    • Oscar
    • 8. Juli 2018 um 15:54
    Zitat von Bitnugger

    Du kannst aber auch einfach abfragen, ob sich die linke obere bzw. rechte untere Ecke auf demselben Monitor befindet.

    Ich will ja aber auch, dass das Fenster am Übergang (zwischen den Monitoren) andockt. Es soll aber auch die Möglichkeit geben das Fenster auf den anderen Monitor zu schieben.

    Deswegen denke ich, dass die Tasten-Methode eigentlich ganz gut ist.

    Zitat von Bitnugger

    Zudem sind mir noch zwei Sachen aufgefallen.

    Oh mann! Ja, da hast Du Recht!

    Da passte das Konzept nicht. Ich hatte das Script ursprünglich nur für eine GUI geschrieben und dann als UDF ausgebaut. Ich hab's jetzt nochmal neu überdacht und Deine Einwände berücksichtigt.

    So müsste es jetzt aber passen.

    Zitat von Bitnugger

    Den Wert für den MagneticBorder könntest du auch als optionalen Parameter bei _WindowDocking_Add einbauen und mit in $__g_ahDocking_Gui speichern.

    Ja, gute Idee! Vor allem, weil ich jetzt sowieso ein globales 2D-Array benutze, bietet es sich an, das konfigurierbar zu machen.

    Somit ist auch noch eine Funktion "_WindowDocking_SetMagneticBorder" dazugekommen. Damit kann man den Wert nicht nur bei "_WindowDocking_Add" festlegen, sondern auch nachträglich noch ändern.

    Neue Version in Post#1.

  • WindowDocking

    • Oscar
    • 8. Juli 2018 um 09:33
    Zitat von Bitnugger

    Werte besser die Message $WM_WINDOWPOSCHANGING aus und verschiebe das Window nicht selbst, sondern trage bei Bedarf einfach nur die neuen Werte für X und Y in die $tagWINDOWPOS-Struktur ein, denn diese werden im nächsten Schritt verwendet.

    Klasse! So klappt das viel besser. Vielen Dank!

    Zitat von Bitnugger

    PS: Die Taskleiste muss nicht unbedingt unten sein.

    Ich werte die Work-Area (ohne Taskleiste) des Monitors aus. Somit spielt es keine Rolle, wo sich die Taskleiste befindet.

    Ich schrieb zwar "unten an der Taskleiste", meinte aber generell an der Taskleiste.

  • WindowDocking

    • Oscar
    • 7. Juli 2018 um 19:48

    Eine kleine UDF zum andocken eines (oder mehrerer) Fenster am Bildschirmrand (bzw. an der Taskleiste).

    Das funktioniert auch mit mehreren Bildschirmen.

    Wenn beim Verschieben des Fensters zusätzlich die rechte Maustaste gedrückt wird, so wird das Docking vorübergehend abgeschaltet und man kann das Fenster auf einen anderen Bildschirm bewegen.

    Version 1.1.0.0 (08.07.2018):

    - Auswertung jetzt mit $WM_WINDOWPOSCHANGING statt $WM_WINDOWPOSCHANGED. Kein Flackern mehr! Danke Bitnugger! :thumbup:

    - Wegen $WM_WINDOWPOSCHANGING funktioniert jetzt das "weiterziehen" mit der Maus nicht mehr, um auf einen anderen Bildschirm zu kommen.

    Deswegen habe ich jetzt einen Hotkey: <CTRL> eingebaut. Wird die CTRL-Taste während des ziehens gedrückt gehalten, so kann man das Fenster auf den anderen Bildschirm ziehen.

    - Es gibt jetzt einen "magnetischen Rahmen" (50 Pixel). Wird das Fenster in diesen Bereich bewegt, wird es an den Rand gezogen.

    Version 1.2.0.0 (08.07.2018):

    - Die UDF nochmal komplett umgestaltet (auf globales 2D-Array). Da waren ein paar blöde Bugs drin. Danke Bitnugger! :thumbup:

    - Eine neue Funktion "_WindowDocking_SetMagneticBorder", mit der man den "MagneticBorder" auf eine beliebige Pixelzahl einstellen kann (siehe Example).

    Version 1.3.0.0 (09.07.2018):

    - Es gab noch einen Fehler, wenn man ein Fenster mit eingeschalteten Docking gelöscht hat (GuiDelete). Dabei wurde die WindowProc nicht wieder auf den alten Wert gesetzt und AutoIt stürzte ab. Behoben!

    - Bei der Array-Verwaltung (globales 2D-Array) war noch ein Fehler drin (falsch dimensioniert). Behoben!

    - Die "CTRL-Tasten-Methode" zum verschieben auf einen anderen Bildschirm habe ich jetzt doch standardmäßig auf die "Zwei-Maustasten-Methode" umgestellt. Das Fenster nur mit der Maus zu verschieben ist doch benutzerfreundlicher. :)

    - In Version v3.3.14.5 von AutoIt gibt es die Konstanten $SM_CXSIZEFRAME und $SM_CYSIZEFRAME, deshalb ist die zusätzliche Definition überflüssig.

    - Das Beispiel öffnet jetzt 3 Fenster und man kann jedes Fenster einzeln konfigurieren.

    Version 1.4.0.0 (11.07.2018):

    - Wenn man ein Docking-Fenster auf einen zweiten Bildschirm geschoben hat und das Fenster minimiert und dann wieder restored hat, dann wurde es auf dem Hauptbildschirm "festgehalten". Behoben!

    - Es gibt eine neue Funktion "_WindowDocking_SetVisible" (damit wird das Fenster auf dem am naechsten liegenden Bildschirm zentriert, wenn sich das Fenster außerhalb des Desktopbereichs befindet).

    - Die Abfrage der rechten Maustaste (zum vorübergehenden ausschalten des Dockings) übernimmt jetzt die Funktion "_RMBpressed()". Im Gegensatz zu "_isPressed" wird damit die virtuelle (statt der physikalischen) rechte Maustaste abgefragt.

    - Das Beispielscript "WindowDocking_Example.au3" um ein Beispiel für die neue Funktion erweitert.

    Version 1.5.0.0 (14.07.2018):
    - Bug in "_WinAPI_CallWindowProc" führte zum hängenbleiben des Script, wenn zusätzlich eine zweite WindowProc-UDF benutzt wurde. Behoben! Vielen Dank, Bitnugger!

    - Meine Funktion zum abfragen der rechten Maustaste war überflüssig, weil es ja "_WinAPI_GetKeyState" gibt. Geändert!

    - Ein paar Code-Optimierungen. Unter anderem eine Funktion erstellt, zum ermitteln des Index anhand des Fensterhandle.

    Dateien

    WindowDocking.au3 12,47 kB – 455 Downloads WindowDocking_Example.au3 2,75 kB – 425 Downloads

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™