Zitat
edit: irgendwie wird das in zwei zeilen angezeigt ...
Hängt höchstwahrscheinlich mit deinem Browser zusammen... Mit Firefox und IE gibts keine Probleme.
Zitat
edit: irgendwie wird das in zwei zeilen angezeigt ...
Hängt höchstwahrscheinlich mit deinem Browser zusammen... Mit Firefox und IE gibts keine Probleme.
Mit dependencywalker kannst du die Funktionen einer DLL auflisten, aber ob du so herausfindest wie die DLLCalls dafür in AutoIt aussehen müssen... ![]()
Ich hab mal ein Beispiel geschrieben...
#include <File.au3>
#include <Array.au3>
$sPath = @ScriptDir & "\Test"
$aFiles = _FileListToArray($sPath, "*", 1)
$i = 1
While $i <= $aFiles[0]
$aResult = StringRegExp($aFiles[$i], "(.*?)\d", 1)
If Not @error Then
DirCreate($sPath & "\" & $aResult[0])
FileMove($sPath & "\" & $aFiles[$i], $sPath & "\" & $aResult[0])
_ArrayDelete($aFiles, $i)
$aFiles[0] -= 1
$j = 1
While $j <= $aFiles[0]
If StringInStr($aFiles[$j], $aResult[0]) Then
FileMove($sPath & "\" & $aFiles[$j], $sPath & "\" & $aResult[0])
_ArrayDelete($aFiles, $j)
$aFiles[0] -= 1
EndIf
$j += 1
WEnd
EndIf
$i += 1
WEnd
Das Script packt alle Dateien, die bis zur ersten Ziffer im Dateinamen übereinstimmen in jeweils einen Ordner.
Im Grunde brauchst du nur die Befehle:
[autoit]_FileListToArray ;Dateien in Array einlesen
DirCreate ;Ordner für Dateien erstellen
FileMove ;Dateien in Ordner verschieben
StringInStr ;Dateinamen nach Wort durchsuchen
Also einfach die Dateien in ein Array einlesen und danach in einer For Schleife nach und nach die Dateinamen überprüfen und die Dateien ggf. in den erstellten Ordner verschieben.
Vielleicht mit Befehlen wie
[autoit]Binary
;oder
Chr
Aber alle 20.000 Einträge in deinem Array so umzuwandeln würde möglicherweise auch einige Zeit in Anspruch nehmen... ![]()
Send simuliert auch nur Tastatureingaben, und HotKeySet kann ja nicht wissen ob sie von dir oder einem Send Befehl stammen. Also wird, sobald ein Leerzeichen in dem String der Send Funktion steht, die Funktion erneut aufgerufen und das ganze geht dann wieder von vorne los, was in der Endlosschleife resultiert. ![]()
Vielleicht hat ja auch die Fehlermeldung recht, und der Flashplayer ist auf dem System nicht installiert. ![]()
Dann mach es nicht mit If Bedingungen
. Du kannst ja Arrays verwenden wie in meinem Beispiel, oder eine Kombination aus autoBert's Script und Arrays...
Wieso hast du diese 2 Zeilen auskommentiert? Die sorgen doch dafür, dass nur einmal die Funktion aufgerufen wird.
HotKeySet ("{SPACE}", "_Test")
[/autoit][autoit][/autoit][autoit]While (1)
Sleep(1000)
WEnd
Func _Test()
HotKeySet ("{SPACE}")
Send("Hi, was geht?")
HotKeySet ("{SPACE}", "_Test")
EndFunc
Solche Befehle vergisst man halt, wenn man so lange nichts mehr in dieser Richtung gescriptet hat :pinch: .
So.
[autoit]MouseDown("left")
MouseMove(200, 200)
MouseUp("left")
Wozu brauchst du das denn? Es gibt normalerweise nämlich immer eine bessere Alternative zu Send... Möchtest du die Eingabe an ein Control in einem Fenster senden?
Jedesmal wenn per Send die Leertaste gedrückt wird, wird auch die FUnktion erneut aufgerufen, daher die Endlosschleife ;). So kannst du das Problem umgehen.
HotKeySet ("{SPACE}", "_Test")
[/autoit] [autoit][/autoit] [autoit]While Sleep(100)
WEnd
Func _Test()
HotKeySet ("{SPACE}")
Send("Hi, was geht?")
HotKeySet ("{SPACE}", "_Test")
EndFunc
Am besten schaust du dir die "wichtigenLinks" hier am linken Rand an und vielleicht auch noch ein paar Scripts die einfache GUI's verwenden. ![]()
Das geht z.B. so:
#include <GUIConstants.au3>
#include <GUIComboBox.au3>
Global $aCombo[11][2]
$aCombo[0][0] = 10
For $i = 1 To $aCombo[0][0]
$aCombo[$i][0] = Chr($i + 64)
$aCombo[$i][1] = $aCombo[$i][0] & 1 & "|" & $aCombo[$i][0] & 2 & "|" & $aCombo[$i][0] & 3
Next
$hWnd = GUICreate("Test", 200, 55)
$cCombo1 = GUICtrlCreateCombo("", 5, 5, 190, 25)
$cCombo2 = GUICtrlCreateCombo("", 5, 30, 190, 25)
GUISetState()
_GUICtrlComboBox_BeginUpdate($cCombo1)
For $i = 1 To $aCombo[0][0]
_GUICtrlComboBox_AddString($cCombo1, $aCombo[$i][0])
Next
_GUICtrlComboBox_EndUpdate($cCombo1)
$iLastSel = -1
[/autoit] [autoit][/autoit] [autoit]While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
$iCurSel = _GUICtrlComboBox_GetCurSel($cCombo1)
If $iCurSel <> $iLastSel Then
GUICtrlSetData($cCombo2, "")
GUICtrlSetData($cCombo2, $aCombo[$iCurSel + 1][1])
$iLastSel = $iCurSel
EndIf
WEnd
Nein, so kannst du nur den Inhalt von einem Array in eine andere Variable übertragen ($aTest1 = $aTest2).
Klar geht GraphicsClear ;). Und mit GraphicsMeasureString kannst du die Stringbreite messen und diesen von der Fensterbreite subtrahieren um die X Koordinate zu erhalten.
#include <GDIPlus.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Misc.au3>
#include <Constants.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]HotKeySet("{ESC}", "_Exit")
[/autoit] [autoit][/autoit] [autoit]$iGUIWidth = 200
$iGUIHeight = 50
$hWnd = GUICreate("Test", $iGUIHeight, 50, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW))
GUISetState()
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
$hPen = _GDIPlus_PenCreate(0xFF000000, 2)
[/autoit] [autoit][/autoit] [autoit]$hDC = _WinAPI_GetDC($hWnd)
$hCDC = _WinAPI_CreateCompatibleDC($hDC)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", $iGUIWidth)
DllStructSetData($tSize, "Y", $iGUIHeight)
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", 255)
DllStructSetData($tBlend, "Format", 1)
$tPoint = DllStructCreate($tagPOINT)
$pPoint = DllStructGetPtr($tPoint)
DllStructSetData($tPoint, "X", 0)
DllStructSetData($tPoint, "Y", 0)
$hBrush = _GDIPlus_BrushCreateSolid(0xFFFBF3FE)
$hFormat = _GDIPlus_StringFormatCreate()
$hFamily = _GDIPlus_FontFamilyCreate("Arial")
$hFont = _GDIPlus_FontCreate($hFamily, 12)
$tLayout = _GDIPlus_RectFCreate()
$i = 1
[/autoit] [autoit][/autoit] [autoit]While Sleep(1000)
_GDIPlus_GraphicsClear($hBuffer, 0x00000000)
$aMeasure = _GDIPlus_GraphicsMeasureString($hBuffer, $i, $hFont, $tLayout, $hFormat)
DllStructSetData($aMeasure[0], "X", $iGUIWidth - DllStructGetData($aMeasure[0], "Width"))
_GDIPlus_GraphicsDrawStringEx($hBuffer, $i, $hFont, $aMeasure[0], $hFormat, $hBrush)
$hBitmapTmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
[/autoit] [autoit][/autoit] [autoit]_WinAPI_SelectObject($hCDC, $hBitmapTmp)
_WinAPI_UpdateLayeredWindow($hWnd, $hDC, 0, $pSize, $hCDC, $pSource, 0, $pBlend, 2)
_WinAPI_DeleteObject($hBitmapTmp)
$i += 1
WEnd
Func _Exit()
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_FontDispose($hFont)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_PenDispose($hPen)
_GDIPlus_Shutdown()
_WinAPI_ReleaseDC($hWnd, $hDC)
_WinAPI_DeleteDC($hCDC)
Exit
EndFunc
Du hast vergessen den Brush etc. wieder aus dem Speicher zu entfernen (BrushDispose)...
Hier mal ein Beispiel:
#include <GDIPlus.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Misc.au3>
#include <Constants.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]HotKeySet("{ESC}", "_Exit")
[/autoit] [autoit][/autoit] [autoit]$vU32DLL = DllOpen("User32.dll")
[/autoit] [autoit][/autoit] [autoit]$iGUIColorBG = 0xFFFFFFFF
$iGUIWidth = @DesktopWidth
$iGUIHeight = @DesktopHeight
$hWnd = GUICreate("Test", $iGUIWidth, $iGUIHeight, 0, 0, BitOR(0x80000000, 0x08000000), BitOR(0x00080000, 0x00000008, 0x00000080))
GUISetState()
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
$hPen = _GDIPlus_PenCreate(0xFF000000, 2)
[/autoit] [autoit][/autoit] [autoit]$hDC = _WinAPI_GetDC($hWnd)
$hCDC = _WinAPI_CreateCompatibleDC($hDC)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", $iGUIWidth)
DllStructSetData($tSize, "Y", $iGUIHeight)
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", 255)
DllStructSetData($tBlend, "Format", 1)
$tPoint = DllStructCreate($tagPOINT)
$pPoint = DllStructGetPtr($tPoint)
DllStructSetData($tPoint, "X", 0)
DllStructSetData($tPoint, "Y", 0)
GUIRegisterMsg($WM_PAINT, "_ReDraw")
$aMousePosOld = MouseGetPos()
While True
$aMousePosNew = MouseGetPos()
If _IsPressed("10", $vU32DLL) Then
If $aMousePosOld[0] <> $aMousePosNew[0] Or $aMousePosOld[1] <> $aMousePosNew[1] Then _GDIPlus_GraphicsDrawLine($hBuffer, $aMousePosOld[0], $aMousePosOld[1], $aMousePosNew[0], $aMousePosNew[1], $hPen)
_ReDraw()
EndIf
If BitOR(WinGetState($hWnd), 2) <> 2 Then _WinAPI_SetWindowPos($hWnd, $HWND_TOPMOST, 0, 0, 0, 0, BitOR($SWP_NOMOVE, $SWP_NOSIZE))
$aMousePosOld = $aMousePosNew
WEnd
Func _ReDraw()
Local $hBitmapTmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
_WinAPI_SelectObject($hCDC, $hBitmapTmp)
_WinAPI_UpdateLayeredWindow($hWnd, $hDC, 0, $pSize, $hCDC, $pSource, 0, $pBlend, 2)
_WinAPI_DeleteObject($hBitmapTmp)
EndFunc
Func _Exit()
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_PenDispose($hPen)
_GDIPlus_Shutdown()
DllClose($vU32DLL)
Exit
EndFunc
Shift gedrückt halten, um mit der Maus auf den Bildschirm zu malen. Mit Escape kannst du das ganze beenden ;). Ich hoffe es ist verständlich geschrieben, falls nicht gibt es hier auch noch ein paar andere Scripts die mit dieser Funktion arbeiten z.B. die MouseChaser UDF von H112... Einfach die Forensuche benutzen.
Versuch es mal so.
#include <Excel.au3>
[/autoit] [autoit][/autoit] [autoit]Opt("TrayIconDebug", 1)
[/autoit] [autoit][/autoit] [autoit]$sPath = @ScriptDir & "\Test.xls"
$iRow = 1
$oExcel = _ExcelBookOpen($sPath)
While 1
$sValue = _ExcelReadCell($oExcel, $iRow)
If @error Or $sValue = "" Then ExitLoop
WinWaitActive("[CLASS:KCMLMasterForm_32]")
Send($sValue)
Sleep(500)
Send("{ENTER}")
Sleep(500)
Send("!ä")
Sleep(500)
Send("!m")
Sleep(500)
Send("{TAB}")
Sleep(500)
Sleep(500)
Send("*")
Sleep(500)
Send("{TAB}")
Sleep(500)
Send("!s")
Sleep(500)
Send("{TAB}")
Sleep(500)
Send("!s")
Sleep(100)
$iRow = $iRow + 1
WEnd
_ExcelBookClose($oExcel, 0)
[/autoit] [autoit][/autoit] [autoit]MsgBox(64, "Info", "Abgeschlossen")
[/autoit] ZitatAchso, ok. Geht es denn mit einer anderen Methode?
Bestimmt, aber ich weiß leider nicht wie :D. Mit _WinAPI_UpdateLayeredWindow geht es vielleicht und ich kann dir sogar ein Beispiel geben wie man die Funktion verwenden kann, aber ich weiß nur wie man das z.B. mit Bitmaps (wie bei meinem GDI+ ToolTip) macht. Wie das mit dem gewöhlichen Fensterinhalt und seinen Controls geht weiß ich nicht. ![]()
Du kannst es auch so machen, aber so wie ich es geschrieben habe kannst du auch Anführungszeichen der selben Art (" oder ') ineinander schreiben. Das musst du z.B. wenn in einem String nicht nur " sondern auch ' vorkommen ;).