Die Funktion _WinAPI_GetKeyboardState() kopiert den Status der 256 Virtual Keys in einen Buffer, den du dann in einer Schleife auslesen kannst.
Beiträge von Bitnugger
-
-
Ich würde das so machen...
Loop
AutoIt
Alles anzeigen;-- TIME_STAMP 2016-12-05 01:53:33 #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> _Example1() _Example2() Func _Example1() #Region ### START Koda GUI section ### Form= Local $hForm1, $idButton, $idCheck, $iCheck, $nMsg, $sMsg $hForm1 = GUICreate("Form1", 615, 168, 192, 124) $idButton = GUICtrlCreateButton("adssada", 264, 56, 110, 25) $idCheck = GUICtrlCreateCheckbox("Test", 268, 92, 97, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE GUIDelete() ExitLoop ; kein Exit, weil wir nun 2. Example starten Case $idButton $sMsg = (_IsChecked($idCheck) = $GUI_CHECKED) ? "Geht" : "GEHT NED" MsgBox(1, "_Example1()", $sMsg) EndSwitch WEnd EndFunc ;==>_Example1 Func _Example2() #Region ### START Koda GUI section ### Form= Local $hForm1, $idButton, $idCheck, $iCheck, $nMsg, $sMsg $hForm1 = GUICreate("Form1", 615, 168, 192, 124) $idButton = GUICtrlCreateButton("adssada", 264, 56, 110, 25) $idCheck = GUICtrlCreateCheckbox("Test", 268, 92, 97, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Select Case $nMsg = $GUI_EVENT_CLOSE Exit Case $nMsg = $idButton $sMsg = (_IsChecked($idCheck) = $GUI_CHECKED) ? "Geht" : "GEHT NED" MsgBox(1, "_Example2()", $sMsg) EndSelect WEnd EndFunc ;==>_Example2 Func _IsChecked($idControlID) Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED EndFunc ;==>_IsChecked
-
Und schau mal hier... vielleicht bringt dich dieses Beispiel ja auf eine Idee, wie du dass umsetzen kannst.
Hier habe ich ein paar Mails aus Thunderbird in meine GUI gezogen und bekomme dann die Namen der Files im Memo angezeigt.
Nachtrag: Du kannst auch gleich mehrere oder alle Mails aus einem Postfach in einem Rutsch auf deine GUI ziehen...
Thunderbird_DragAcceptFiles
AutoIt
Alles anzeigen;-- TIME_STAMP 2016-12-04 17:46:26 #include <GUIConstantsEx.au3> #include <WinAPISys.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> OnAutoItExitRegister('OnAutoItExit') ; Create GUI Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 400, 422, -1, -1, -1, $WS_EX_TOPMOST) Local $idCheck = GUICtrlCreateCheckbox('Enable Drag && Drop', 100, 240, 120, 19) Local $idLabel = GUICtrlCreateLabel('', 100, 25, 200, 200) Global $g_hLabel = GUICtrlGetHandle($idLabel) GUICtrlSetBkColor(-1, 0xD3D8EF) ; Create memo control $g_idMemo = GUICtrlCreateEdit("", 2, 270, 396, 150, $WS_VSCROLL) GUICtrlSetFont($g_idMemo, 9, 400, 0, "Courier New") GUICtrlSendMsg($g_idMemo, $EM_SETREADONLY, True, 0) GUICtrlSetBkColor($g_idMemo, 0xFFFFFF) GUICtrlCreateLabel('Drop here', 175, 193, 50, 14) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) ; Allow WM_DROPFILES to be received from lower privileged processes (Windows Vista or later) #cs If IsAdmin() Then _WinAPI_ChangeWindowMessageFilterEx($g_hLabel, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW) _WinAPI_ChangeWindowMessageFilterEx($g_hLabel, $WM_DROPFILES, $MSGFLT_ALLOW) EndIf #ce ; Register label window proc Global $g_hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam') Global $g_pDll = DllCallbackGetPtr($g_hDll) Global $g_hProc = _WinAPI_SetWindowLong($g_hLabel, $GWL_WNDPROC, $g_pDll) GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idCheck _WinAPI_DragAcceptFiles($g_hLabel, GUICtrlRead($idCheck) = $GUI_CHECKED) EndSwitch WEnd Func _WinProc($hWnd, $iMsg, $wParam, $lParam) Switch $iMsg Case $WM_DROPFILES Local $sFileList = _WinAPI_DragQueryFileEx($wParam) If Not @error Then MemoWrite('--------------------------------------------------') For $i = 1 To $sFileList[0] MemoWrite($sFileList[$i]) Next EndIf _WinAPI_DragFinish($wParam) Return 0 EndSwitch Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam) EndFunc ;==>_WinProc ; Write message to memo Func MemoWrite($sMessage = "") GUICtrlSetData($g_idMemo, $sMessage & @CRLF, 1) EndFunc ;==>MemoWrite Func OnAutoItExit() _WinAPI_SetWindowLong($g_hLabel, $GWL_WNDPROC, $g_hProc) DllCallbackFree($g_hDll) EndFunc ;==>OnAutoItExit
-
Wo finde ich diese Funktion?
In der AutoIt-Hilfe natürlich... und wenn nicht dort, dann bei MSDN.
-
Compilevorgeng
@Micha_he
Hihi.. dieses Wort solltest du unbedingt noch mit in deine Liste aufnehmen... -
So in etwa...
SendThumbsPlus
AutoIt
Alles anzeigen;-- TIME_STAMP 2016-12-02 22:20:22 ; SendThumbsPlus #include <GUIConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> _Main() Func _Main() #region - GUI Create ; Größe und Position der eigenen GUI nach Belieben anpassen Local $hGUI = GUICreate('SendThumbsPlus', 625, 35, -1, -1, -1, $WS_EX_TOPMOST) $idButton_Send0 = GUICtrlCreateButton('Send Keywort xyz', 5, 5, 150, 25) $idButton_Send1 = GUICtrlCreateButton('Send Keywort abc', 160, 5, 150, 25) $idButton_Send2 = GUICtrlCreateButton('Send Keywort fgh', 315, 5, 150, 25) $idButton_Exit = GUICtrlCreateButton('Exit', 470,5, 150, 25) GUISetState() #endregion #region - GUI SelectLoop While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Or $msg = $idButton_Exit Exit Case $msg = $idButton_Send0 _SendKey(0) Case $msg = $idButton_Send1 _SendKey(1) Case $msg = $idButton_Send2 _SendKey(2) ;Case $msg = EndSelect WEnd #endregion EndFunc Func _SendKey($iKeywortID) ; Keyworts hier nach Belieben anpassen Local Static $aKeyworts = ['Keywort_00', 'Keywort_01', 'Keywort_02'] If $iKeywortID < 0 Or $iKeywortID > UBound($aKeyworts) Then Return SetError(1) ; Hier die korrekten Werte mit Au3Info holen... Local $hWnd = WinGetHandle('[TITLE:ThumbsPlus; CLASS:ThumbsPlus; INSTANCE:1]') If IsHWnd($hWnd) = 0 Then Exit MsgBox(0, @ScriptName, 'WinGetHandle() konnte das Window von ThumbsPlus nicht finden!') +1 ; Das ThumbsPlus-Window aktivieren, bevor wir diesem Keystrokes senden WinActivate($hWnd) ; wenn es mit Send() 'hakt', nach jedem Send() noch ein Sleep(500) oder höher einbauen Send('^k') ;Sleep(500) Send($aKeyworts[$iKeywortID]) Send('{ENTER}') Send('{SPACE}') EndFunc
-
Hat sich tatsächlich noch keiner drauf gemeldet? Ok, dann habe ich es hiermit getan. Vielen Dank auch!
-
Filesharer?
Wie wo was... sind wir das nicht alle? Welchen primären Grund könnte es sonst noch geben, aus dem das Internet ins Leben gerufen wurde?
Danke für den Tip... via DLL war natürlich schon ein Begriff, aber damals brauchte ich eine schnelle Lösung und zu der Zeit waren meine AutoIt-Kenntnisse noch nahe null.
Eine kleine Fußnote noch... via DLL ist das Handling zwar weitaus flexibler, wobei dies dann aber auch mehr Arbeit erfordert... und ich wage mal zu behaupten, dass Anfänger mit der (eindeutig besseren) DLL-Lösung evtl. überfordert sein könnten.Ich werde mich hier aber nicht als Filesharer outen!
Der Logik folgend hast du es hiermit aber getan...
Und outen... bzw. Auskünfte jeder Art gibt es eh nur gegen Bares!
@autoiter
Achso... nur mal kurz erwähnt... Arrays vs ByRef - dass bringt bei großen Arrays weitaus weniger, als ich es für möglich gehalten habe... dein Beispiel ist derzeit von etwa 12 Varianten, die ich getestet habe, die zweitschnellste! Ich knabbere noch daran, eine schnellere Lösung zu finden... -
Ist dies noch die aktuelle UDF zum darstellen eines 3D-Arrays?
Schreibt @Kleiner doch hier...
BugFix ich habe dein _ArrayMultiDisplay umgeschrieben das, alle unsere Funktionen unter einem dach sind, den Namen habe ich beibehalten.
; Modified.......: Gary Frost (gafrost), Ultima, Zedna, jpm, BugFix, Kleiner
@Kleiner
Sag mal, hast du nicht bemerkt, dass dein 'Copy Selected' Button nicht mehr ins Window passt, nachdem du die Größe an das anzuzeigende Array angepasst hast? Zudem trifft 'Copy Selected' ja nicht wirklich zu, denn du kopierst das komplette Array ja auch in die Zwischenablage, wenn NICHTS selektiert wurde... und schön wäre, wenn man auswählen kann, ob das Array mit/ohne Header/Rows in die Zwischenablage kopiert, oder als *.csv gespeichert werden soll.Was definitiv noch fehlt ist ein Exit-Button und wie beim Original die Möglichkeit eine eigene Funktion mit Parametern einzubinden. Sehr aufwertend wäre dann noch, wenn man dein _ArrayMultiDisplay als Child-Window in die eigene GUI einbinden könnte... so dass es mit dieser dann verschoben/minimiert werden kann und sich die Größe dann auch anpasst, falls die Parent-Gui diese ändert - und es sich dann auch beendet, wenn die Parent-GUI geschlossen wurde.
-
Ich mache das mit MediaInfo... und das Futter besorgt ein von mir geschriebenes AutoIt-Script, dass ich vom Total Commander aus aufrufe...
_GetExtProperty.au3 - ohohohooo... das ist ja fast noch taufrisch... von 2006!!!
Im Anhang liegt dann noch mein angepasstes InformFile für MediInfo als Muster... NFO.csv (mit RAR gepackt, weil der Dateityp hier nicht erlaubt ist)
MakeNFO
AutoIt
Alles anzeigen#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <AutoItConstants.au3> #include <Array.au3> #include <File.au3> #include <_GetScriptName.au3> ;-- TIME_STAMP 2016-11-28 08:35:06 ; Das Script habe ich für die Nutzung mit Total Commander geschrieben, um mir so eine NFO zu erstellen, wie ICH sie haben will. ; Welche Eigenschaften MediaInfo in die NFO packt, kann mithilfe eines InformFiles gesteuert werden, das als NFO.csv vorliegen muss. ; MediaInfo bringt dazu auch einige Beispiele mit, die man sich dann individuell anpassen kann. ; ;************************************************************************************* ; Derzeit ist das Script so ausgelegt, dass es nur Dateien in einem ListFile erwartet. ;************************************************************************************* ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; Mit Total Commander ; ; MakeNFO "%L" ; ; %L, %l, %F, %f, %D, %d erzeugt im TEMP-Verzeichnis einen Listendatei mit den Namen der markierten Dateien und Verzeichnisse, und ; fügt den Namen der Listendatei in die Kommandozeile ein. Die Liste wird nach Beendigung des Programms von Total Commander gelöscht. Es können 6 verschiedene Arten von Listen erzeugt werden - wir brauchen aber nur die lange Liste mit dem kompletten Pfad! ; ; %L = Lange Dateinamen inkl. komplettem Pfad, z.B. c:\Eigene Dateien\langer Name.txt ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; Mit der Eingabeaufforderung wäre es auch möglich... ; ; So in etwa könnte man das dann z. B. machen... ; for /L %L IN (1, 1, 2) do if "%L" EQU "1" (for /F "delims=*" %%D IN ('dir /B /Ad /S ["Laufwerk:\Verzeichnis mit Bildern|Filmen|Musik"]') do @echo "%D">>"%ListFile%") else timeout /T 5 >nul & MakeNFO "%ListFile%" ; for /L %L IN (1, 1, 2) do if "%L" EQU "1" (for /F "delims=*" %%D IN ('dir /B /A-d /S ["[Laufwerk:\Verzeichnis\[*.*|;*.mkv;*.mp3;*.mp3;...]]"') do @echo "%D">>"%ListFile%") else timeout /T 5 >nul & MakeNFO "%ListFile%" ; for /L %L IN (1, 1, 2) do if "%L" EQU "1" (for /F "delims=*" %D IN ('dir /B /A-d /S "k:\_Serien\Supernatural\*.mkv"') do @echo "%D">>"%ListFile%") else timeout /T 5 >nul & MakeNFO "%ListFile%" ; ; ********************** ; Hier Pfade anpassen!!! ; ********************** Global $g_sMediaInfo = 'f:\Progdir\MediaInfo_CLI\MediaInfo.exe', $g_sInformFile = 'f:/_Scripts/Batch/MediaInfo/NFO.csv' _Main() Func _Main() Local $MediaInfo, $InformFile, $LogFile, $p_path, $n_name, $o_name, $Movie, $n = 0, $NFO, $aNFO[0][2], $iPID, $CMD, $siMDB, $sOutput, $aArray ; Inifile lesen/schreiben bzw. Default-Werte für MediaInfo festlegen If FileExists(_GetScriptName(3)) Then Local $aInifile = IniReadSection(_GetScriptName(3), 'Globlal') Else Local $aInifile[3][2] = [[2, ''], ['MediaInfo', $g_sMediaInfo], ['InformFile', $g_sInformFile]] IniWriteSection(_GetScriptName(3), 'Globlal', $aInifile) EndIf $MediaInfo = $aInifile[1][1] $InformFile = $aInifile[2][1] ; Haben wir eine Liste bekommen? If $CMDLINE[0] <> 1 Then Exit MsgBox(4096, "MakeNFO", 'Usage: MakeNFO "%L"', 3) + 1 ; ListFile einlesen Local $aFileList = FileReadToArray($CMDLINE[1]) If @error Then Exit MsgBox(4096, "MakeNFO", "FileList nicht gefunden!", "FileReadToArray: #Error = " & @error & @CRLF & @CRLF & $CMDLINE[1], 3) + 1 ; Ok, dann mal los... Local $aDirs[UBound($aFileList)] Local $iDirs = 0 For $i = UBound($aFileList) - 1 To 0 Step -1 If StringInStr(FileGetAttrib($aFileList[$i]), 'D') Then ; ist es ein Verzeichnis? $aDirs[$i] = $aFileList[$i] $iDirs += 1 _ArrayDelete($aFileList, $i) EndIf Next If $iDirs <> 0 Then MsgBox(4096, "MakeNFO", "Verzeichnisse werden ignoriert - später evtl. mal..." & @CRLF & @CRLF & _ArrayToString($aDirs, @CRLF), 3) If UBound($aFileList) = 0 Then Exit ; nix zu tun? ; Diese Filter-Liste kann man natürlich beliebig anpassen... ich brauche sie nur für Filme und Serien Local $aMovieExt = ['.3gp', '.avi', '.divx', '.flv', '.mpg', '.mpeg', '.mov', '.qt', '.ram', '.ras', '.rm', '.rmvb', '.rp', '.rpl', '.rt', '.asf', '.swf', '.wmv', '.rmvb', '.vob', '.ts', '.m1v', '.m2v', '.mp4', '.mpv', '.fbr', '.mkv', '.webm'] Local $sDrive = "", $sDir = "", $sFileName = "", $sExtension = "", $aPathSplit For $w = 0 To 1 If $w = 0 Then For $i = 0 To UBound($aFileList) - 1 $aPathSplit = _PathSplit($aFileList[$i], $sDrive, $sDir, $sFileName, $sExtension) For $k = 0 To UBound($aMovieExt) - 1 If $sExtension = $aMovieExt[$k] Then $p_path = $sDrive & $sDir $n_name = $sFileName & $sExtension $o_name = $sFileName $LogFile = $p_path & $o_name & '.nfo' $Movie = $p_path & $n_name $NFO = $p_path & $o_name & '.nfo' If FileExists($NFO) Then ; existiert bereits eine NFO? $NFO = '' ; dann erzeugen wir keine *.NFO! $CMD = StringFormat('"%s" --Inform=file://"%s" "%s"', $MediaInfo, $InformFile, $Movie) Else $CMD = StringFormat('"%s" --Inform=file://"%s" --LogFile="%s" "%s"', $MediaInfo, $InformFile, $LogFile, $Movie) EndIf ; MediaInfo starten und als Parameter den Pfad zur Datei und dem InformFile mitgeben... und falls eine NFO erzeugt werden soll, dann diesen auch noch... $iPID = Run($CMD, $p_path, @SW_HIDE, $STDOUT_CHILD) If $iPID = 0 Then Exit MsgBox(4096, "MakeNFO", "Run MediaInfo ... fehlgeschlagen!" & @CRLF & @CRLF & $CMD, 3) + 1 ProcessWaitClose($iPID) ; Warten bis MediaInfo fertig ist... $siMDB = 'iMDB LiNK.........: http://www.imdb.com/title/' & @CRLF & 'iMDB Rating.......: ( votes)' & @CRLF ; Stdout auslesen... hier stehen nun die von uns festgelegten Eigenschaften... wie Breite, Höhe und Spielzeit... bei mir allerdings in EN... While 1 $sOutput &= StdoutRead($iPID) If @error Then ; Exit the loop if the process closes or StdoutRead returns an error. ExitLoop EndIf WEnd Local $aArray = StringSplit(StringTrimRight($sOutput, 2) & $siMDB, @CRLF, $STR_ENTIRESPLIT) If @error Then MsgBox(4096, "MakeNFO", "Bei StringSplit ist einen Fehler aufgetreten!", 3) ; ja watt nu? Else Local $aRange[6] = [5, 3, 3, 3, 3, 3] ; Hier noch ein paar Dinge eintragen, die MediaInfo nicht kennt... Local $sFill = 'AIR/STORE Date....: (Cine Date )|Language..........: |Genre.............: |FSK...............: |' _ArrayInsert($aArray, $aRange, $sFill) _ArrayDelete($aArray, '0-1') ; Den Counter und die Überschrift 'General' brauchen wir nicht... ;_ArrayDisplay($aArray) ; Müssen wir eine NFO anlegen? If $NFO <> '' Then ; dann die aktuellen Werte übernehmen... ReDim $aNFO[UBound($aNFO) + 1][2] $aNFO[$n][0] = $NFO $aNFO[$n][1] = $aArray $n += 1 EndIf ReDim $aArray[0] EndIf EndIf Next Next EndIf ; NFO schreiben? If UBound($aNFO) > 0 Then Sleep(1000) ; noch etwas warten, bis alle NFOs geschrieben wurden... For $k = 0 To UBound($aNFO) - 1 Local $hFile = FileOpen($aNFO[$k][0], $FO_OVERWRITE + $FO_ANSI) $aArray = $aNFO[$k][1] _FileWriteFromArray($hFile, $aArray) FileClose($hFile) Next EndIf Next ; und weiter mit dem nächten File... ; Falls dieses Script NICHT von Total Commander aufgerufen wurde, müssen wir hier nun selbst das ListFile löschen!!! ; Das kann man sehr leicht daran festmachen, in welchem Pfad sich das ListFile befindet... ; FileDelete... und fertig! ;-) EndFunc ;==>_Main #cs - Die NFO sieht dann beim mir etwa so aus... Titel.............: sn-s10e01.avi AIR/STORE Date....: (Cine Date ) Language..........: * hier nur bei Filmen... Genre.............: * hier nur bei Filmen... FSK...............: * hier nur bei Filmen... Format............: AVI at 2 095 kb/s Length............: 632 MiB for 42 min 9 s 988 ms Video #0..........: MPEG-4 Visual at 1 445 kb/s Aspect............: 720 x 400 (1.800) at 23.976 fps Audio #0..........: AC-3 at 448 kb/s Infos.............: 6 channels, 48.0 kHz Audio #1..........: MPEG Audio at 192 kb/s Infos.............: 2 channels, 48.0 kHz iMDB LiNK.........: http://www.imdb.com/title/ iMDB Rating.......: ( votes) #ce
-
So mache ich es bei 'wuschigen' Sachen... da sehe ich sofort in welcher Funktion der Fehler aufgetreten ist... und mithilfe von @error und @extended dann auch genau die Stelle, wo es brennt.
SetError()
AutoIt
Alles anzeigen;-- TIME_STAMP 2016-11-27 18:10:47 #include <Array.au3> Global $sSpacer1 = '! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' & @CRLF Global $sSpacer2 = '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' & @CRLF _Main() Func _Main() ; Hier jetzt mal etwas total schwachmatisches... ;-) Local $aDataSource = [1, 2, 3, 4, 5], $sDataDestination = '1, 2, 3, 4, 5' Local $aResult = _MergeData($aDataSource, $sDataDestination) If @error Then ConsoleWrite($sSpacer1 & $aResult & @CRLF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @CRLF & $sSpacer2) Local $aDataSource2 = [1, 2, 3, 4, 5], $sDataDestination2 = [[1, 2, 3, 4, 5], ['Ops']] Local $aResult = _MergeData($aDataSource2, $sDataDestination2) If @error Then ConsoleWrite($sSpacer1 & $aResult & @CRLF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @CRLF & $sSpacer2) Local $aDataSource3, $sDataDestination3 = [[1, 2, 3, 4, 5], ['Ops']] Local $aResult = _MergeData($aDataSource3, $sDataDestination3) ; ... If @error Then ConsoleWrite($sSpacer1 & $aResult & @CRLF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @CRLF & $sSpacer2) EndFunc Func _MergeData($vSource, $vDestination) Local $sSourceType = VarGetType($vSource), $sDestinationType = VarGetType($vDestination), _ $sFunc = '_MergeData($vSource, $vDestination)' Switch True Case ($sSourceType <> $sDestinationType) Return SetError(1, 1, StringFormat('! %s\n@\t%s\n>\t%-20s = %-24s\n-\t%-20s = %-14s', $sFunc, 'Daten sind nicht vom selben Typ!', '$vSource', $sSourceType, '$vDestination', $sDestinationType)) Case $sSourceType = 'Array' _ArrayConcatenate($vSource, $vDestination) Switch @error Case 0 Return $vDestination Case 1 ; kann hier nicht der Fall sein... Return SetError(2, 1, StringFormat('! %s\n@\t%s', $sFunc, '$aArrayTarget is not an array')) Case 2 ; kann hier nicht der Fall sein... Return SetError(2, 2, StringFormat('! %s\n@\t%s', $sFunc, '$aArraySource is not an array')) Case 3 Return SetError(2, 3, StringFormat('! %s\n@\t%s', $sFunc, '$aArrayTarget is not a 1D or 2D array')) Case 4 Return SetError(2, 4, StringFormat('! %s\n@\t%s', $sFunc, '$aArrayTarget and $aArraySource 1D/2D mismatch')) Case 5 Return SetError(2, 5, StringFormat('! %s\n@\t%s', $sFunc, '$aArrayTarget and $aArraySource column number mismatch (2D only)')) Case 6 Return SetError(2, 6, StringFormat('! %s\n@\t%s', $sFunc, '$iStart outside array bounds')) EndSwitch Case $sSourceType = 'String' $vDestination &= $vSource Return $vDestination ; Case ... Case Else $vDestination += $vSource Return $vDestination EndSwitch EndFunc
-
Das Projekt an sich birgt keine besonderen Schwierigkeiten... es ist/wird nur recht umfangreich... den fettesten Anteil dabei nimmt am Ende dann der SQLite-Teil ein... und hier hast du schon vom Ansatz her arge Probleme gehabt, ebenso mit deiner Child-GUI... weil deine Basics dafür einfach noch nicht ausreichen.
Zudem würde ich es nicht als pausieren betrachten... sondern als eine intelligente Herangehensweise, wenn du erst noch etwas an deinen Basics arbeitest, was dir am Ende garantiert einen hohen Zeitgewinn einbringt und vor allem aber deine Nerven schont - und du am Ende dann mit Stolz auf ein - dein erstes - wirklich sauber programmiertes Projekt/Kunstwerk blicken kannst.
Und schau mal hier...SQLite_helper.au3 - evtl. kannst du damit ja was anfangen... habe es mir nicht näher angesehen.
-
So läuft es erstmal... aber da hast du noch viel Arbeit vor dir.
Wäre ich an deiner Stelle... mit deinem Wissenstand über AutoIt... bevor ich so ein... doch schon recht großes Projekt mit gutem Gewissen anfangen kann, wären vorher erst mal noch ein paar Wochen/Monate Grundlagen üben angesagt!!!
Wäre das eine Möglichkeit zum Anklicken
Ich würde dafür die GUIListViewEx UFD nehmen - damit kannst du jede Zelle direkt inplace im Listview editieren. Ein paar Beispiele gibt es dazu auch auf der Seite bzw. im Download-Archiv.
Mineralien_DB
AutoIt
Alles anzeigen;-- TIME_STAMP 2016-11-27 15:47:20 #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <SQLite.au3> #include <GuiListView.au3> #include <ComboConstants.au3> #include <SQLite.dll.au3> Global Const $sDbMineral = @ScriptDir & "\mineraldb.sqlite" Global $hDB, $iRval, $aResult, $iRows, $iColumns, $DB, $QLite, $pic #Region ### START Koda GUI section ### Form= $Form1_1 = GUICreate("Mineraliendatenbank", 1181, 736, 214, 142) $MenuItem3 = GUICtrlCreateMenu("&File") $MenuItem4 = GUICtrlCreateMenuItem("New" & @TAB & "Ctrl+Down", $MenuItem3) $MenuItem5 = GUICtrlCreateMenuItem("Open" & @TAB & "", $MenuItem3) $MenuItem6 = GUICtrlCreateMenuItem("Save" & @TAB & "Shift+Ctrl+0", $MenuItem3) $MenuItem7 = GUICtrlCreateMenuItem("Exit" & @TAB & "", $MenuItem3) $MenuItem2 = GUICtrlCreateMenu("&Edit") $MenuItem9 = GUICtrlCreateMenuItem("Delete" & @TAB & "", $MenuItem2) $MenuItem1 = GUICtrlCreateMenu("&Help") $MenuItem8 = GUICtrlCreateMenuItem("About" & @TAB & "", $MenuItem1) GUISetBkColor(0xB9D1EA) $Group1 = GUICtrlCreateGroup("", 176, 80, 945, 553) GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif") $Label1 = GUICtrlCreateLabel("Nummer", 224, 128, 55, 20) $Nummer = GUICtrlCreateInput("", 296, 128, 41, 24) $Label2 = GUICtrlCreateLabel("Name", 384, 128, 41, 20) $Name = GUICtrlCreateInput("", 440, 128, 177, 24) $Group2 = GUICtrlCreateGroup("allg. Eigenschaften", 208, 192, 401, 177) $Label3 = GUICtrlCreateLabel("Formel", 224, 224, 46, 20) $Formel = GUICtrlCreateInput("", 280, 224, 105, 24) $Label4 = GUICtrlCreateLabel("Gewicht", 224, 264, 51, 20) $Gewicht = GUICtrlCreateInput("", 280, 264, 105, 24) $Farbe = GUICtrlCreateLabel("Farbe", 224, 304, 40, 20) $Farb = GUICtrlCreateInput("", 280, 304, 105, 24) $Label5 = GUICtrlCreateLabel("Radioaktiv", 400, 224, 69, 20) $Checkbox1 = GUICtrlCreateCheckbox("Ja", 480, 224, 41, 17) $Checkbox2 = GUICtrlCreateCheckbox("Nein", 544, 224, 41, 17) $Label6 = GUICtrlCreateLabel("Magnetisch", 400, 256, 73, 20) $Ja = GUICtrlCreateCheckbox("Ja", 480, 256, 49, 17) $Nein = GUICtrlCreateCheckbox("Nein", 544, 256, 49, 17) GUICtrlCreateGroup("", -99, -99, 1, 1) $pic = GUICtrlCreatePic("", 640, 112, 441, 305, BitOR($GUI_SS_DEFAULT_PIC, $SS_RIGHTJUST, $WS_BORDER)) $Group3 = GUICtrlCreateGroup("Funddaten", 208, 416, 409, 153) $Fundor = GUICtrlCreateLabel("Fundort", 224, 456, 49, 20) $Fundort = GUICtrlCreateInput("", 304, 456, 241, 24) $Fundlan = GUICtrlCreateInput("", 304, 504, 241, 24) $Fundland = GUICtrlCreateLabel("Fundland", 224, 504, 60, 20) GUICtrlCreateGroup("", -99, -99, 1, 1) $Button1 = GUICtrlCreateButton("Bild öffnen", 744, 424, 97, 33) $Button2 = GUICtrlCreateButton("Bild löschen", 880, 424, 97, 33) GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlCreateInput("", 312, 24, 465, 21) $Suche = GUICtrlCreateLabel("Suche", 256, 24, 55, 24) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Zurueck = GUICtrlCreateButton("Zurück", 440, 648, 65, 33) $Vor = GUICtrlCreateButton("Vor", 696, 648, 65, 33) $ListView1 = GUICtrlCreateListView("", 8, 88, 150, 545) _GUICtrlListView_AddColumn($ListView1, "Name", 70) _GUICtrlListView_AddColumn($ListView1, "Nummer", 150) ;Global $aHeader = StringSplit($ListView1, '|') Global $hListView = GUICtrlGetHandle($ListView1) $cContextMenue = GUICtrlCreateContextMenu($ListView1) GUICtrlCreateListViewItem("", $ListView1) ;Dim $Form1_1_AccelTable[2][2] = [["^{DOWN}", $MenuItem4],["^+0", $MenuItem6]] ;GUISetAccelerators($Form1_1_AccelTable) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### _SQLite_Startup() If @error Then Exit MsgBox(16, "SQLite Fehler", "SQLite.dll konnte nicht geladen werden!") ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion() & @CRLF) Global $hDB = _SQLite_Open($sDbMineral) If @error Then Exit MsgBox(16, "SQLite Fehler", "Die Datenbank konnte nicht geöffnet werden!") If FileExists("mineraldb.sqlite") Then $DB = _SQLite_Open("mineraldb.sqlite") If @error Then Exit MsgBox(16, "SQLite Fehler", "Die Datenbank konnte nicht geöffnet werden!") _SQLite_Exec(-1, "CREATE TABLE IF NOT EXISTS Mineralien (ID INTEGER PRIMARY KEY, Nummer INTEGER, Name TEXT, Formel TEXT, Gewicht TEXT, Farbe TEXT, Fundort TEXT, Fundland TEXT);") _SQLite_Exec(-1, "INSERT INTO Mineralien(Nummer,Name,Formel,Gewicht,Farbe,Fundort,Fundland) VALUES (1, 'Galvanit','H2OKopF','500','rot','Wien','Italien');") _SQLite_Exec(-1, "INSERT INTO Mineralien(Nummer,Name,Formel,Gewicht,Farbe,Fundort,Fundland) VALUES (2, 'Tritanit','O3H2','300','grün','Rom','Schweiz');") EndIf ; Main-Loop While True Switch GUIGetMsg() Case -3 ; Die DB wird nicht gespeichert??? _SQLite_Close($DB) _SQLite_Shutdown() Exit Case $MenuItem5 $iRva = _SQLite_GetTable2d(-1, "SELECT Nummer, * FROM Mineralien;", $aResult, $iRows, $iColumns) _SQLite_GetTable2d(-1, "SELECT Name, * FROM Mineralien;", $aResult, $iRows, $iColumns) _ArrayDelete($aResult, 0) _GUICtrlListView_AddArray($ListView1, $aResult) Case $MenuItem4 _NeuerDatensatz() Case $Button1 $open = FileOpenDialog("Wählen Sie eine Datei aus.", @TempDir, "Bilder (*.jpg;*.bmp;*.png)") If @error Then MsgBox(4096, "", "Keine Datei ausgewählt") EndIf GUICtrlSetImage($pic, $open) Case $MenuItem7 Exit EndSwitch WEnd Func _NeuerDatensatz() #Region ### START Koda GUI section ### Form= Local $hGUI, $nMsg, $idInput_Nummer, $idInput_Formel, $idInput_Farbe, $idInput_Name, $idInput_Gewicht, $idInput_Fundort, $idInput_Fundland, $idInput_Felder, $idButton_OK, $aData[7], $aDefault = ['Nummer', 'Formel', 'Farbe', 'Name', 'Gewicht', 'Fundort', 'Fundland'], $iError = 0, _ $sINSERT = "INSERT INTO Mineralien(Nummer,Name,Formel,Gewicht,Farbe,Fundort,Fundland) VALUES", _ $sFORMAT = "%s (%i,'%s','%s','%s','%s','%s','%s');" $hGUI = GUICreate("Neuer Datensatz", 530, 241, 192, 131) $idInput_Nummer = GUICtrlCreateInput("Nummer", 24, 56, 121, 21) $idInput_Formel = GUICtrlCreateInput("Formel", 24, 104, 121, 21) $idInput_Farbe = GUICtrlCreateInput("Farbe", 24, 152, 121, 21) $idInput_Name = GUICtrlCreateInput("Name", 200, 56, 121, 21) $idInput_Gewicht = GUICtrlCreateInput("Gewicht", 200, 104, 121, 21) $idInput_Fundort = GUICtrlCreateInput("Fundort", 200, 152, 121, 21) $idInput_Fundland = GUICtrlCreateInput("Fundland", 376, 56, 121, 21) $idInput_Felder = GUICtrlCreateLabel("Bitte alle Felder korrekt ausfüllen!", 40, 16, 129, 17) $idButton_Add = GUICtrlCreateButton("Datensatz hinzufügen", 168, 192, 169, 33) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE GUIDelete($hGUI) ExitLoop Case $idButton_Add $aData[0] = GUICtrlRead($idInput_Nummer) $aData[1] = GUICtrlRead($idInput_Formel) $aData[2] = GUICtrlRead($idInput_Farbe) $aData[3] = GUICtrlRead($idInput_Name) $aData[4] = GUICtrlRead($idInput_Gewicht) $aData[5] = GUICtrlRead($idInput_Fundort) $aData[6] = GUICtrlRead($idInput_Fundland) Select Case Int($aData[0]) = 0 ; und prüfen ob die Nummer bereits existiert $iError = 1 Case $aData[1] = $aDefault[1] Or $aData[1] = '' $iError = 1 Case $aData[2] = $aDefault[2] Or $aData[2] = '' $iError = 1 Case $aData[3] = $aDefault[3] Or $aData[3] = '' $iError = 1 Case $aData[4] = $aDefault[4] Or $aData[4] = '' $iError = 1 Case $aData[5] = $aDefault[5] Or $aData[5] = '' $iError = 1 Case $aData[6] = $aDefault[6] Or $aData[6] = '' $iError = 1 EndSelect If $iError = 1 Then MsgBox(262192, @ScriptName, 'Bitte alle Felder korrekt ausfüllen!') ContinueLoop EndIf ; _SQLite_Exec(-1, "INSERT INTO Mineralien (Nummer,Name,Formel,Gewicht,Farbe,Fundort,Fundland) VALUES ('"_ ; & GUICtrlRead($Nummer[1]) & "','" & GUICtrlRead($Input4[2]) & "','" & GUICtrlRead($Input2[3]) & "','" & GUICtrlRead($Input5[4]) & "','" & GUICtrlRead($Input3[5])& "','" & GUICtrlRead($Input6[6])& "','" & GUICtrlRead($Input1[7]) & "');") _SQLite_Exec(-1, StringFormat($sFORMAT, $sINSERT, $aData[0], $aData[1], $aData[2], $aData[3], $aData[4], $aData[5], $aData[6])) ConsoleWrite(StringFormat($sFORMAT, $sINSERT, $aData[0], $aData[1], $aData[2], $aData[3], $aData[4], $aData[5], $aData[6]) & @CRLF) ;Sleep(5000) ;Exit EndSwitch WEnd EndFunc ;==>_NeuerDatensatz
-
Sorry, aber das ist keine gute Lösung, denn...
1.) ...damit kopierst du die Arrays ja zwei Mal: zuerst nach $aArray4, dann nach $ArrayResult - und ignorierst damit zu 100% was ich bezüglich "ByRef" geschrieben habe.
2.) ...sie ist nicht als Funktion mit variabler Anzahl an Parametern ausgelegt.Das Ergebnis gefällt mir auch nicht.
Das Ergebnis ist ja auch speziell auf die Anfrage von @dost0011 ausgerichtet.
-
um es in google ersichtlicher zu machen?
Richtig zu Suchen ist eine Kunst!
Sooo hättest du es gefunden...
-
Hab die Funktion aber nicht getestet
Ich aber... wie zu erwarten - sie funktioniert.
Func Foo($a, $b, $c, $d, $e)
Für wirklich große Arrays ist das so allerdings keine gute Lösung...da wäre es angebracht den Parametern das Schlüsselwort ByRef voranzustellen.
Func Foo(ByRef $a, ByRef $b, ByRef $c, ByRef $d, ByRef $e)Warum?
Hier ein Auszug aus der deutschen Hilfe:
Das Schlüsselwort ByRef zeigt an, dass der Parameter als Referenz zu dem Originalobjekt behandelt werden soll. Standardmäßig wird der Parameter in eine neue Variable kopiert. Jedoch verknüpft ByRef die neue Varaible auf den Originalparameter. ByRef ist zu bevorzugen wenn eine Funktion große Mengen an Daten beinhaltet, wie zum Beispiel ein großen Array. Wird dies nicht getan, so erweist das kopieren aller Daten als Bremsklotz.Wird das Schlüsselwort ByRef angegeben, sind diese Parameter allerdings nicht mehr optional und sie müssen zudem auch als Variable übergeben werden, welche in dem Fall ja als Referenz verwendet werden.
Mit etwas Tricky kann man diesen Umstand aber umgehen und die Vorteile von ByRef nutzen, indem wir (an beliebiger Stelle) einfach Dummy-Variablen verwenden, um so die geforderte Anzahl an Parametern für unsere Funktion zu liefern.
Foo
AutoIt
Alles anzeigen;-- TIME_STAMP 2016-11-22 05:02:01 #include <Array.au3> Global $a[100], $b = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] Global $c = [1, ConsoleWrite, Eval, 3.141], $d = [1, 2, 3, 4, 5, 6], $e = [Default, Null] Global $f, $aDummy = -1, $bDummy = -1, $cDummy = -1, $dDummy = -1, $eDummy = -1 $f = DisplayFoo($a, $b, $c, $d, $e) $f = DisplayFoo($a, $b, $c, $dDummy, $eDummy) $f = DisplayFoo($aDummy, $b, $cDummy, $d, $eDummy) $f = DisplayFoo($a, $bDummy, $c, $dDummy, $e) $f = DisplayFoo($a, $b, $cDummy, $d, $eDummy) ; Hier gibt es natürlich ein Error... $f = DisplayFoo($aDummy, $bDummy, $cDummy, $dDummy, $eDummy) Func DisplayFoo(ByRef $a0, ByRef $a1, ByRef $a2, ByRef $a3, ByRef $a4) $f = Foo($a0, $a1, $a2, $a3, $a4) If @error Then ConsoleWrite("! #Error: " & $f & @LF & "!@ " & @TAB & "#Error: " & @error & @LF) _ArrayDisplay($f) Return $f EndFunc Func Foo(ByRef $a0, ByRef $a1, ByRef $a2, ByRef $a3, ByRef $a4) Local $aU = [UBound($a0), UBound($a1), UBound($a2), UBound($a3), UBound($a4)], $iMax = $aU[0], $n = @NumParams, $col = $n For $i = 1 To $n - 1 Step 1 If $iMax < $aU[$i] Then $iMax = $aU[$i] If $aU[$i] = 0 Then $col -= 1 Next If $iMax < 1 Then Return SetError(1, 0, 'Kein Array zum Kopieren gefunden...') Local $aRet[$iMax][$col], $k = 0 For $j = 0 To UBound($aU) - 1 Step 1 Select Case $aU[$j] > 0 And $j = 0 For $i = 0 To $aU[$j] - 1 Step 1 $aRet[$i][$k] = $a0[$i] Next $k += 1 Case $aU[$j] > 0 And $j = 1 For $i = 0 To $aU[$j] - 1 Step 1 $aRet[$i][$k] = $a1[$i] Next $k += 1 Case $aU[$j] > 0 And $j = 2 For $i = 0 To $aU[$j] - 1 Step 1 $aRet[$i][$k] = $a2[$i] Next $k += 1 Case $aU[$j] > 0 And $j = 3 For $i = 0 To $aU[$j] - 1 Step 1 $aRet[$i][$k] = $a3[$i] Next $k += 1 Case $aU[$j] > 0 And $j = 4 For $i = 0 To $aU[$j] - 1 Step 1 $aRet[$i][$k] = $a4[$i] Next $k += 1 EndSelect Next Return $aRet EndFunc
-
sind aber glaub ich auch nicht alle
Ja, und ich lese gerade auf dieser Seite, welche er da auflistet: Some less common commands with no menu equivalent are:
Ich muss sagen, ich bin sehr erstaunt, dass es da wohl keine komplette Liste von gibt...
-
Komplett sind die aber nicht... "Shift+F2 - Go to the pevious Bookmark" fehlt z. B.
-
Wo ist bei einem Tooltip der Unterschied zwischen Parent und dem Fenster zu dem dem das Control gehört?
Bei einem ToolTip() gibt es keinen... denn dazu müsste die interne AutoIt-Funktion ein Window-Handle als Parameter anbieten, was aber nicht der Fall ist, weil ein eigenes Window kreiert wird.
Wäre es anders, würde dies hier nicht funktionieren... tut es aber!
Edit: Lese jetzt erst, dass es hier um _GUITooltip geht...Bei dem _GUITooltip kannst du hingegen ein Window-handle angeben, auf welchem dieser angezeigt werden soll. Hier denke ich, verhält sich das etwa so...
Wurden die GUITooltips vom Parent-Window erzeugt und wird dieses geschlossen, sind die Tips für das Owner-Window nicht mehr verfügbar. Wurden die GUITooltips vom Owner-Window erzeugt und wird dieses geschlossen, sind sie für das Parent-Window nicht mehr verfügbar.Wenn du ein Scrript schreibst und eine GUI kreiert, dann ist diese GUI dein "Owner-Window". Dein Prozess ist dann also analog dazu dein "Owner-Prozess" der von einem anderen Prozess gestartet wurde, dem "Parent-Prozess", von dem wir uns neben dem "Proccess-Handle", der "PID" und zig anderen Infos, auch dessen "Window-Handle" besorgen können... und genau dieses Window-Handle ist dann dein "Parent-Window".
Ich habe dir mal ein kleines Script getippert, dass du auf unterschiedliche Weise starten solltest, da sich dann das "Parent-Window" entsprechend ändert und du es so besser nachvollziehen kannst.
Z. B.:- Starte das Script direkt aus SciTE heraus, ohne es vorher zu kompilieren.
- Starte das kompilierte Script (also die EXE) mit dem Windows-Explorer
- Starte das kompilierte Script in der Eingabeaufforderung
- Starte das kompilierte Script mit einem anderen Script via Run("WinInfo.exe")
- Kompiliere das andere Script und starte es nochmals damit.
Dann schließe mal dein Child-Window... dann dein Owner-Window... was in dem Fall das Parent-Window ist... dann umgekehrt...
WinInfo.au3
AutoIt
Alles anzeigen;-- TIME_STAMP 2016-11-19 22:59:03 ; Constants #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> ; Includes #include <Array.au3> #include <GuiListView.au3> #include <GUIToolTip.au3> #include <Process.au3> #include <WinAPI.au3> #include <WinAPISys.au3> #include <WinAPIProc.au3> _Main() Func _Main() #region - GUI Create Local $x = @DesktopWidth -80, $msg, $hWndOwner, $idLV, $hLV, $idButton_Exit, $hButton_Exit, $aInfo[2][7], $hWndParent, $iPID, _ $sSpacer1 = '~~~~~~~~~~~~~~~~~~~~~~~~' $sSpacer2 = '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' Local Enum $enPID, $enProcName, $enHW, $enWT, $enCW, $enO, $enP Local Enum $enOwner, $enParent $hWndOwner = GUICreate('Unsere GUI', $x, 145, -1, -1) GUISetFont(8.5, 800, 0, 'Courier New') $idLV = GUICtrlCreateListView('PID|Process-Name|Window-Handle/ClassName|Window-Title|Child-Windows|Owner|Parent', 0, 0, $x, 100) $hLV = GUICtrlGetHandle($idLV) _GUICtrlListView_SetColumnWidth($idLV, 0, 50) ; PID _GUICtrlListView_SetColumnWidth($idLV, 1, Int($x*0.10)) ; Process-Name _GUICtrlListView_SetColumnWidth($idLV, 2, Int($x*0.15)) ; Window-Handle/ClassName _GUICtrlListView_SetColumnWidth($idLV, 3, Int($x*0.15)) ; Window-Title _GUICtrlListView_SetColumnWidth($idLV, 4, Int($x*0.51)) ; Child-Windows _GUICtrlListView_SetColumnWidth($idLV, 5, 50) ; Owner _GUICtrlListView_SetColumnWidth($idLV, 6, 50) ; Parent _GUICtrlListView_JustifyColumn($idLV, 0, 1) $idButton_Exit = GUICtrlCreateButton('Exit', 5, 110, $x -10, 25) $hButton_Exit = GUICtrlGetHandle($idButton_Exit) Local $hToolTip = _GUIToolTip_Create(0) GUISetState() #endregion ; Owner PID - oder mit WinGetProcess($hWnd) $aInfo[$enOwner][$enPID] = @AutoItPID ; Owner ProcessName $aInfo[$enOwner][$enProcName] = _ProcessGetName(@AutoItPID) ; Owner Window-Handle $aInfo[$enOwner][$enHW] = $hWndOwner & '/' & _WinAPI_GetClassName($hWndOwner) ; Owner Window-Title $aInfo[$enOwner][$enWT] = WinGetTitle($hWndOwner) ; Owner Child-Window-Handles Local $aOwnerChildWindows = _WinAPI_EnumChildWindows($hWndOwner) $aInfo[$enOwner][$enCW] = _ArrayToString($aOwnerChildWindows, ', ') ; Owner $aInfo[$enOwner][$enO] = 'X' _ArrayAdd($aOwnerChildWindows, $sSpacer1 & '|' & $sSpacer2) _ArrayDisplay($aOwnerChildWindows, '$aOwnerChildWindows - ' & $aInfo[$enOwner][$enWT]) ; Parent PID $aInfo[$enParent][$enPID] = _WinAPI_GetParentProcess() ; Parent ProcessName $aInfo[$enParent][$enProcName] = _ProcessGetName($aInfo[$enParent][$enPID]) ; Parent Window-Handle Local $aParentProcessWindows = _WinAPI_EnumProcessWindows($aInfo[$enParent][$enPID], False) For $i = 1 To $aParentProcessWindows[0][0] Step 1 If WinGetProcess($aParentProcessWindows[$i][0]) = $aInfo[$enParent][$enPID] Then $aInfo[$enParent][$enHW] = $aParentProcessWindows[$i][0] $aInfo[$enParent][$enWT] = WinGetTitle($aInfo[$enParent][$enHW]) If $aInfo[$enParent][$enWT] = '' Then ContinueLoop ExitLoop EndIf Next ; Parent Child-Window-Handles Local $aParentChildWindows = _WinAPI_EnumChildWindows($aInfo[$enParent][$enHW]) _ArrayAdd($aParentChildWindows, $sSpacer1 & '|' & $sSpacer2) $aInfo[$enParent][$enHW] &= '/' & _WinAPI_GetClassName($aInfo[$enParent][$enHW]) $aInfo[$enParent][$enCW] = _ArrayToString($aParentChildWindows, ', ') $aInfo[$enParent][$enP] = 'X' _ArrayDisplay($aParentChildWindows, '$aParentChildWindows - ' & $aInfo[$enParent][$enWT]) _GUICtrlListView_AddArray($idLV, $aInfo) Local $hWndParent = $aInfo[$enParent][$enHW] ; add tools to the tooltip controls _GUIToolTip_AddTool($hToolTip, $hWndOwner, "$hWndOwner - $hLV", $hLV) _GUIToolTip_AddTool($hToolTip, $hWndOwner, "$hWndOwner - $hButton_Exit", $hButton_Exit) #region - ChildGUI Create Local $aWinPos = WinGetPos($hWndOwner) Local $hWndChildOwner = GUICreate('MyChildGUI', 400, 45, -1, $aWinPos[1] + $aWinPos[3] + 20, -1, -1, $hWndOwner) $idChildButton_Exit = GUICtrlCreateButton('Exit', 5, 10, 390, 25) $hChildButton_Exit = GUICtrlGetHandle($idChildButton_Exit) _GUIToolTip_AddTool($hToolTip, $hWndChildOwner, "$hWndChildOwner - $hChildButton_Exit", $hChildButton_Exit) GUISetState() GUISwitch($hWndOwner) #endregion #region - GUI SelectLoop While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Or $msg = $idButton_Exit Exit Case $msg = $idChildButton_Exit GUIDelete($hWndChildOwner) ;Case $msg = ;Case $msg = ;Case $msg = EndSelect WEnd #endregion ; Destroy the tooltip controls _GUIToolTip_Destroy($hToolTip) EndFunc
-
Du kannst dir dazu ja mal die Funktion _WinAPI_DragAcceptFiles() anschauen und die _FileDragDrop UDF...