Bei Split ist ja die 0 der Counter.
Nicht mehr zwingend. Mit Flag 2 wird ein Nullbasiertes Array erstellt. ![]()
Bei Split ist ja die 0 der Counter.
Nicht mehr zwingend. Mit Flag 2 wird ein Nullbasiertes Array erstellt. ![]()
zu 1.
Da kannst du mit WM_MESSAGES arbeiten. Die WM_CODES findest du in der Hilfe. In einigen Bsp. siehst du auch die Art der Anwendung (GUIRegisterMessage).
zu 2.
Den AutoIt-Debugger hane ich bisher noch nie erfolgreich nutzen können. Aus meiner Sicht etwas buggy.
Find halt nur blöd wenn Leute deswegen verärgert sind, aber es keine Regel dafür gibt.
Also wenn deswegen jemand verärgert ist, dann ist derjenige sicher nicht lange im Forum dabei. Sonst wüßte er, zumindest vom Mitlesen, dass hier sehr zügig reagiert wird.
Ich denke nicht, dass wir da etwas ändern müssen.
Wirf mal einen Blick in die ListView-UDF in der Hilfe. Da findest du ausreichend Bsp.
Grundsätzlich: Ein angeklicktes Item ist "selected" - die Funktion, die das feststellt gibt den Index des Item zurück. Mit diesem kannst du den Text des Item (SubItem) zurückgeben lassen.
das z.b. wenn man über einen button fährt und dort drauf bleibt ohne zu klicken das dann n tooltip kommt...
Dazu brauchst du doch nicht MOUSEHOVER. Verwende einfach: GUICtrlSetTip ( controlID, tiptext [, "title" [, icon [, options]]]]] )
Hi,
ja mit einem Array kannst du kürzen. Erstelle alle Button-ID's in einem Array.
In der While-Schleife verwendest du dann eine Schleife durch das Array um auf die Button-ID's zu prüfen.
; Die ID's der Button in einem Array erstellen
Global $aButton[17] = [ _
GUICtrlCreateButton("1", 16, 48, 25, 25, 0), _
GUICtrlCreateButton("2", 48, 48, 25, 25, 0), _
GUICtrlCreateButton("3", 80, 48, 25, 25, 0), _
GUICtrlCreateButton("4", 16, 80, 25, 25, 0), _
GUICtrlCreateButton("5", 48, 80, 25, 25, 0), _
GUICtrlCreateButton("6", 80, 80, 25, 25, 0), _
GUICtrlCreateButton("7", 16, 112, 25, 25, 0), _
GUICtrlCreateButton("8", 48, 112, 25, 25, 0), _
GUICtrlCreateButton("9", 80, 112, 25, 25, 0), _
GUICtrlCreateButton("0", 48, 144, 25, 25, 0), _
GUICtrlCreateButton(".", 16, 144, 25, 25, 0), _
GUICtrlCreateButton("+", 120, 48, 41, 25, 0), _
GUICtrlCreateButton("-", 120, 80, 41, 25, 0), _
GUICtrlCreateButton("*", 120, 112, 41, 25, 0), _
GUICtrlCreateButton("/", 120, 144, 41, 25, 0), _
GUICtrlCreateButton("=", 80, 144, 25, 25, 0), _
GUICtrlCreateButton("Clear", 128, 16, 33, 20)]
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $aButton[15]
GUICtrlSetData ($Input6, Execute (GUICtrlRead ($Input6)))
Case $aButton[16]
GUICtrlSetData ($Input6, "")
EndSwitch
; in einer Schleife prüfen, welches Arrayelement mit $nMsg übereinstimmt
For $i = 0 To UBound($aButton) -3 ; die letzten beiden brauchen nicht abgefragt werden
If $nMsg = $aButton[$i] Then
ControlCommand ($Form1_1, "", $Input6, "EditPaste", ControlGetText($Form1_1, "", $aButton[$i]))
ExitLoop
EndIf
Next
WEnd
aber dennoch sollen die nachrichten im hintergrund (dem chat) abgerufen werden können!
mit controlsettext geht es wohl noch ... aber controlsend wird so wohl niemals gehen ?! gibts da ne alternative ???
??? - Das widerspricht sich aber. Was möchtest du wirklich?
- Neu eingehenden Nachrichten im Hintergrund auslesen, oder
- in das Chatfenster automatisch schreiben (Spamverdächtig)
Ersteres ist eigentlich unnütz, da die Messenger ja eine entsprechende Funktion zur automatischen Benachrichtigung besitzen.
Und das Zweite gibt auch keinen rechten Sinn - es sei denn ich möchte spammen. ![]()
Was ist Expand?
= Ausklappen
Bsp.:
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Opt("MustDeclareVars", 1)
Opt("GuiOnEventMode", 1)
Global $gui, $hImage, $hTV, $aID_Sub[5], $ID_Table, $item
[/autoit] [autoit][/autoit] [autoit]$gui = GUICreate('Test TreeView')
GUISetOnEvent($GUI_EVENT_CLOSE, '_end')
$hTV = GUICtrlCreateTreeView(10,10,300,150,BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, _
$TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$hImage = _GUIImageList_Create(16, 16, 5, 3)
_GUIImageList_AddIcon($hImage, "shell32.dll", 98)
_GUIImageList_AddIcon($hImage, "shell32.dll", 96)
_GUIImageList_AddIcon($hImage, "shell32.dll", 36)
_GUICtrlTreeView_SetNormalImageList($hTV, $hImage)
_GUICtrlTreeView_BeginUpdate($hTV)
$ID_Table = _GUICtrlTreeView_Add($hTV, 0, 'Table', 0, 0)
For $i = 1 To 5
$aID_Sub[$i-1] = _GUICtrlTreeView_AddChild($hTV, $ID_Table, 'Sub' & $i, 1, 1)
For $j = 1 To 3
$item = _GUICtrlTreeView_AddChild($hTV, $aID_Sub[$i-1], 'Sub_Sub' & $j, 2, 2)
Next
Next
_GUICtrlTreeView_EndUpdate($hTV)
_GUICtrlTreeView_Expand($hTV, $ID_Table)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
While 1
Sleep(100)
WEnd
Func _end()
Exit
EndFunc
Func _GetExpanded()
Local $sExpanded = 'Ausgeklappt: '
For $i = 0 To UBound($aID_Sub) -1
If _GUICtrlTreeView_GetExpanded(GUICtrlGetHandle($hTV), $aID_Sub[$i]) Then _
$sExpanded &= _GUICtrlTreeView_GetText(GUICtrlGetHandle($hTV), $aID_Sub[$i]) & ', '
Next
WinSetTitle($gui, '', StringTrimRight($sExpanded, 2))
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
$hWndTreeview = $hTV
If Not IsHWnd($hTV) Then $hWndTreeview = GUICtrlGetHandle($hTV)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeview
Switch $iCode
Case $TVN_ITEMEXPANDEDW
_GetExpanded()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Ich brauche ein beispiel um nähre rein zu kommnenn.
kannst du mir da eins posten
Das ist anmaßend frech, was du hier abziehst! Du hast nicht einen Blick in die Hilfe geworfen - denn dort sind Beispiele vorhanden!!
Du bist auf dem besten Weg, dir die nächste Warnung einzufangen.
Verwende das Event $TVN_ITEMEXPANDEDW - dann erhältst du eine Nachricht wenn ein Expand ausgeführt wird.
Hier ein Bsp. - die gelesenen Werte werden als Fenstertitel gesetzt:
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Opt("MustDeclareVars", 1)
Opt("GuiOnEventMode", 1)
Global $gui, $hImage, $hTV, $aID_Sub[5], $ID_Table, $item
[/autoit] [autoit][/autoit] [autoit]$gui = GUICreate('Test TreeView')
GUISetOnEvent($GUI_EVENT_CLOSE, '_end')
$hTV = GUICtrlCreateTreeView(10,10,300,150,BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, _
$TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
Global $WM_NOTIFY_DUMMY = GUICtrlCreateDummy()
GUICtrlSetOnEvent($WM_NOTIFY_DUMMY,"click_TV")
$hImage = _GUIImageList_Create(16, 16, 5, 3)
_GUIImageList_AddIcon($hImage, "shell32.dll", 98)
_GUIImageList_AddIcon($hImage, "shell32.dll", 96)
_GUIImageList_AddIcon($hImage, "shell32.dll", 36)
_GUICtrlTreeView_SetNormalImageList($hTV, $hImage)
_GUICtrlTreeView_BeginUpdate($hTV)
$ID_Table = _GUICtrlTreeView_Add($hTV, 0, 'Table', 0, 0)
For $i = 1 To 5
$aID_Sub[$i-1] = _GUICtrlTreeView_AddChild($hTV, $ID_Table, 'Sub' & $i, 1, 1)
For $j = 1 To 3
$item = _GUICtrlTreeView_AddChild($hTV, $aID_Sub[$i-1], 'Sub_Sub' & $j, 2, 2)
Next
Next
_GUICtrlTreeView_EndUpdate($hTV)
_GUICtrlTreeView_Expand($hTV, $ID_Table)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
While 1
Sleep(100)
WEnd
Func _end()
Exit
EndFunc
Func click_TV()
Local $hTVItem = _GUICtrlTreeView_GetSelection($hTV)
Local $hParent = _GUICtrlTreeView_GetParentHandle($hTV, $hTVItem)
Local $title = ''
If $hParent Then $title = _GUICtrlTreeView_GetText($hTV,$hParent) & ' / '
WinSetTitle($gui, '', $title & _GUICtrlTreeView_GetText($hTV,$hTVItem))
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
$hWndTreeview = $hTV
If Not IsHWnd($hTV) Then $hWndTreeview = GUICtrlGetHandle($hTV)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeview
Switch $iCode
Case $NM_CLICK
GUICtrlSendToDummy($WM_NOTIFY_DUMMY)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
OK, Danke - dann brauch ich mir ja nicht weiter den Kopf zerbrechen ![]()
Ich wollte auf Objekte verzichten, und da es die Funktion CopyFileEx nunmal gibt, versuchen diese zu nutzen.
Aber da haperts noch etwas mit dem Umsetzen der Strukturen.
Hier der jetzige Status, jetzt wird nicht mal mehr kopiert . ![]()
Global Const $PROGRESS_CANCEL = 1
Global Const $PROGRESS_CONTINUE = 0
Global Const $PROGRESS_QUIET = 3
Global Const $PROGRESS_STOP = 2
Global Const $COPY_FILE_FAIL_IF_EXISTS = 0x1
Global Const $COPY_FILE_RESTARTABLE = 0x2
$sOldFile = 'C:\sehr_grosse_Datei'
$sNewFile ='C:\kopie_sehr_grosse_Datei'
Global $strucData = DllStructCreate("long")
Global $tagLPPROGRESS_ROUTINE = _
'int TotalFileSize;int TotalBytesTransferred;int StreamSize;int StreamBytesTransferred;' & _
'dword dwStreamNumber;dword dwCallbackReason;hwnd hSourceFile;hwnd hDestinationFile;' & DllStructGetPtr($strucData)
Global $strucPROGRESS_ROUTINE = DllStructCreate($tagLPPROGRESS_ROUTINE)
Local $ProgressRoutine = _
DLLCallbackRegister ("CopyProgressRoutine", $tagLPPROGRESS_ROUTINE, _
"int;int;int;int;dword;dword;hwnd;hwnd;ptr")
$Ret = CopyFileEx($sOldFile, $sNewFile, DllCallbackGetPtr($ProgressRoutine), 0, 0, $COPY_FILE_RESTARTABLE)
If $Ret Then
MsgBox(0, 'CopyFileEx', 'Erfolgreich')
Else
MsgBox(0, 'CopyFileEx', 'Fehler!')
EndIf
DllCallbackFree($ProgressRoutine)
Func CopyFileEx($sOldFile, $sNewFile, $lpProgressRoutine, $lpData, $pbCancel, $dwCopyFlags)
Local $ret = DllCall("kernel32.dll", "long", "CopyFileExA", _
'str', $sOldFile, 'str', $sNewFile, 'ptr', $lpProgressRoutine, 'long', $lpData, 'long', $pbCancel, 'long', $dwCopyFlags)
Return $ret[0]
EndFunc
Func CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
ConsoleWrite(Int(($TotalBytesTransferred * 10000) / ($TotalFileSize * 10000) * 100) & "% complete..." & @CRLF)
Return $PROGRESS_CONTINUE
EndFunc
Hi,
ich möchte gern die WIN-API Funktion CopyFileEx in AutoIt umsetzen. Im API-Guide habe ich eine VB-Version gefunden.
Hier kurz die Beschreibung:
ZitatThe CopyFileEx function copies an existing file to a new file. This function preserves extended attributes, OLE structured storage, NTFS alternate data streams, and file attributes. Security attributes for the existing file are not copied to the new file.
Declare Function CopyFileEx Lib "kernel32.dll" Alias "CopyFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As Long, lpData As Any, ByRef pbCancel As Long, ByVal dwCopyFlags As Long) As Long
Besonders interessant ist der Parameter:
· lpProgressRoutine
Specifies the address of a callback function of type LPPROGRESS_ROUTINE that is called each time another portion of the file has been copied. This parameter can be NULL. For more information on the progress callback function, see CopyProgressRoutine.
Die Callbackfunktion wird aufgerufen, jederzeit wenn ein Teil der Datei kopiert wurde. Somit ließe sich das gut für ein Status-Anzeige nutzen.
Leider passiert das bei mir bisher noch nicht. Die Datei wird zwar kopiert, aber die Callbackfunktion nicht aufgerufen. Der Pointer auf die Callbackroutine wird erstellt, hab ich getestet. Momentan weiß ich erst mal nicht weiter. Der Dll-Call gibt mir auch nix zurück, AutoIt endet dort mit: AutoIT3.exe ended.rc:-1073741819
Hier der Code:
Global Const $PROGRESS_CANCEL = 1
Global Const $PROGRESS_CONTINUE = 0
Global Const $PROGRESS_QUIET = 3
Global Const $PROGRESS_STOP = 2
Global Const $COPY_FILE_FAIL_IF_EXISTS = 0x1
Global Const $COPY_FILE_RESTARTABLE = 0x2
$sOldFile = 'C:\sehr_grosse_Datei'
$sNewFile = 'C:\kopie_sehr_grosse_Datei'
Local $ProgressRoutine = DLLCallbackRegister ("CopyProgressRoutine", "long", "str;str")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$Ret = CopyFileEx($sOldFile, $sNewFile, DllCallbackGetPtr($ProgressRoutine), 0, 0, $COPY_FILE_RESTARTABLE)
If $Ret Then
MsgBox(0, 'CopyFileEx', 'Erfolgreich')
Else
MsgBox(0, 'CopyFileEx', 'Fehler!')
EndIf
DllCallbackFree($ProgressRoutine)
Func CopyFileEx($sOldFile, $sNewFile, $lpProgressRoutine, $lpData, $pbCancel, $dwCopyFlags)
Local $ret = DllCall("kernel32.dll", "long", "CopyFileExA", _
'str', $sOldFile, 'str', $sNewFile, 'ptr', $lpProgressRoutine, 'long', $lpData, 'long', $pbCancel, 'long', $dwCopyFlags)
Return $ret[0]
EndFunc
Func CopyProgressRoutine($sOldFile, $sNewFile)
ConsoleWrite($sNewFile & ': ' & Floor(FileGetSize($sNewFile)/FileGetSize($sOldFile)*100) & '%' & @CRLF)
Return $PROGRESS_CONTINUE
EndFunc
Edit:
Hab was überlesen
, die Callbackfunktion muß die Struktur LPPROGRESS_ROUTINE aufweisen. Naja, dann werd ich mal versuchen das noch zu vervollständigen. Wenn es klappt melde ich mich wieder. ![]()
Könnte es sein, dass du folgendes meinst:
"Die Funktion HotStringSet soll so angepaßt werden, dass sie einen Hotkey generiert, der ausschließlich für den übergebenen Fenster-Titel gültig ist."
Wäre echt toll, wenn die deutsche Sprache benutzt wird. Sie ist sehr vielfältig und erlaubt es Probleme so zu beschreiben, dass auch andere diese verstehen. ![]()
Wende dich doch mal an den Ersteller der UDF. Aber ich verstehe auch nicht, was du willst. Rechtschreib- und Grammatikhilfe einsetzen könnte schon etwas Licht in das Dunkel bringen. ![]()
Also ich würde dir gern helfen, aber ehrlich gesagt habe ich nicht ansatzweise verstanden, was du möchtest.
Du sprichst von ID's - woher stammen diese bzw. was sollen sie darstellen?
Vielleicht kannst du das mal als Pseudocode darstellen? (Also der Programmablauf in Stichworten)
So, habe jetzt mal die Schweizer Tastatur bei mir geladen und daran nochmal alles überprüft.
C0 ergibt bei mir aber nicht " sondern _.
soltle so aussehen:
C0 Ö ¨
Da ich selbst keine CH-Tastatur habe, habe ich die Zuordnung anhand einer Abbildung gemacht. Kann natürlich sein, dass diese nicht korrekt ist.
Stimmen die anderen Zeichen alle? - Wenn nicht, ergänze mal bitte, dann kann ich die Übersicht anpassen.
Ich persönlich halte gar nichts von AntiViren-Programmen. Ich verwende ausschließlich Spybot S&D. Sollte sich wirklich mal ein Schadprogramm auf meinen PC verirren (sehr unwahrscheinlich), wird es im Moment, wenn es sich einnisten will von S&D erkannt und ich werde alarmiert.