Datei auf TrayIcon ziehen

  • Hallo sc4ry,

    warum machst du keinen Traymenüpunkt, der eine kleine Gui sozusagen als Trefferfläche bereitstellt?

    Oscar ,

    ohne diese sichtbare Gui lässt es sich (wenn überhaupt) nur mit einer vollkommen transparenten Gui lösen, die genau über dem Tray schwebt und durchklickbar ist. Aber wie kommt man an die Koordinaten an denen man dieses "DropTargetOverTray" positionieren soll?

    Edit: eine andere Möglichkeit wäre das ganze z.B. über die Zwischenablage einzufügen. Dazu kannst du z.B. folgendes Tool verwenden:
    http://stefan.bertels.org/de/clipboardpath
    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (8. Juni 2009 um 06:49)

  • thx schonmal,

    ich habs noch nicht getestet, aber vllt könnte uns das weiterhelfen (Systray_UDF).

    [autoit]

    ; Function Name: _SysTrayIconPos($iIndex=0)
    ; Description: Gets x & y position of systray icon
    ; Parameter(s): $iIndex = icon index (Note: starting from 0)
    ;
    ; Requirement(s): AutoIt3 Beta
    ; Return Value(s): On Success - Returns x [0] and y [1] position of icon
    ; On Failure - Returns -1 if icon is hidden (Autohide on XP etc.)
    ; Sets error to 1 if some internal error happens
    ;
    ; Author(s): Tuape

    [/autoit]
  • Über das Systray geht es nicht. Deshalb blendet z.B. der FreeDownloadmanager eine DropGUI ein ;)
    Ich hab hier mal ein Beispiel gemacht.

    Spoiler anzeigen
    [autoit]

    #Include <Constants.au3>
    #include<GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    Global Const $WM_DROPFILES = 0x233 ; Konstante für DropFiles
    Global $gaDropFiles ; Konstante für DropFiles

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Opt("TrayOnEventMode", 1)
    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 2)
    TraySetClick(16) ; bei Rechte Maustaste hoch wird das Traymenu geöffnet
    $Pos = WinGetPos("[CLASS:Shell_TrayWnd]") ; positionieren an rechter unterer Ecke der Taskbar
    $hGUIDrop = GUICreate("AutoItDrop", 36, 36, $Pos[0]+$Pos[2]-36, $Pos[1]-36, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_ACCEPTFILES,$WS_EX_TOPMOST))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_DROPPED, "_DropFiles")
    GUISetBkColor(0x1212BB)
    $lblDrag = GUICtrlCreateLabel("", 0, 0, 36, 36, -1, $GUI_WS_EX_PARENTDRAG) ; Klick auf Label verschiebt die GUI
    GUICtrlSetBkColor($lblDrag, $GUI_BKCOLOR_TRANSPARENT) ; Label durchsichtig (wegen Icon)
    GUICtrlSetState ($lblDrag, $GUI_DROPACCEPTED) ; Damit $GUI_EVENT_DROPFILES funktioniert
    GUICtrlCreateIcon("shell32.dll", -215, 2, 2, 32, 32) ; ein Icon, damit es schöner aussieht

    [/autoit] [autoit][/autoit] [autoit]

    $mnuContext = GUICtrlCreateContextMenu($lblDrag) ; Kontextmenu auf dem Label un damit auch der ganzen GUI
    $mnuHide = GUICtrlCreateMenuItem("&Verstecken", $mnuContext)
    GUICtrlSetOnEvent(-1, "_HideShow")
    GUICtrlCreateMenuItem("", $mnuContext)
    $mnuExit = GUICtrlCreateMenuItem("B&eenden", $mnuContext)
    GUICtrlSetOnEvent(-1, "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    TraySetOnEvent($TRAY_EVENT_PRIMARYUP, "_BringToTop")
    $mnuShowHide = TrayCreateItem("Dropfeld anzeigen")
    TrayItemSetState($mnuShowHide, $TRAY_CHECKED)
    TrayItemSetOnEvent($mnuShowHide, "_HideShow")

    [/autoit] [autoit][/autoit] [autoit]

    ;GUI-Messagehandler für mehrere Dateien beim Drop
    GUIRegisterMsg ($WM_DROPFILES, "WM_DROPFILES_FUNC")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _HideShow()
    ; DropGUI verstekcen bzw. anzeigen.
    If BitAND(TrayItemGetState($mnuShowHide), $TRAY_CHECKED) = $TRAY_CHECKED Then
    TrayItemSetState($mnuShowHide, $TRAY_UNCHECKED)
    GUISetState(@SW_HIDE, $hGUIDrop)
    Else
    TrayItemSetState($mnuShowHide, $TRAY_CHECKED)
    GUISetState(@SW_SHOW, $hGUIDrop)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BringToTop()
    ; setzt die DropGUI wieder nach vorne, wenn sie von der Taskbar verdeckt wird
    WinSetOnTop($hGUIDrop, "", 1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DropFiles()
    ; Damit alle Dateien und nicht nur die erste erkannt werden,
    ; wird hier $gaDropFile und nicht @GUI_DragFile verwendet
    Local $str = ""
    For $i = 0 To UBound($gaDropFiles) - 1
    $str &= $gaDropFiles[$i] & @CRLF
    Next
    MsgBox(0, '', StringTrimRight($str,2))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    ; Damit alle Dateien und nicht nur die erste erkannt werden
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFileW", "ptr", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 0)
    If $nAmt[0] Then
    Global $gaDropFiles[$nAmt[0]]
    Else
    Global $gaDropFiles = 0
    EndIf
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFileW", "ptr", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("wchar[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFileW", "ptr", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (8. Juni 2009 um 10:45)

  • hey, um nochmal auf das thema zurückzukommen ... wieso sollte es nicht gehen, ein gui über das icon zu legen?
    mich nervt gerade, immer zu der datei zu navigieren, darum ist das thema mit drag&drop auf das icon wieder aktuell *g*

    mein problem ist nur, entweder hab ich ein gui über dem icon und kann das traymenü nicht mehr nutzen (dafür drag&drop) oder umgekehrt (oder sehe ich das falsch)?

  • Du kannst, wie du gesagt hast, schon eine GUI darüberlegen. Es gibt nur ein paar Probleme:
    1) das Trayicon kann ausgeblendet werden, dann kann man nichts mehr draufziehen
    2) Da die TaskBar ebenfalls das Topmost-Attribut hat, wird sie sich bei jeder Aktivierung über deine DropGUI legen
    3) dein schon genanntes Problem, dass das Traymenu damit nicht mehr erreicht werden kann und auch Klicks auf das Icon nicht mehr registriert werden (du klickst dann in die GUI und nicht auf das Icon)
    4) _SysTrayIconPos arbeitet nicht auf allen Systemen völlig fehlerfrei und auch der Index deines Icons kann sich immer wieder ändern. Die Positionierung ist damit nicht gerade einfach.

    Ich meinte jedoch, dass es nicht möglich ist, das TrayIcon selbst als DragDrop-Ziel zu definieren, was die eleganteste Lösung wäre.