Hier z.B. http://www.autoit.de/dokumentation_…/MouseClick.htm oder auch in Hilfe ...
Was hast du denn genau vor? Y, X kannst du mit dem Autoit Info tool herausfinden, sollten sich die Koordinaten ändern ist vielleicht ein anderer Weg sinnvoller.
Hier z.B. http://www.autoit.de/dokumentation_…/MouseClick.htm oder auch in Hilfe ...
Was hast du denn genau vor? Y, X kannst du mit dem Autoit Info tool herausfinden, sollten sich die Koordinaten ändern ist vielleicht ein anderer Weg sinnvoller.
#Include <Array.au3>
#Include <GUIConstantsEx.au3>
Opt('WinTitleMatchMode', 3)
[/autoit] [autoit][/autoit] [autoit]global const $TITLE_RECEIVER = 'DVBViewerSleepTimerReceiver'
global const $WM_COPYDATA = 0x004A
Global $NewDataAvailable = False, $avData[1]
if WinExists($TITLE_RECEIVER) then
; Kommandozeile an schon laufendes Skript weitergeben
If $CMDLINE[0] = 0 Then Exit
_SendData(WinGetHandle($TITLE_RECEIVER),$CMDLINERAW)
Exit
else
; Empfänger mit normalem Skript starten
_Receiver()
Exit
endif
func _Receiver()
GUICreate($TITLE_RECEIVER)
GUIRegisterMsg($WM_COPYDATA, '_WM_COPYDATA')
while 1
Sleep(10)
if $NewDataAvailable then
$NewDataAvailable = False
$sMsg = $avData[1]
_ArrayDelete($avData,1)
$aMsg = _ParseCMDLine($sMsg)
For $i = 0 To UBound($aMsg)-1
Switch $aMsg[$i][1]
Case "dauer"
MsgBox(0, '', "Dauer anzeigen")
Case "stop"
MsgBox(0, '', "beenden")
Exit
EndSwitch
Next
endif
wend
GUIDelete()
endfunc; _Receiver
;===============================================================================
;
; Function Name: _ParseCMDLine($CMDString)
; Description:: Parses a CMD-String to Parameters with Values
; Parameter(s): $CMDString -> String to parse
; Requirement(s): ?
; Return Value(s): Error: 0 and @error = StringRegExp-Error
; Success: 2 Dimensional Array:
; $array[$i][0] : Parameter including value
; $array[$i][1] : Parameter
; $array[$i][2] : Value with quotation marks (only if value has quotaion marks)
; $array[$i][3] : Value without quotation marks
; Author(s): Prog@ndy
;
; Basis: http://regexlib.com/REDetails.aspx?regexp_id=1220
;===============================================================================
;
Func _ParseCMDLine($CMDString)
Local $y, $j, $i, $entry
Local $x = StringRegExp($CMDString,'(?:\s*)(?<=[-|/])(?<name>[^\s-|/:|=]*)(?:(?:[:|=](?:("(?<value1>.*?)(?<!\\)")|(?<value>\S*)))|\w*?)',4)
If @error Then Return SetError(@error,0,0)
Local $ResultArray[UBound($x)][4]
For $i = 0 To UBound($x)-1
$entry = $x[$i]
For $y = 0 To UBound($entry)-1
$j = $y
If $y > 3 Then $j = 3
$ResultArray[$i][$j] = $entry[$y]
Next
Next
Return $ResultArray
EndFunc
func _SendData($hWnd, $sData)
local $tCOPYDATA, $tMsg
[/autoit] [autoit][/autoit] [autoit]$tMsg = DllStructCreate('wchar[' & StringLen($sData) + 1 & ']')
DllStructSetData($tMsg, 1, $sData)
$tCOPYDATA = DllStructCreate('dword;dword;ptr')
DllStructSetData($tCOPYDATA, 2, DllStructGetSize($tMsg))
DllStructSetData($tCOPYDATA, 3, DllStructGetPtr($tMsg))
$Ret = DllCall('user32.dll', 'lparam', 'SendMessageW', 'hwnd', $hWnd, 'int', $WM_COPYDATA, 'wparam', 0, 'lparam', DllStructGetPtr($tCOPYDATA))
if (@error) or ($Ret[0] = -1) then
return 0
endif
return 1
endfunc; _SendData
func _WM_COPYDATA($hWnd, $msgID, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]local $tCOPYDATA = DllStructCreate('dword;dword;ptr', $lParam)
local $tMsg = DllStructCreate('wchar[' & DllStructGetData($tCOPYDATA, 2)/2 & ']', DllStructGetData($tCOPYDATA, 3))
_ArrayAdd($avData, DllStructGetData($tMsg, 1))
$NewDataAvailable = True
return 0
endfunc; _WM_COPYDATA
So können Skripte per cmdline "kommunizieren".
Hast du dir die Hilfe zu Random angesehen? Du kannst keinen String verwenden.
Mal ein Lösungsvorschlag: Alle Pfade in ein 1D-Array laden und per Random den Index bestimmen.
edit \ so ca.
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>
dim $apic[3]
$apic[0]=@ScriptDir & "\AAl.bmp"
$apic[1]=@ScriptDir & "\bachforelle.bmp"
$apic[2]=@ScriptDir & "\barbe.bmp"
_ArrayDisplay($apic)
GUICreate("Meine Fische Mit Bild,Rechtschreibung Gross Und Klein Egal",1000,700)
[/autoit] [autoit][/autoit] [autoit]$a= Random(0,ubound($apic), 1)
MsgBox(1, "", $apic[$a])
GUISetBkColor (0x90BBCC)
GUICtrlCreateLabel("Wie Heißen Diese Fische",430,0,150,30)
$1=GUICtrlCreateInput("",10,30,100,30)
$2=GUICtrlCreateButton("O.K",110,30,30,30)
GUICtrlCreatePic($apic[$a],10,60, 300,200)
$3=GUICtrlCreateInput("",350,30,100,30)
$4=GUICtrlCreateButton("O.K",450,30,30,30)
GUICtrlCreatePic("D:\Fisch-Bitmap\bachforelle.bmp",350,60, 300,200)
$5=GUICtrlCreateInput("",690,30,100,30)
$6=GUICtrlCreateButton("O.K",790,30,30,30)
GUICtrlCreatePic("D:\Fisch-Bitmap\barbe.bmp",690,60, 300,200)
GUISetState ()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Eine Varinate mti $WM_Command.
Übernehmen graut den Cancel Buttons aus und Speichert den "Text" vom Input MSN_1.
Eine Veränderung in MSN_1 aktiviert den Cancel Button wieder.
Ist nur ein Beispiel, wenns Fragen beim Umbau gibt kannste dich ja nochmal melden.
#include <GUIConstantsEx.au3>
#include <String.au3>
#include <WindowsConstants.au3>
;Passwort-Zeichen definieren
$ES_PASSWORD = 0x0020
Global $text
[/autoit] [autoit][/autoit] [autoit]$Form1_1 = GUICreate("MoonyDialer Konfiguration", 484, 426, 323, 147)
$Group1 = GUICtrlCreateGroup("Fritzbox-Einstellungen", 16, 8, 449, 401)
$save = GUICtrlCreateButton("Speichern", 368, 40, 75, 25, 0)
$apply = GUICtrlCreateButton("Übernehmen", 368, 72, 75, 25, 0)
$cancel = GUICtrlCreateButton("Abbrechen", 368, 120, 75, 25, 0)
$Group2 = GUICtrlCreateGroup("Standard MSN und Port", 32, 32, 305, 89)
$MSN_1 = GUICtrlCreateInput("", 88, 64, 89, 21)
$Label_MSN_1 = GUICtrlCreateLabel("MSN 1", 48, 64, 37, 17)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT)
$Label_Port_1 = GUICtrlCreateLabel("Zug. Portnr.", 197, 63, 60, 17)
$Port_1 = GUICtrlCreateInput("", 261, 63, 65, 21)
$Label1 = GUICtrlCreateLabel("... werden verwendet, falls keine Zuordnung möglich ist", 53, 95, 264, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("Weitere MSNs und Ports", 32, 136, 305, 137)
$MSN_2 = GUICtrlCreateInput("", 85, 167, 89, 21)
$Port_2 = GUICtrlCreateInput("", 261, 167, 65, 21)
$MSN_3 = GUICtrlCreateInput("", 85, 199, 89, 21)
$Port_3 = GUICtrlCreateInput("", 261, 199, 65, 21)
$MSN_4 = GUICtrlCreateInput("", 85, 231, 89, 21)
$Port_4 = GUICtrlCreateInput("", 261, 231, 65, 21)
$Label_Port_4 = GUICtrlCreateLabel("Zug. Portnr.", 197, 231, 60, 17)
$Label_Port_3 = GUICtrlCreateLabel("Zug. Portnr.", 197, 199, 60, 17)
$Label_Port_2 = GUICtrlCreateLabel("Zug. Portnr.", 197, 167, 60, 17)
$Label_MSN_2 = GUICtrlCreateLabel("MSN 2", 45, 167, 37, 17)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT)
$Label_MSN_3 = GUICtrlCreateLabel("MSN 3", 45, 199, 37, 17)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT)
$Label_MSN_4 = GUICtrlCreateLabel("MSN 4", 45, 231, 37, 17)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("Passwort und IP-Adresse", 32, 288, 305, 105)
$Passwort = GUICtrlCreateInput("", 109, 319, 217, 21, $ES_PASSWORD)
$IP = GUICtrlCreateInput("", 109, 351, 217, 21)
$Label_IP_Adresse = GUICtrlCreateLabel("IP-Adresse", 45, 351, 55, 17)
$Label_Passwort = GUICtrlCreateLabel("Passwort", 45, 319, 47, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label_Hilfe = GUICtrlCreateLabel("Hilfe", 408, 368, 31, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
;INI-Datei auslesen
$MSN_Port_Settings = IniReadSection("moony_dialer_settings.ini", "MSN_Port_Settings")
$FritzBox_Settings = IniReadSection("moony_dialer_settings.ini", "FritzBox_Settings")
If @error Then
MsgBox(4096, "", "Fehler! Die ini-Datei ist nicht vorhanden oder fehlerhaft und wird neu erstellt.")
;Alte ini löschen
FileRecycle("moony_dialer_settings.ini")
;Neue ini erzeugen
IniWrite("moony_dialer_settings.ini", "MSN_Port_Settings", "MSN_1", "")
IniWrite("moony_dialer_settings.ini", "MSN_Port_Settings", "Port_1", "")
IniWrite("moony_dialer_settings.ini", "MSN_Port_Settings", "MSN_2", "")
IniWrite("moony_dialer_settings.ini", "MSN_Port_Settings", "Port_2", "")
IniWrite("moony_dialer_settings.ini", "MSN_Port_Settings", "MSN_3", "")
IniWrite("moony_dialer_settings.ini", "MSN_Port_Settings", "Port_3", "")
IniWrite("moony_dialer_settings.ini", "MSN_Port_Settings", "MSN_4", "")
IniWrite("moony_dialer_settings.ini", "MSN_Port_Settings", "Port_4", "")
IniWrite("moony_dialer_settings.ini", "FritzBox_Settings", "Passwort", "")
IniWrite("moony_dialer_settings.ini", "FritzBox_Settings", "IP_Adresse", "")
;...und wieder einlesen
$MSN_Port_Settings = IniReadSection("moony_dialer_settings.ini", "MSN_Port_Settings")
$FritzBox_Settings = IniReadSection("moony_dialer_settings.ini", "FritzBox_Settings")
EndIf
;Werte in die Felder eintragen
GUICtrlSetData($MSN_1, $MSN_Port_Settings[1][1])
GUICtrlSetData($Port_1, $MSN_Port_Settings[2][1])
GUICtrlSetData($MSN_2, $MSN_Port_Settings[3][1])
GUICtrlSetData($Port_2, $MSN_Port_Settings[4][1])
GUICtrlSetData($MSN_3, $MSN_Port_Settings[5][1])
GUICtrlSetData($Port_3, $MSN_Port_Settings[6][1])
GUICtrlSetData($MSN_4, $MSN_Port_Settings[7][1])
GUICtrlSetData($Port_4, $MSN_Port_Settings[8][1])
GUICtrlSetData($Passwort, _StringEncrypt(0, $FritzBox_Settings[1][1], "ETWAS INDIVIDUELLES", 2))
GUICtrlSetData($IP, $FritzBox_Settings[2][1])
;Die Funktionen _collect_data und _save_to_ini werden sowohl beim Speichern als auch beim Übernehmen verwendet, daher als Funktion
Func _collectData()
$MSN_Port_Settings[1][1] = GUICtrlRead($MSN_1)
$MSN_Port_Settings[2][1] = GUICtrlRead($Port_1)
$MSN_Port_Settings[3][1] = GUICtrlRead($MSN_2)
$MSN_Port_Settings[4][1] = GUICtrlRead($Port_2)
$MSN_Port_Settings[5][1] = GUICtrlRead($MSN_3)
$MSN_Port_Settings[6][1] = GUICtrlRead($Port_3)
$MSN_Port_Settings[7][1] = GUICtrlRead($MSN_4)
$MSN_Port_Settings[8][1] = GUICtrlRead($Port_4)
$FritzBox_Settings[1][1] = _StringEncrypt(1, GUICtrlRead($Passwort), "ETWAS INDIVIDUELLES", 2)
$FritzBox_Settings[2][1] = GUICtrlRead($IP)
EndFunc ;==>_collectData
Func _save_to_ini()
IniWriteSection("moony_dialer_settings.ini", "MSN_Port_Settings", $MSN_Port_Settings)
IniWriteSection("moony_dialer_settings.ini", "FritzBox_Settings", $FritzBox_Settings)
EndFunc ;==>_save_to_ini
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
[/autoit] [autoit][/autoit] [autoit];Meldungen der GUI abfangen
While 1
$nMsg = GUIGetMsg(1)
;... und auswerten:
Select
; SAVE: Daten speichern und Fenster schließen
Case $nMsg[0] = $save
_collectData() ;Daten aus GUI auslesen
_save_to_ini() ;Daten wieder in die .ini-Datei schreiben
ExitLoop
; APPLY: Daten speichern, sonst nichts
Case $nMsg[0] = $apply ;der Übernehmen button -> Cancle Button wird ausgegraut und Änderungen im ersten Input (MSN_1) aufgezeichnet
GUICtrlSetState($cancel, @SW_DISABLE)
$text = GUICtrlRead($MSN_1)
;_collectData() ;Daten aus GUI auslesen
;M_save_to_ini() ;Daten wieder in die .ini-Datei schreiben
GUICtrlSetState($cancel, $GUI_DISABLE) ;Cancel-Button disablen
; CANCEL: Fenster schließen ohne zu speichern
Case $nMsg[0] = $cancel
ExitLoop
; Im Hilfefall...
Case $nMsg[0] = $Label_Hilfe
Run("hh.exe moony_dialer_help.chm", "")
;Bei Veränderungen in den Textfeldern den Cancel-Button wieder enabeln
Case $nMsg[0] = $MSN_1 Or $nMsg[0] = $MSN_2 Or $nMsg[0] = $MSN_3 Or $nMsg[0] = $MSN_4 Or $nMsg[0] = $Port_1 Or $nMsg[0] = $Port_2 Or $nMsg[0] = $Port_3 Or $nMsg[0] = $Port_4
GUICtrlSetState($cancel, $GUI_ENABLE)
; CLOSE-BUTTON: Rotes Kreuz schließt Fenster ohne zu speichern
Case $nMsg[0] = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
_Check_Eingabe($iwParam)
Local $hWndFrom, $iIDFrom, $iCode, $hWndListBox
If Not IsHWnd($MSN_1) Then $hWndListBox = GUICtrlGetHandle($MSN_1)
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func _Check_Eingabe($iwParam)
Switch $iwParam
Case 0x03000008
If $text <> GUICtrlRead($MSN_1) and $text <> "" Then
GUICtrlSetState($cancel, @SW_ENABLE)
MsgBox(1, "", "MSN_1 geändert")
$text = "" ; Speichervaribale zurücksetzen
EndIf
EndSwitch
EndFunc ;==>_Check_Eingabe
[/autoit]Verstehe ich nicht ganz, im Beispiel wird doch auf jede Änderung im Textfeld reagiert?
Hast du mal ein lauffähiges Skript? Dann bastel ichs rein, sonst ists schwer vorstellbar was du eigentlich haben willst.
Alternativ könnte man auch über WM_Command abfragen ob sich beim Input was verändert.
Bsp.
#include <GuiListBox.au3>
#include <WindowsConstants.au3>
#include <File.au3>
Local $Ordner = 'C:\Programme'
Local $TempFile = _TempFile()
Global $aOrdner
HotKeySet("{ENTER}", "_Open_Ordner")
RunWait(@ComSpec & " /c " & 'dir "'&$Ordner&'" /ad /b > "'&$TempFile&'"', "", @SW_HIDE)
_FileReadToArray($TempFile, $aOrdner)
FileDelete($TempFile)
Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]$gui = GUICreate('Schnelle Ordnerauswahl by funkey', 400, 600, -1, -1)
GUISetOnEvent(-3, '_Ende')
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
Global $Input = GUICtrlCreateInput('', 10, 10, 380, 20)
Global $List = GUICtrlCreateList('', 10, 40, 380, 560)
Global $hList = GUICtrlGetHandle(-1)
For $i = 1 To $aOrdner[0]
GUICtrlSetData(-1, $aOrdner[$i])
Next
GUISetState()
[/autoit] [autoit][/autoit] [autoit]While 1
Sleep(100000)
WEnd
Func _Check_Eingabe($iwParam)
switch $iwParam
case 0x03000003
_GUICtrlListBox_SetCurSel($hList, _GUICtrlListBox_FindString($hList, GUICtrlRead($Input)))
EndSwitch
EndFunc
Func _Open_Ordner()
If GUICtrlRead($List) <> "" Then ShellExecute($Ordner & '\' & GUICtrlRead($List))
EndFunc
Func _Ende()
Exit
EndFunc
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
_Check_Eingabe($iwParam)
Local $hWndFrom, $iIDFrom, $iCode, $hWndListBox
If Not IsHWnd($List) Then $hWndListBox = GUICtrlGetHandle($List)
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $hWndFrom
Case $List, $hWndListBox
Switch $iCode
Case $LBN_DBLCLK
_Open_Ordner()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND (Bugfix - http://www.autoit.de)
was heisst "scheinbar"^^
Naja wenn man sich ansieht was WM_Command so liefert ![]()
Wie auch immer hauptsache es funktioniert ![]()
Hehe kein Problem, der WM_Command führt scheinbar ja auch zum Ziel.
Allerdings scheint (lt. google) das Abfangen der Enter-Taste kein Autoit spezifisches Problem zu sein.
Irgendwo ist da noch ein Verständnisproblem zur Umsetzung und sowas ist nie gut ![]()
Irgendwie ziemlich kompliziert. ![]()
Hab hier mal ein workaround:
;#BETA
#include <GuiImageList.au3>
#include <GUIListView.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
Global Const $tagSHFILEINFO = "dword hIcon; int iIcon; DWORD dwAttributes; CHAR szDisplayName[255]; CHAR szTypeName[80];"
Global Const $SHGFI_USEFILEATTRIBUTES = 0x10
Global Const $SHGFI_SYSICONINDEX = 0x4000
Global Const $FILE_ATTRIBUTE_NORMAL = 0x80
Global Const $SHGFI_SMALLICON = 0x1
Global Const $SHGFI_LARGEICON = 0x0
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=D:\Dokumente\Dateien von Andreas\AutoIt3\FTP\GUI_MAIN.kxf
Global $GUI_MAIN = GUICreate("Au3FTP", 882, 586, 193, 125)
GUISetOnEvent(-3, "GUI_Close")
Global $inpLocalDirectory = GUICtrlCreateInput("", 8, 28, 369, 20);, $ES_READONLY)
Global $ListView1 = GUICtrlCreateListView("Name|Datum|Größe", 8, 48, 369, 489)
Global $button = GUICtrlCreateButton("Name|Datum|Größe", 100, 550)
Global $SHELLLISTVIEWHANDLE = GUICtrlGetHandle($ListView1) ; Get the Handle
GUIRegisterMsg($WM_COMMAND, "WM_Command")
[/autoit] [autoit][/autoit] [autoit]GUISetState()
[/autoit] [autoit][/autoit] [autoit]while 1
Sleep(100)
wend
Func GUI_Close()
Exit
endfunc
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $hWndListBox
If Not IsHWnd($ListView1) Then $hWndListBox = GUICtrlGetHandle($ListView1)
$hWndFrom = _WinAPI_GetFocus() ;zum bestimmen welches Control den Fokus hat, $ilParam liefert nichts vernünftiges
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $hWndFrom
Case $hWndListBox
Switch $iCode
Case 0 ; $icode für Enter?
MsgBox(1, "", "WM_Command")
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Hey,
ich bastle gerade eine Winamp Oberfläche, die mit der Fernbedienung bedient werden kann.
Das Bedienkonzept wollte ich es ganz einfach halten:
Pfeilstasten hoch/runter um die Items im Listview durchzugehen (Verzeichnisse bzw. Dateien);
rechte Pfeiltaste -> in einen Unterordner gehen oder die Datei zur Playliste hinzufügen;
linke Pfeiltaste -> wieder raus aus dem Unterordner bzw. ins übergeordnete Verzeichnis wechseln;
Enter -> Den ganzen Unterordner zu Playliste hinzufügen / die ausgewählte Datei zur Playliste hinzufügen
Für den Browser habe ich ein Beispiel von Progandy genommen (Achtung da hab ich schon drin rumgeschmiert, wer das Orginal haben will muss mal die Suchfunktion bemühen):
;#BETA
#include <GuiImageList.au3>
#include <GUIListView.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
Global Const $tagSHFILEINFO = "dword hIcon; int iIcon; DWORD dwAttributes; CHAR szDisplayName[255]; CHAR szTypeName[80];"
Global Const $SHGFI_USEFILEATTRIBUTES = 0x10
Global Const $SHGFI_SYSICONINDEX = 0x4000
Global Const $FILE_ATTRIBUTE_NORMAL = 0x80
Global Const $SHGFI_SMALLICON = 0x1
Global Const $SHGFI_LARGEICON = 0x0
Global Const $FOLDERUP_ICON_INDEX = _GUIImageList_AddIcon(_GUIImageList_GetSystemImageList(), @SystemDir & "\shell32.dll", 132)
Global Const $FOLDER_ICON_INDEX = _GUIImageList_GetFileIconIndex(@SystemDir, 0, 1)
Global Const $NOICON_ICON_INDEX = _GUIImageList_GetFileIconIndex("nb lgl", 0, 0)
Global $path = "C:\Programme"
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=D:\Dokumente\Dateien von Andreas\AutoIt3\FTP\GUI_MAIN.kxf
Global $GUI_MAIN = GUICreate("Au3FTP", 882, 586, 193, 125)
GUISetOnEvent(-3, "GUI_Close")
Global $inpLocalDirectory = GUICtrlCreateInput("", 8, 28, 369, 20, $ES_READONLY)
Global $ListView1 = GUICtrlCreateListView("Name|Datum|Größe", 8, 48, 369, 489)
Global $SHELLLISTVIEWHANDLE = GUICtrlGetHandle($ListView1) ; Get the Handle
[/autoit] [autoit][/autoit] [autoit]GUICtrlSendMsg($ListView1, 0x101E, 0, 200)
GUICtrlSendMsg($ListView1, 0x101E, 1, 75)
GUICtrlSendMsg($ListView1, 0x101E, 2, 50)
GUIRegisterMsg($WM_NOTIFY, "_SHLV_WM_NOTIFY")
_GUICtrlListView_SetImageList($ListView1, _GUIImageList_GetSystemImageList(), 1)
Global $DIRECTORY_LOCAL = "" ; Start with Selection of drives (IMG:http://www.autoitscript.com/forum/style_em…utoit/smile.gif)
_SHLV_PopulateLocalListView($SHELLLISTVIEWHANDLE, $DIRECTORY_LOCAL)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
Sleep(100)
WEnd
Func GUI_Close()
Exit
EndFunc ;==>GUI_Close
; Prog@ndy
Func _SHLV_PopulateLocalListView($hListView1, ByRef $DIRECTORY_LOCAL)
If Not IsHWnd($hListView1) Then $hListView1 = GUICtrlGetHandle($hListView1)
If $DIRECTORY_LOCAL = "" Then
Local $drives = DriveGetDrive("ALL")
GUICtrlSetData($inpLocalDirectory, "Pfad Auswahl")
_GUICtrlListView_BeginUpdate($hListView1)
_GUICtrlListView_DeleteAllItems($hListView1)
_GUICtrlListView_AddItem($hListView1, $path);, _GUIImageList_GetFileIconIndex($drives[$i] & "\"))
_GUICtrlListView_EndUpdate($hListView1)
Return
EndIf
If StringRight($DIRECTORY_LOCAL, 1) <> "\" Then $DIRECTORY_LOCAL &= "\"
If DriveStatus(StringLeft($DIRECTORY_LOCAL, 3)) <> "READY" Then Return 0 * MsgBox(16 + 8192, 'Error on Drive Access', "Drive " & StringLeft($DIRECTORY_LOCAL, 3) & " not ready!")
GUICtrlSetData($inpLocalDirectory, $DIRECTORY_LOCAL)
$files = _SHLV__FileListToArray2($DIRECTORY_LOCAL, "*.*", 2)
_GUICtrlListView_BeginUpdate($hListView1)
_GUICtrlListView_DeleteAllItems($hListView1)
Local $foldercount = 0
_GUICtrlListView_AddItem($hListView1, "< .. >", $FOLDERUP_ICON_INDEX)
If IsArray($files) Then
_GUICtrlListView_SetItemCount($hListView1, $files[0] + 1)
$foldercount = $files[0] + 1
For $i = 1 To $files[0]
$item = _GUICtrlListView_AddItem($hListView1, $files[$i], $FOLDER_ICON_INDEX)
_GUICtrlListView_AddSubItem($hListView1, $item, __SHLV_FormatFilesize(DirGetSize($DIRECTORY_LOCAL & $files[$i], 2)), 2)
Next
EndIf
$files = _SHLV__FileListToArray2($DIRECTORY_LOCAL, "*.*", 1)
_GUICtrlListView_EndUpdate($hListView1)
_GUICtrlListView_BeginUpdate($hListView1)
If IsArray($files) Then
_GUICtrlListView_SetItemCount($hListView1, $files[0] + $foldercount)
For $i = 1 To $files[0]
$item = _GUICtrlListView_AddItem($hListView1, $files[$i], _GUIImageList_GetFileIconIndex($files[$i]))
_GUICtrlListView_AddSubItem($hListView1, $item, __SHLV_FileDateString2Calc(FileGetTime($DIRECTORY_LOCAL & $files[$i], 0, 1)), 1)
_GUICtrlListView_AddSubItem($hListView1, $item, __SHLV_FormatFilesize(FileGetSize($DIRECTORY_LOCAL & $files[$i])), 2)
Next
EndIf
_GUICtrlListView_EndUpdate($hListView1)
EndFunc ;==>_SHLV_PopulateLocalListView
; Prog@ndy
Func __SHLV_FormatFilesize($size)
Select
Case $size > 1000
Return Round($size / 1024, 1) & " KB"
Case $size > 1048500
Return Round($size / 1048576, 1) & " MB"
Case Else
Return $size & " Byte"
EndSelect
EndFunc ;==>__SHLV_FormatFilesize
; Prog@ndy
Func _GUIImageList_GetSystemImageList($bLargeIcons = False)
Local $dwFlags, $hIml, $FileInfo = DllStructCreate($tagSHFILEINFO)
$dwFlags = BitOR($SHGFI_USEFILEATTRIBUTES, $SHGFI_SYSICONINDEX)
If Not ($bLargeIcons) Then
$dwFlags = BitOR($dwFlags, $SHGFI_SMALLICON)
EndIf
;~ '// Load the image list - use an arbitrary file extension for the
;~ '// call to SHGetFileInfo (we don't want to touch the disk, so use
;~ '// FILE_ATTRIBUTE_NORMAL && SHGFI_USEFILEATTRIBUTES).
$hIml = _WinAPI_SHGetFileInfo(".txt", $FILE_ATTRIBUTE_NORMAL, _
DllStructGetPtr($FileInfo), DllStructGetSize($FileInfo), $dwFlags)
Return $hIml
EndFunc ;==>_GUIImageList_GetSystemImageList
; Prog@ndy
Func _WinAPI_SHGetFileInfo($pszPath, $dwFileAttributes, $psfi, $cbFileInfo, $uFlags)
Local $return = DllCall("shell32.dll", "DWORD*", "SHGetFileInfo", "str", $pszPath, "DWORD", $dwFileAttributes, "ptr", $psfi, "UINT", $cbFileInfo, "UINT", $uFlags)
If @error Then Return SetError(@error, 0, 0)
Return $return[0]
EndFunc ;==>_WinAPI_SHGetFileInfo
; Prog@ndy
Func _GUIImageList_GetFileIconIndex($sFileSpec, $bLargeIcons = False, $bForceLoadFromDisk = False)
Local $dwFlags, $FileInfo = DllStructCreate($tagSHFILEINFO)
$dwFlags = $SHGFI_SYSICONINDEX
If $bLargeIcons Then
$dwFlags = BitOR($dwFlags, $SHGFI_LARGEICON)
Else
$dwFlags = BitOR($dwFlags, $SHGFI_SMALLICON)
EndIf
;~ ' We choose whether to access the disk or not. If you don't
;~ ' hit the disk, you may get the wrong icon if the icon is
;~ ' not cached. But the speed is very good!
If Not $bForceLoadFromDisk Then
$dwFlags = BitOR($dwFlags, $SHGFI_USEFILEATTRIBUTES)
EndIf
;~ ' sFileSpec can be any file. You can specify a
;~ ' file that does not exist and still get the
;~ ' icon, for example sFileSpec = "C:\PANTS.DOC"
Local $lR = _WinAPI_SHGetFileInfo( _
$sFileSpec, $FILE_ATTRIBUTE_NORMAL, DllStructGetPtr($FileInfo), DllStructGetSize($FileInfo), _
$dwFlags _
)
If ($lR = 0) Then
Return SetError(1, 0, -1)
Else
Return DllStructGetData($FileInfo, "iIcon")
EndIf
EndFunc ;==>_GUIImageList_GetFileIconIndex
; Author(s): Prog@ndy
Func __SHLV_FileDateString2Calc($filedate)
Return StringRegExpReplace($filedate, "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})", "$1/$2/$3 $4:$5:$6")
EndFunc ;==>__SHLV_FileDateString2Calc
; Author(s): Prog@ndy
Func __SHLV_CalcDate2FileDateString($calcdate)
Return StringRegExpReplace($calcdate, "(\d{4})/(\d{2})/(\d{2}) (\d{2})(IMG:http://www.autoitscript.com/forum/style_em…/autoit/sad.gif) \d{2})(IMG:http://www.autoitscript.com/forum/style_em…/autoit/sad.gif) \d{2})", "$1$2$3$4$5$6")
EndFunc ;==>__SHLV_CalcDate2FileDateString
; Prog@ndy
Func _SHLV_WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $hListView1 = $SHELLLISTVIEWHANDLE
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hListView1
;MsgBox(1, "", $iCode)
Switch $iCode
Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
Local $ItemText = _GUICtrlListView_GetItemText($hListView1, _GUICtrlListView_GetSelectedIndices($hListView1), 0)
_Browse($ItemText)
Case $LVN_KEYDOWN
Local $tagLVKEYDOWN = $tagNMHDR & "; USHORT wVKey; UINT flags;"
$tNMHDR = DllStructCreate($tagLVKEYDOWN, $ilParam)
;MsgBox(1, "", DllStructGetData($tNMHDR, "wVKey"))
Switch DllStructGetData($tNMHDR, "wVKey")
Case 0x27; rechte Pfeiltaste
Local $ItemText = _GUICtrlListView_GetItemText($hListView1, _GUICtrlListView_GetSelectedIndices($hListView1), 0)
_Browse($ItemText)
Case 0x25 ;linke Pfeiltaste
_Browseback()
EndSwitch
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>_SHLV_WM_NOTIFY
Func _Browseback()
If $DIRECTORY_LOCAL = $path & "\" then $DIRECTORY_LOCAL = ""
Local $slash = StringInStr($DIRECTORY_LOCAL, "\", 1, -2)
If $slash Then
$DIRECTORY_LOCAL = StringLeft($DIRECTORY_LOCAL, $slash)
;ElseIf StringRegExp($DIRECTORY_LOCAL, "\A[A-Za-z]:\\\Z") Then
; MsgBox(1, "", StringRegExp($DIRECTORY_LOCAL, "\A[A-Za-z]:\\\Z"))
; $DIRECTORY_LOCAL = ""
EndIf
_SHLV_PopulateLocalListView($ListView1, $DIRECTORY_LOCAL)
;No return value
EndFunc ;==>_Browseback
[/autoit] [autoit][/autoit] [autoit]Func _Browse($data)
If StringInStr(FileGetAttrib($DIRECTORY_LOCAL & $data), "D") Then
$DIRECTORY_LOCAL &= $data
_SHLV_PopulateLocalListView($ListView1, $DIRECTORY_LOCAL)
ElseIf StringRegExp($data, "\A[A-Za-z]:\\\Z") Then
$DIRECTORY_LOCAL = $data
_SHLV_PopulateLocalListView($ListView1, $DIRECTORY_LOCAL)
ElseIf $data = "< .. >" Then
#cs
Local $slash = StringInStr($DIRECTORY_LOCAL, "\", 1, -2)
If $slash Then
$DIRECTORY_LOCAL = StringLeft($DIRECTORY_LOCAL, $slash)
ElseIf StringRegExp($DIRECTORY_LOCAL, "\A[A-Za-z]:\\\Z") Then
$DIRECTORY_LOCAL = ""
EndIf
_SHLV_PopulateLocalListView($ListView1, $DIRECTORY_LOCAL)
#ce
Else
If MsgBox(36, "ShellListView", "Soll diese Datei geöffnet werden? " & @CRLF & $DIRECTORY_LOCAL & $data) = 6 Then
ShellExecute($DIRECTORY_LOCAL & $data, "", $DIRECTORY_LOCAL)
EndIf
EndIf
EndFunc ;==>_Browse
; Author ........: SolidSnake <MetalGX91 at GMail dot com>
; Modified by Prog@ndy
Func _SHLV__FileListToArray2($sPath, $sFilter = "*", $iFlag = 0)
Local $hSearch, $sFile, $asFileList
If Not FileExists($sPath) Then Return SetError(1, 1, "")
If (StringInStr($sFilter, "\")) Or (StringInStr($sFilter, "/")) Or (StringInStr($sFilter, ":")) Or (StringInStr($sFilter, ">")) Or (StringInStr($sFilter, "<")) Or (StringInStr($sFilter, "|")) Or (StringStripWS($sFilter,
= "") Then Return SetError(2, 2, "")
If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
If (StringMid($sPath, StringLen($sPath), 1) = "\") Then $sPath = StringTrimRight($sPath, 1) ; needed for Win98 for x:\ root dir
$hSearch = FileFindFirstFile($sPath & "\" & $sFilter)
If $hSearch = -1 Then Return SetError(4, 4, "")
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then
SetError(0)
ExitLoop
EndIf
If $iFlag = 1 And StringInStr(FileGetAttrib($sPath & "\" & $sFile), "D") <> 0 Then ContinueLoop
If $iFlag = 2 And StringInStr(FileGetAttrib($sPath & "\" & $sFile), "D") = 0 Then ContinueLoop
$asFileList &= $sFile & @CR
WEnd
FileClose($hSearch)
If Not $asFileList Then
Dim $asFileList[1] = [0]
Return SetError(1, 0, $asFileList)
EndIf
Return StringSplit(StringTrimRight($asFileList, 1), @CR)
EndFunc ;==>_SHLV__FileListToArray2
Nun zum Problem: Das Listview reagiert nicht auf die Enter Taste
Jede andere Taste scheint zu funktionieren
Zeile 188 bis 205 sind die enstprechenden Zeilen, $NM_Return funktioniert im Listview auch nicht.
Kann man diese Einschränkung irgendwie austricksen? Hotkeyset möchte ich ungern verwenden.
Gruß nuts
edit \
Theoretisch müsste es doch gehen.
http://msdn.microsoft.com/en-us/library/bb774879(VS.85).aspx
Und was klappt genau nicht? Dein Ansatz?
Func _GUICtrlListView_GetCheckedItemsTextArray($hListView)
Local $aCheckedItems = _GUICtrlListView_GetCheckedIndices($hListView)
Local $iCheckedCount = UBound($aCheckedItems)
If $iCheckedCount = 0 Then Return SetError(1, 0, 0)
Local $iColCount = _GUICtrlListView_GetColumnCount($hListView)
Local $aCheckedItemsText[$iCheckedCount][$iColCount], $aTemp
For $i = 0 To $iCheckedCount - 1
$aTemp = _GUICtrlListView_GetItemTextArray($hListView, $aCheckedItems[$i])
For $j = 1 To $aTemp[0]
$aCheckedItemsText[$i][$j-1] = $aTemp[$j]
Next
Next
Return $aCheckedItemsText
EndFunc ;==>_GUICtrlListView_GetCheckedItemTextArray
Func _GUICtrlListView_GetCheckedIndices($hListView)
Local $iCount = _GUICtrlListView_GetItemCount($hListView)
Local $iCheckedCount = _GUICtrlListView_GetCheckedCount($hListView)
If $iCheckedCount = 0 Then Return SetError(1, 0, 0)
Local $aCheckedItems[$iCheckedCount]
$iCheckedCount = 0
For $i = 0 To $iCount - 1
If _GUICtrlListView_GetItemChecked($hListView, $i) Then
$aCheckedItems[$iCheckedCount] = $i
$iCheckedCount += 1
EndIf
Next
Return $aCheckedItems
EndFunc ;==>_GUICtrlListView_GetCheckedIndices
Func _GUICtrlListView_GetCheckedCount($hListView)
Local $iCount = _GUICtrlListView_GetItemCount($hListView), $iCheckedCount = 0
If $iCount = 0 Then Return SetError(1, 0, 0)
For $i = 0 To $iCount - 1
$iCheckedCount += _GUICtrlListView_GetItemChecked($hListView, $i)
Next
Return $iCheckedCount
EndFunc ;==>_GUICtrlListView_GetCheckedCount
Func _SetAllcheckedItems() ;Status bei angehakten Items ändern
local $aCheckedItemsText = _GUICtrlListView_GetCheckedItemsTextArray($hListView)
local $iCheckedCount = _GUICtrlListView_GetCheckedCount($hListView)
local $aCheckedIndices = _GUICtrlListView_GetCheckedIndices($hListView)
If $iCheckedCount = 0 Then Return SetError(1, 0, 0)
For $i = 0 to $iCheckedCount -1
if $aCheckedItemsText[$i][3] = $done then ;Beispiel aus meinem Skript
_GUICtrlListView_SetItemText($hLVHandle,$aCheckedIndices[$i], $todo, 3)
ElseIf $aCheckedItemsText[$i][3] = $todo then ;Beispiel aus meinem Skript
_GUICtrlListView_SetItemText($hLVHandle,$aCheckedIndices[$i], $done, 3)
Endif
Next
EndFunc
Func _DeleteAllcheckedItems() ;alle angehakte Items löschen
local $iCheckedCount = _GUICtrlListView_GetCheckedCount($hListView)
local $aCheckedIndices = _GUICtrlListView_GetCheckedIndices($hListView)
If $iCheckedCount = 0 Then Return SetError(1, 0, 0)
for $i = $iCheckedCount - 1 To 0 Step -1
_GUICtrlListView_DeleteItem($hLVHandle, $aCheckedIndices[$i])
next
EndFunc
Func Checktoggle() ; Check / Uncheck all
local $checked = _GUICtrlListView_GetCheckedCount($hListView)
local $all = _GUICtrlListView_GetItemCount($hListView)
if $checked = $all then
_GUICtrlListView_SetItemChecked($hListView, -1, False)
else
_GUICtrlListView_SetItemChecked($hListView, -1, True)
endif
Endfunc
Hier mal eine Funktionssammlung (ich meine Oscar hat die mal gepostet) für angehakte Items und 3 Beispiele was man damit machen kann.
Hehe das ist natürlich nur ein beispiel.
Möglicherweise startet sich das Plugin selbstständig?
Run (...) startet ein Programm auf jeden Fall nicht grundlos zweimal und dein Skript endet ja auch nach der "Run-Zeile".
Einfach über den Windows-Autostart ausführen.
Und dann einfach mal bissle ausprobieren, davor habe ich Fileinstall auch nicht verstanden. ![]()
Gui erstellen, Bild einfügen, Fileinstall mit dem Bild usw.
Am "Run Befehl" liegt das nicht, möglicherweise ist die Fernbedienung etwas sensibel und führt bei einem langen Tastendruck die Befehle doppelt aus?
Die Funktion _Singleton verhindert das doppelte Starten deines Skripts, vielleicht hilft auch etwas Feintunig der Fernbedienung?
Alle Instanzen des Plugins kannst du so abschießen:
[autoit]
for $i = 1 to 3
run("notepad.exe","", @SW_MAXIMIZE)
next
Sleep(2000) ;nur zum verdeutlichen
while ProcessExists("notepad.exe")
ProcessClose("notepad.exe")
wend
Falls es dringend sein sollte:
[autoit]
$string = "20.11.2009 09:12:34"
$asearch = Stringsplit($string, " ")
$asplit = stringsplit($asearch[1], ".")
$return = $asplit[3] & "/" & $asplit[2] & "/" & $asplit[1] & " " & $asearch[2]
MsgBox(1, "",$return)
[/autoit]Das ist aber noch ziemlich optimierungsfähig. Bin leider nicht so fit in den Regexp Pattern ![]()
Gute Frage, beim Speicherwert abfragen wäre das ja im Prinzip das gleiche wie $array[0] abfragen.
Somit wäre es in der Tat unnötig $array[0] zum zählen zu verwenden. Eher sogar ein Nachteil, wenn man sich beispielsweise die Funktion _FileListToArray ansieht.
Naja viel wird sichs eh nicht nehmen und irgendwie ist mir das zu schwere Kost für den schönen Freitagabend. ![]()
Weil dann das Array nicht jedes mal durchgezählt werden muss? Wäre jetzt meine Erklärung, könnte sich bei großen Array's minimal bemerkbar machen (?).
Mhm um die Differenz- / Schnittmenge zu bestimmen habe ich dir (subzero007) doch schon vor Tagen ein Beispiel (was nicht unaufwendig war) mit der UDF von Bugfix geschrieben.
Wieso sind wir jetzt wieder bei der 0815 Lösung? ![]()