Zwei Wochen zurück:
[autoit]
#include <Date.au3>
MsgBox(0,0, _DateAdd('w', -2, _NowCalcDate()))
Zwei Wochen zurück:
[autoit]
#include <Date.au3>
MsgBox(0,0, _DateAdd('w', -2, _NowCalcDate()))
Hier noch eine Version mit Maus-Positions-Abfrage:
$hGui = GUICreate('Test', 600, 600)
GUISetState(@SW_SHOW, $hGui)
HotKeySet('!s', '_Show') ; [ALT] + [s] um das Fenster wieder anzuzeigen
MouseMove(@DesktopWidth / 2, @DesktopHeight / 2, 0) ; Maus in der Mitte positionieren
Do
$aMousePos = MouseGetPos()
$aWinPos = WinGetPos($hGui)
If $aMousePos[0] < $aWinPos[0] Or $aMousePos[0] > ($aWinPos[0] + $aWinPos[2]) _
Or $aMousePos[1] < $aWinPos[1] Or $aMousePos[1] > ($aWinPos[1] + $aWinPos[3]) Then GUISetState(@SW_HIDE, $hGui)
Until GUIGetMsg() = -3
Func _Show()
MouseMove(@DesktopWidth / 2, @DesktopHeight / 2, 0)
GUISetState(@SW_SHOW, $hGui)
EndFunc
Ich hab mal schnell eine Funktion erstellt:
MsgBox(0, '', _RegSearch('HKEY_LOCAL_MACHINE', 'v3.3.4.0'))
Func _RegSearch($sRegPath, $sSearch)
Local $sKey, $sVal, $sVar, $ret, $i = 0, $j = 0
While True
$i += 1
$sKey = RegEnumKey($sRegPath, $i)
If @error Then ExitLoop
$ret = _RegSearch($sRegPath & '\' & $sKey, $sSearch)
If $ret <> '' Then ExitLoop
$j = 0
While True
$j += 1
$sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
If @error Then ExitLoop
$sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
If $sVar == $sSearch Then Return $sRegPath & '\' & $sKey & '\' & $sVal
WEnd
WEnd
Return $ret
EndFunc
Mit RegEnumKey bzw. RegEnumVal und RegRead hast Du alle Befehle zum auslesen. Dann noch eine rekursive Funktion und schon bekommst Du Deine Suche. ![]()
DriveGetSerial ist in der Tat nicht so geeignet, da sie beim formatieren der Partition vergeben wird und sich somit beim nächsten formatieren ändern wird.
Man kann aber auch die Hersteller-Seriennummer der Festplatte auslesen, die IMHO einmalig ist (oder zumindest sein sollte).
Dazu hatte ich mal eine Funktion geschrieben:
; Anfang Beispiel
#include <Array.au3> ; wird nur für _ArrayDisplay benötigt
$sDrive = 'c:'
$Ret = _GetDriveInfo($sDrive)
If IsArray($Ret) Then
_ArrayDisplay($Ret, 'Informationen über Laufwerk "' & $sDrive & '"')
Else
MsgBox(0, 'Fehler', $Ret)
EndIf
; Ende Beispiel
;===============================================================================
; Function Name: _GetDriveInfo($sDrive)
; Description:: Erweiterte Informationen zu einer Festplatte/USB-Stick
; Parameter(s): $sDrive = Laufwerksbuchstabe
; Requirement(s): ---
; Return Value(s): 2D-Array mit Bezeichnung und Wert (siehe Beispiel)
; Author(s): Oscar (http://www.autoit.de)
;===============================================================================
Func _GetDriveInfo($sDrive)
$sDrive = StringRegExpReplace($sDrive, '(?i)(.*)([a-z]{1}:)(.*)', '$2')
Local $sDriveType = DriveGetType($sDrive)
If $sDriveType <> 'Fixed' And $sDriveType <> 'Removable' Then SetError(1, 0, 1)
If Not FileExists($sDrive) Then Return SetError(1, 0, 1)
Local $wbemFlagReturnImmediately = 0x10
Local $wbemFlagForwardOnly = 0x20
Local $colItems = ''
Local $aPartition, $aPhysicalDrive, $aOut[14][2]
$objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2')
If Not IsObj($objWMIService) Then Return SetError(2, 0, 2)
$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) then
For $objItem In $colItems
If StringInStr($objItem.Dependent, '"' & $sDrive & '"') Then
$aPartition = StringRegExp($objItem.Antecedent, 'DeviceID="(.*)"', 3)
EndIf
Next
Endif
If Not IsArray($aPartition) Then Return SetError(3, 0, 3)
$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) then
For $objItem In $colItems
If StringInStr($objItem.Dependent, '"' & $aPartition[0] & '"') Then
$aPhysicalDrive = StringRegExp($objItem.Antecedent, 'DeviceID="(.*)"', 3)
EndIf
Next
Endif
If Not IsArray($aPhysicalDrive) Then Return SetError(4, 0, 4)
$aPhysicalDrive[0] = StringReplace($aPhysicalDrive[0], '\\', '\')
$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) then
For $objItem In $colItems
If StringInStr($objItem.DeviceID, $aPhysicalDrive[0]) Then
$aOut[0][0] = 'Volume-Label'
$aOut[0][1] = DriveGetLabel($sDrive)
$aOut[1][0] = 'Serial-Nr. (Volume)'
$aOut[1][1] = DriveGetSerial($sDrive)
$aOut[2][0] = 'Model'
$aOut[2][1] = $objItem.Model
$aOut[3][0] = 'Serial-Nr. (Drive)'
$aOut[3][1] = StringMid($objItem.PNPDeviceID, StringInStr($objItem.PNPDeviceID, '\', 0, -1) + 1)
$aOut[3][1] = StringReplace($aOut[3][1], '&0', '')
$aOut[4][0] = 'Interface'
$aOut[4][1] = $objItem.InterfaceType
$aOut[5][0] = 'Size (Bytes)'
$aOut[5][1] = $objItem.Size
$aOut[6][0] = 'Media Type'
$aOut[6][1] = StringRegExpReplace($objItem.MediaType, '[^[:print:]]', ' ')
$aOut[7][0] = 'Total Cylinders'
$aOut[7][1] = $objItem.TotalCylinders
$aOut[8][0] = 'Total Heads'
$aOut[8][1] = $objItem.TotalHeads
$aOut[9][0] = 'Total Tracks'
$aOut[9][1] = $objItem.TotalTracks
$aOut[10][0] = 'Total Sectors'
$aOut[10][1] = $objItem.TotalSectors
$aOut[11][0] = 'Tracks Per Cylinder'
$aOut[11][1] = $objItem.TracksPerCylinder
$aOut[12][0] = 'Sectors Per Track'
$aOut[12][1] = $objItem.SectorsPerTrack
$aOut[13][0] = 'Bytes Per Sector'
$aOut[13][1] = $objItem.BytesPerSector
EndIf
Next
Endif
$objWMIService = ''
Return $aOut
EndFunc
Achso, ja klar. Aber das geht auch mit RegExp:
[autoit]
$string = 'hallohallohallo'
$found = 1
$search = 'hallo'
While True
StringRegExp($string, $search, 1, $found)
$next = @extended
ConsoleWrite('Position:' & $found & @CR)
If $next = 0 Then ExitLoop
MsgBox(0, '', StringReplace($string, $found, StringUpper($search), 1))
$found = $next
WEnd
Wenn Du nur die markierten Einträge löschen willst, warum nimmst Du dann nicht:
[autoit]_GUICtrlListView_DeleteItemsSelected($hListView)
[/autoit]Vielleicht hilft Dir das hier weiter:
[autoit]
$string = 'hallohallohallo'
$found = 1
$search = 'hallo'
While True
$found = StringInStr($string, $search, 1, 1, $found)
ConsoleWrite('Position:' & $found & @CR)
If $found = 0 Then ExitLoop
MsgBox(0, '', StringReplace($string, $found, StringUpper($search), 1))
$found += StringLen($search)
WEnd
Wow! Das ist klasse! ![]()
Gleich mal archivieren. Kann ich bestimmt mal gebrauchen. ![]()
Die Größe und Position läßt sich so auslesen:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
$Form1 = GUICreate("Beispiel", 1030, 680)
$oIE = _IECreateEmbedded()
$Obj_ctrl = GUICtrlCreateObj($oIE, 5, 8, 1000, 610)
GUISetState()
_IENavigate($oIE,"http://google.de")
MsgBox(0,0,$oIE.left & @CR & $oIE.top & @CR & $oIE.width & @CR & $oIE.height)
Das Problem ist diese Zeile:
[autoit]$o_signin = _IEFormElementGetObjByName ($o_form, "button-1")
[/autoit]
Es gibt auf der Seite keinen Formular-Button mit diesem Namen. Das ist dort per Javascript gemacht.
Wenn der LogIn trotzdem funktioniert kannst Du die obige Zeile einfach entfernen.
nun läuft mein Bot ein wenig besser was das an und ausschalten betrifft.
Forenregeln lesen! ![]()
Hier ist mal das Grundgerüst eines Clipboard-Edits:
#include <Clipboard.au3>
#include <GUIConstantsEx.au3>
#include <SendMessage.au3>
#include <WindowsConstants.au3>
Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate('Clipboard-Edit', 600, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
$hEdit = GUICtrlCreateEdit('', 10, 10, 580, 240)
$hSave = GUICtrlCreateButton('Save to file...', 10, 260, 120, 22)
GUICtrlSetOnEvent(-1, '_SaveEdit')
GUISetState()
WinSetOnTop($hGui, '', 1)
Global $hNext = _ClipBoard_SetViewer($hGui)
GUIRegisterMsg($WM_CHANGECBCHAIN, 'WM_CHANGECBCHAIN')
GUIRegisterMsg($WM_DRAWCLIPBOARD, 'WM_DRAWCLIPBOARD')
While Sleep(1000)
WEnd
Func _End()
_ClipBoard_ChangeChain($hGui, $hNext)
Exit
EndFunc ;==>_End
Func _SaveEdit()
Local $sPath, $hFile
$sPath = FileSaveDialog('Choose a name', @ScriptDir, 'Text (*.txt)', 16 + 2, 'Clipboard.txt', $hGui)
If @error Then Return
$hFile = FileOpen($sPath, 2)
If $hFile <> -1 Then
FileWrite($hFile, GUICtrlRead($hEdit))
FileClose($hFile)
EndIf
EndFunc ;==>_SaveEdit
Func WM_CHANGECBCHAIN($hWnd, $iMsg, $iwParam, $ilParam)
If $iwParam = $hNext Then
$hNext = $ilParam
ElseIf $hNext <> 0 Then
_SendMessage($hNext, $WM_CHANGECBCHAIN, $iwParam, $ilParam, 0, 'hwnd', 'hwnd')
EndIf
EndFunc ;==>WM_CHANGECBCHAIN
Func WM_DRAWCLIPBOARD($hWnd, $iMsg, $iwParam, $ilParam)
Local $clip = ClipGet()
If Not @error Then
$clip = StringRegExpReplace($clip, '(\S)(\n)', '$1' & @CRLF)
If StringRight($clip, 2) <> @CRLF Then $clip &= @CRLF
GUICtrlSetData($hEdit, GUICtrlRead($hEdit) & $clip)
EndIf
If $hNext <> 0 Then _SendMessage($hNext, $WM_DRAWCLIPBOARD, $iwParam, $ilParam)
EndFunc ;==>WM_DRAWCLIPBOARD
Ja, das sind diese Codes!
Und Informationen bekommst Du am besten auf den Microsoftseiten (msdn.microsoft.com/...).
Speziell zu einer bestimmten Seite kommst Du am einfachsten, indem Du den Code bei Google eingibst. Das ist dann meist der erste Treffer.
stinger2k: Wenn der Code noch nicht in irgendeiner Include-Datei vorhanden ist, dann muss man diesen halt selbst als Konstante deklarieren.
Das ständig in einer Schleife zu überprüfen ist ein schlechter Vorschlag. Besser ist es, wenn das Script von Windows darüber informiert wird, sobald sich etwas geändert hat (GUIRegisterMsg).
Das würde dann in etwas so aussehen:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
If Not IsDeclared('WM_DEVICECHANGE') Then Global Const $WM_DEVICECHANGE = 0x0219
$hGui = GUICreate('Automatische Laufwerkserkennung', 300, 200)
GUICtrlCreateLabel('Alle Laufwerke:', 25, 30, 100, 20)
$hCombo = GUICtrlCreateCombo('', 20, 50, 120, 20, $CBS_DROPDOWNLIST)
_ReadDrives()
GUISetState()
GUIRegisterMsg($WM_DEVICECHANGE, 'MY_WM_DEVICECHANGE')
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func MY_WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
If $hWnd = $hGui Then _ReadDrives()
Return $GUI_RUNDEFMSG
EndFunc
Func _ReadDrives()
Local $aDrives, $sDrives, $sTmp
GUICtrlSetData($hCombo, '')
$aDrives = DriveGetDrive('ALL')
For $i = 1 To $aDrives[0]
$sDrives &= '|' & StringUpper($aDrives[$i])
$sTmp = DriveGetLabel($aDrives[$i])
If $sTmp <> '' Then $sDrives &= ' (' & $sTmp & ') '
Next
GUICtrlSetData($hCombo, StringTrimLeft($sDrives, 1), StringRegExpReplace($sDrives, '\|(.+?)\|.*', '$1'))
EndFunc
Das Skript von BugFix geht noch etwas kürzer:
Local $checkbox[75]
Local $Form1 = GUICreate("Form1", 875, 600, -1, -1)
Local $top = 75
Local $left = 25
For $i = 0 To UBound($checkbox) - 1
$checkbox[$i] = GUICtrlCreateCheckbox("checkbox" & $i, $left + Mod($i, 5) * 175, $top + Int($i / 5) * 20, 175, 17)
Next
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While True
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
Danke für das Lob. Das Programm ist bei mir auch nicht in Vergessenheit geraten.
Die nächste Version wird einen Multiplayer-Modus (bis zu vier Spieler) haben und man wird Joypads für die Eingabe benutzen können.
Allerdings wird das noch etwas dauern, weil ich erst noch etwas anderes fertig machen muss.
Das kann ich nicht bestätigen. Es gibt auf der linken Seite genügend Platz um den Zeigefinger dort aufzulegen.
Außerdem bietet diese Art des haltens den Vorteil, dass man den Blitz schnell mal mit dem Zeigefinger ausschalten kann (Blitz einfach runterdrücken).
Und das mit dem optischen Zoom beim filmen stimmt zwar, aber nur während der Aufnahme. Folgende Vorgehensweise hingegen funktioniert: ranzoomen, dann filmen, auf Pause drücken, wegzoomen, wieder filmen, usw...
Mir war besonders die Brennweite wichtig: 5,0–60,0 mm (28–336 mm, äquivalent zu KB)
Die 5,0mm sind schon ein schöner Weitwinkel, was besonders für Innenaufnahmen einen großen Vorteil darstellt. Aber auch Außenaufnahmen, z.B. von ganzen Gebäuden werden so oft erst möglich, weil man mit anderen Kameras, die nicht einen solchen Weitwinkel bieten, viel weiter weggehen müsste, um alles zu erfassen.
Auch der maximale Telebereich gibt noch gute Aufnahmen. Wobei ich dazu sagen muss, dass man den bei Innenaufnahmen nur nutzen sollte, wenn genügend Licht vorhanden ist. Die Lichtstärke der Kompakten ist nämlich nicht so gut. Das ist aber bei allen mir bekannten Digitalkameras (in diesem Preissegment) der Fall.
Ich bin mit meiner Canon PowerShot SX200 IS sehr zufrieden. Vielleicht ist die ja etwas für Dich!?
Ca. 250,-€ bei Amazon.
Oder schnell mal eine Datum-Eingabe-Box scripten. ![]()
Zum Beispiel so:
$sInput = _DateInputBox()
MsgBox(0, 'Eingegeben wurde dieses Datum:', $sInput)
Func _DateInputBox($sTitle = '')
Local $hGui, $hDate, $hOk, $aMsg
$hGui = GUICreate($sTitle, 200, 100)
GUICtrlCreateLabel('Bitte Datum eingeben:', 50, 10, 120, 20)
$hDate = GUICtrlCreateDate('', 45, 30, 120, 20, 0x00) ; 0x00 = $DTS_SHORTDATEFORMAT
GUICtrlSetFont(-1, 12)
$hOk = GUICtrlCreateButton('Ok', 70, 70, 60, 22)
GUISetState(@SW_SHOW, $hGui)
While True
$aMsg = GUIGetMsg(1)
If $aMsg[1] = $hGui Then
Switch $aMsg[0]
Case $hOk, -3 ; -3 = $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
EndIf
WEnd
$sDate = GUICtrlRead($hDate)
GUIDelete($hGui)
Return $sDate
EndFunc ;==>_DateInputBox