Hallo,
ist es möglich, eine funktion auszuführen, wenn man eine datei auf ein tray-icon zieht?
Hallo,
ist es möglich, eine funktion auszuführen, wenn man eine datei auf ein tray-icon zieht?
Drag&Drop auf's Tray-Icon wollte ich auch schonmal machen. Hat aber nicht geklappt.
Falls da jemand eine Lösung für hat, ich wäre auch interessiert.
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
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
Über das Systray geht es nicht. Deshalb blendet z.B. der FreeDownloadmanager eine DropGUI ein
Ich hab hier mal ein Beispiel gemacht.
#Include <Constants.au3>
#include<GUIConstantsEx.au3>
#include<WindowsConstants.au3>
Global Const $WM_DROPFILES = 0x233 ; Konstante für DropFiles
Global $gaDropFiles ; Konstante für DropFiles
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
$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")
TraySetOnEvent($TRAY_EVENT_PRIMARYUP, "_BringToTop")
$mnuShowHide = TrayCreateItem("Dropfeld anzeigen")
TrayItemSetState($mnuShowHide, $TRAY_CHECKED)
TrayItemSetOnEvent($mnuShowHide, "_HideShow")
;GUI-Messagehandler für mehrere Dateien beim Drop
GUIRegisterMsg ($WM_DROPFILES, "WM_DROPFILES_FUNC")
GUISetState()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
Sleep(10)
WEnd
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
Func _Exit()
Exit
EndFunc
Func _BringToTop()
; setzt die DropGUI wieder nach vorne, wenn sie von der Taskbar verdeckt wird
WinSetOnTop($hGUIDrop, "", 1)
EndFunc
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
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
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.
ok, also leider keine alternative.
hmm ... was noch ne möglichkeit wäre, ist ein kontextmenüeintrag ... wobei ich das eigentich vermeiden wollte.
kann man denn folgendes machen?
und zwar wähle ich die Datei über FileOpenDialog aus ... kann man das Fenster so modden, dass man dort Files reinziehen kann???