Ich erstelle einen Eintrag im Explorer Kontext-Menü; die ausgewählte Datei wird dann via Commandline-Parameter an das Programm übergeben.
Wen man nun mehrere Dateien ausgewählt hat, dann werden dementsprechend viele Instanzen des Programms gestartet, jede mit einem anderen Dateinamen als Commandline-Parameter.
Ich will aber, dass mein Programm nur einmal läuft und alle ausgewählten Dateinamen bekommt bzw. auch später ausgewählte Dateien sollen im bereits gestarteten Prog landen.
(Mit dem fertigen Programm will ich im Explorer Mp3-Dateien markieren und via Rechtsklick auf einen Server laden...)
Meine Lösung:
Instanz 1 erzeugt eine GUI und alle weiteren Instanzen senden "ihre" Commandline-Parameter an das GUI der 1 Instanz.
Wenn man zu viele Dateien auf einmal "startet", dann würden die einzelnen Instanzen fast zeitgleich senden.
Darum warten diese, bis sie an der Reihe sind.
Spoiler anzeigen
If $CmdLine[0]=0 And @Compiled Then RegWrite("HKEY_CLASSES_ROOT\*\shell\TestContext\command","","REG_SZ",'"' & @AutoItExe & '" "%1"')
;RegDelete("HKEY_CLASSES_ROOT\*\shell\TestContext")
#include <Misc.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]If $CmdLine[0]<>1 Then Exit
[/autoit] [autoit][/autoit] [autoit]Global $WinTitle="Window Title"
[/autoit] [autoit][/autoit] [autoit]If _Singleton($WinTitle,1)=0 Then ;wenn nicht 1 Instanz
#NoTrayIcon
WinWait($WinTitle)
$Send_handle = WinGetHandle($WinTitle)
Do
$ProcList=ProcessList(@ScriptName)
Sleep(100)
Until $ProcList[2][1]=@AutoItPID ;wartet bis aktuelle Instanz an der Reihe ist - also [2][0], [1][0] ist ja die 1 Instanz mit GUI
_SendCopyDataString(0,$Send_handle,$CmdLine[1]);sendet den Commandline-Parameter an das GUI der 1 Instanz
Exit
EndIf
GUICreate($WinTitle,320,640)
GUIRegisterMsg($WM_COPYDATA, 'MY_WM_COPYDATA');empfängt die Daten
GUISetOnEvent($GUI_EVENT_CLOSE,"_EXIT")
$Liste=GUICtrlCreateLabel($CmdLine[1],0,0,320,640)
GUISetState()
While 1
Sleep(100)
WEnd
Func _SendCopyDataString($My_Hwnd, $Scite_hwnd, $sCmd)
Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
DllStructSetData($CmdStruct, 1, $sCmd)
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
DllStructSetData($COPYDATA, 1, 1)
DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
'Ptr', DllStructGetPtr($COPYDATA))
EndFunc
Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
Local $Temp=""
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
Local $COPYDATA_StringLen = DllStructGetData($COPYDATA, 2)
Local $CmdStruct = DllStructCreate('Char['&$COPYDATA_StringLen&']', DllStructGetData($COPYDATA, 3))
$COPYDATA_String = StringLeft(DllStructGetData($CmdStruct, 1), $COPYDATA_StringLen)
$Temp=GUICtrlRead($Liste)
GUICtrlSetData($Liste,$Temp & @CRLF & $COPYDATA_String)
EndFunc
Func _EXIT()
Exit
EndFunc
wers ausprobieren will:
als EXE Compilieren
dann einmal direkt aufrufen, damit der Eintrag ins Kontext-Menü gemacht wird
danach im Explorer irgendwelche Dateien markieren -> Rechtsklick -> TestKontext
das GUI listet nun die Dateien der Reihe nach auf.
Ich hoff, das kann jemand brauchen
lgE