name22: die Betonung liegt auf oder.
MemFont is praktischer, aber zum Testen ist das Laden einfacher.
Gruß,
UEZ ![]()
name22: die Betonung liegt auf oder.
MemFont is praktischer, aber zum Testen ist das Laden einfacher.
Gruß,
UEZ ![]()
Oder du lädst einfach den Font ohne ihn zu installieren:
#include <Color.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
Opt("GuiOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global $color = 0x00FF00
Global $number = 100
Global $iGUIHeight = @DesktopHeight
Global $iGUIWidth = @DesktopWidth
Global $sFPS = 15 ;Bilder/Sekunde, je höher desto schneller
Global $nX[$number], $nY[$number]
[/autoit] [autoit][/autoit] [autoit]Global $hGUI = GUICreate("Falling Code by clezZ (c) 2011", $iGUIWidth, $iGUIHeight, 0, 0, $WS_POPUP)
GUISetState()
WinSetTrans($hGUI, "", 0xFF)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphics)
Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "handle", $hBuffer, "int", 4)
Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF00)
_GDIPlus_GraphicsClear($hBuffer, 0xFF000000)
[/autoit] [autoit][/autoit] [autoit]Global $hTi, $chr, $tLayout, $aInfo, $pLayout, $aResult, $aChr[2]
Global $sString, $nSize = 24
For $i = 0 To $number - 1
$nX[$i] = Random($nSize, $iGUIWidth - $nSize, 1)
$nY[$i] = Random($nSize, $iGUIHeight - $nSize, 1)
Next
Global $font = @ScriptDir & "\matrix code nfi.ttf"
Global $fontname = "Matrix Code NFI"
Global $hFormat = _GDIPlus_StringFormatCreate(0)
Global $hCollection = DllCall($ghGDIPDll, 'int', 'GdipNewPrivateFontCollection', 'ptr*', 0)
$hCollection = $hCollection[1]
DllCall($ghGDIPDll, 'int', 'GdipPrivateAddFontFile', 'ptr', $hCollection, 'wstr', $font)
Global $hFamily = DllCall($ghGDIPDll, 'int', 'GdipCreateFontFamilyFromName', 'wstr', $fontname, 'ptr', $hCollection, 'int*', 0)
$hFamily = $hFamily[3]
Global $hFont = _GDIPlus_FontCreate($hFamily, $nSize, 1)
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
[/autoit] [autoit][/autoit] [autoit]HotKeySet("c", "_color")
[/autoit] [autoit][/autoit] [autoit]While 1
$hTi = TimerInit()
_Draw()
Sleep(1000 / $sFPS - TimerDiff($hTi))
WEnd
Func _Draw()
_GDIPlus_GraphicsClear($hBuffer, 0x35000000)
For $i = 0 To $number - 1
$aChr[0] = Random(33, 63, 1)
$aChr[1] = Random(90, 127, 1)
$sString = Chr($aChr[Random(0, 1, 1)])
$nY[$i] += $nSize + 3
$tLayout = _GDIPlus_RectFCreate($nX[$i], $nY[$i], 0, 0)
$aInfo = _GDIPlus_GraphicsMeasureString($hBuffer, $sString, $hFont, $tLayout, $hFormat)
$pLayout = DllStructGetPtr($tLayout)
If $nY[$i] > $iGUIHeight Then
$nY[$i] = $nY[$i] - $iGUIHeight - 2 * $nSize
$nX[$i] = Random($nSize, $iGUIWidth - $nSize, 1)
EndIf
$aResult = DllCall($ghGDIPDll, "int", "GdipDrawString", "handle", $hBuffer, "wstr", $sString, "int", -1, "handle", $hFont, "ptr", $pLayout, "handle", $hFormat, "handle", $hBrush)
Next
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
EndFunc ;==>_Draw
Func _color()
$color = _ChooseColor(2, $color)
_GDIPlus_BrushSetSolidColor($hBrush, '0xFF' & Hex(_ColorGetRed($color), 2) & Hex(_ColorGetGreen($color), 2) & Hex(_ColorGetBlue($color), 2))
EndFunc ;==>_color
Func _Exit()
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_Exit
Gruß,
UEZ
Ist ganz nett geworden - Matrix Like!
Ich würde irgend eine japanische Schrift verwenden, damit es näher an der Matrix ist...
Gruß,
UEZ
Schöne Umsetzung! Vielleicht würde der Hintergrund mit den Kugeln noch besser aussehen, wenn du den Kugeln "Volumen" gibts, ähnlich der Kugeln aus der LED Laufschrift.
Gruß,
UEZ
Auch von mir alles Gute zum Geburtstag nachträglich.
Gruß,
UEZ
Auch von mir alles Gute zum Geburtstag!
Gruß,
UEZ
Hab's herausgefunden!
Guckst du hier:
#AutoIt3Wrapper_UseX64=n
#include <WinAPI.au3>
#region AVIWriter UDF
Global Const $OF_CREATE = 0x00001000
Global Const $AVIIF_KEYFRAME = 0x00000010
Global Const $ICMF_CHOOSE_KEYFRAME = 1, $ICMF_CHOOSE_DATARATE = 2
Global Const $AVIERR_UNSUPPORTED = 0x80044065
Global Const $AVIERR_BADPARAM = 0x80044066
Global Const $AVIERR_MEMORY = 0x80044067
Global Const $AVIERR_NOCOMPRESSOR = 0x80044071
Global Const $AVIERR_CANTCOMPRESS = 0x80044075
Global Const $AVIERR_ERROR = 0x800440C7
Global Const $AVIERR_OK = 0
Global $Avi32_Dll
;http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
Global Const $BITMAPFILEHEADER = "WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;"
;~ Global Const $BITMAPFILEHEADER = "align 2;char magic[2];int size;short res1;short res2;ptr offset;"
;http://msdn.microsoft.com/en-us/library/…6(v=vs.85).aspx
Global Const $BITMAPINFOHEADER = _
"dword biSize;long biWidth;long biHeight;short biPlanes;short biBitCount;dword biCompression;" & _
"dword biSizeImage;long biXPelsPerMeter;long biYPelsPerMeter;dword biClrUsed;dword biClrImportant;"
;http://msdn.microsoft.com/en-us/library/ms899423.aspx
Global Const $AVISTREAMINFO = _
"dword fccType;dword fccHandler;dword dwFlags;dword dwCaps;short wPriority;short wLanguage;dword dwScale;" & _
"dword dwRate;dword dwStart;dword dwLength;dword dwInitialFrames;dword dwSuggestedBufferSize;dword dwQuality;" & _
"dword dwSampleSize;int rleft;int rtop;int rright;int rbottom;dword dwEditCount;dword dwFormatChangeCount;wchar[64];"
;http://msdn.microsoft.com/en-us/library/…1(v=VS.85).aspx
Global Const $AVICOMPRESSOPTIONS = _
"DWORD fccType;DWORD fccHandler;DWORD dwKeyFrameEvery;DWORD dwQuality;DWORD dwBytesPerSecond;" & _
"DWORD dwFlags;PTR lpFormat;DWORD cbFormat;PTR lpParms;DWORD cbParms;DWORD dwInterleaveEvery;"
;http://www.fourcc.org/codecs.php
Func _Create_mmioFOURCC($FOURCC) ;coded by UEZ
If StringLen($FOURCC) <> 4 Then Return SetError(1, 0, 0)
Local $aFOURCC = StringSplit($FOURCC, "", 2)
Return BitOR(Asc($aFOURCC[0]), BitShift(Asc($aFOURCC[1]), -8), BitShift(Asc($aFOURCC[2]), -16), BitShift(Asc($aFOURCC[3]), -24))
EndFunc ;==>_Create_mmioFOURCC
Func _DecodeFOURCC($iFOURCC); coded by UEZ
If Not IsInt($iFOURCC) Then Return SetError(1, 0, 0)
Return Chr(BitAND($iFOURCC, 0xFF)) & Chr(BitShift(BitAND(0x0000FF00, $iFOURCC), 8)) & Chr(BitShift(BitAND(0x00FF0000, $iFOURCC), 16)) & Chr(BitShift($iFOURCC, 24))
EndFunc ;==>_DecodeFOURCC
; monoceres, Prog@ndy, UEZ
Func _CreateAvi($sFilename, $FrameRate, $Width, $Height, $BitCount = 24, $mmioFOURCC = "MSVC")
Local $RetArr[6] ; avi file handle, stream handle, bitmap count, BitmapInfoheader, Stride
Local $aRet, $pFile, $asi, $aco, $pStream, $psCompressed
[/autoit] [autoit][/autoit] [autoit]Local $stride = BitAND(($Width * ($BitCount /
+ 3), BitNOT(3))
Local $bi = DllStructCreate($BITMAPINFOHEADER)
DllStructSetData($bi, "biSize", DllStructGetSize($bi))
DllStructSetData($bi, "biWidth", $Width)
DllStructSetData($bi, "biHeight", $Height)
DllStructSetData($bi, "biPlanes", 1)
DllStructSetData($bi, "biBitCount", $BitCount)
DllStructSetData($bi, "biSizeImage", $stride * $Height)
$asi = DllStructCreate($AVISTREAMINFO)
DllStructSetData($asi, "fccType", _Create_mmioFOURCC("vids"))
DllStructSetData($asi, "fccHandler", _Create_mmioFOURCC($mmioFOURCC))
DllStructSetData($asi, "dwScale", 1)
DllStructSetData($asi, "dwRate", $FrameRate)
DllStructSetData($asi, "dwQuality", -1) ;Quality is represented as a number between 0 and 10,000. For compressed data, this typically represents the value of the quality parameter passed to the compression software. If set to –1, drivers use the default quality value.
DllStructSetData($asi, "dwSuggestedBufferSize", $stride * $Height)
DllStructSetData($asi, "rright", $Width)
DllStructSetData($asi, "rbottom", $Height)
$aco = DllStructCreate($AVICOMPRESSOPTIONS)
DllStructSetData($aco, "fccType", _Create_mmioFOURCC("vids"))
DllStructSetData($aco, "fccHandler", _Create_mmioFOURCC($mmioFOURCC))
DllStructSetData($aco, "dwKeyFrameEvery", 10)
$aRet = DllCall($Avi32_Dll, "int", "AVIFileOpenW", "ptr*", 0, "wstr", $sFilename, "uint", $OF_CREATE, "ptr", 0)
$pFile = $aRet[1]
$aRet = DllCall($Avi32_Dll, "int", "AVIFileCreateStream", "ptr", $pFile, "ptr*", 0, "ptr", DllStructGetPtr($asi))
$pStream = $aRet[2]
$aRet = DllCall($Avi32_Dll, "int_ptr", "AVISaveOptions", "hwnd", 0, "uint", BitOR($ICMF_CHOOSE_DATARATE, $ICMF_CHOOSE_KEYFRAME), "int", 1, "ptr*", $pStream, "ptr*", DllStructGetPtr($aco))
If $aRet[0] <> 1 Then
$RetArr[0] = $pFile
$RetArr[1] = $pStream
Sleep(50)
Return SetError(1, 0, $RetArr)
EndIf
ConsoleWrite(_DecodeFOURCC(DllStructGetData($aco, "fccHandler")) & @CRLF)
[/autoit] [autoit][/autoit] [autoit];http://msdn.microsoft.com/en-us/library/…1(v=VS.85).aspx
$aRet = DllCall($Avi32_Dll, "int", "AVIMakeCompressedStream", "ptr*", 0, "ptr", $pStream, "ptr", DllStructGetPtr($aco), "ptr", 0)
If $aRet[0] <> $AVIERR_OK Then
$RetArr[0] = $pFile
$RetArr[1] = $pStream
Return SetError(2, 0, $RetArr)
EndIf
$psCompressed = $aRet[1]
;~ ; The format for the stream is the same as BITMAPINFOHEADER
$aRet = DllCall($Avi32_Dll, "int", "AVIStreamSetFormat", "ptr", $psCompressed, "long", 0, "ptr", DllStructGetPtr($bi), "long", DllStructGetSize($bi))
$RetArr[0] = $pFile
$RetArr[1] = $psCompressed
$RetArr[2] = 0
$RetArr[3] = $bi
$RetArr[4] = $stride
$RetArr[5] = $pStream
Return $RetArr
EndFunc ;==>_CreateAvi
; Adds a bitmap file to an already opened avi file.
; monoceres, Prog@ndy
Func _AddHBitmapToAvi(ByRef $Avi_Handle, $hBitmap)
Local $DC = _WinAPI_GetDC(0)
Local $hDC = _WinAPI_CreateCompatibleDC($DC)
_WinAPI_ReleaseDC(0, $DC)
Local $OldBMP = _WinAPI_SelectObject($hDC, $hBitmap)
Local $bits = DllStructCreate("byte[" & DllStructGetData($Avi_Handle[3], "biSizeImage") & "]")
_WinAPI_GetDIBits($hDC, $hBitmap, 0, Abs(DllStructGetData($Avi_Handle[3], "biHeight")), DllStructGetPtr($bits), DllStructGetPtr($Avi_Handle[3]), 0)
_WinAPI_SelectObject($hDC, $OldBMP)
_WinAPI_DeleteDC($hDC)
DllCall($Avi32_Dll, "int", "AVIStreamWrite", "ptr", $Avi_Handle[1], "long", $Avi_Handle[2], "long", 1, "ptr", DllStructGetPtr($bits), _
"long", DllStructGetSize($bits), "long", $AVIIF_KEYFRAME, "ptr*", 0, "ptr*", 0)
$Avi_Handle[2] += 1
EndFunc ;==>_AddHBitmapToAvi
; Adds a bitmap file to an already opened avi file.
Func _AddBitmapToAvi(ByRef $Avi_Handle, $sBitmap)
Local $bm = LoadBitmap($sBitmap, True)
DllCall($Avi32_Dll, "int", "AVIStreamWrite", "ptr", $Avi_Handle[1], "long", $Avi_Handle[2], "long", 1, "ptr", DllStructGetPtr($bm[2]), _
"long", DllStructGetSize($bm[2]), "long", $AVIIF_KEYFRAME, "ptr*", 0, "ptr*", 0)
$Avi_Handle[2] += 1
EndFunc ;==>_AddBitmapToAvi
; Returns array with 3 elements
; [0]=BITMAPFILEHEADER
; [1]=BITMAPINFOHEADER
; [2]=Bitmap data buffer (if specified)
Func LoadBitmap($sFilename, $LoadData = False)
Local $RetArr[3]
Local $byref
Local $bih, $bfh, $buffer, $fhandle
$bfh = DllStructCreate($BITMAPFILEHEADER)
$bih = DllStructCreate($BITMAPINFOHEADER)
$fhandle = _WinAPI_CreateFile($sFilename, 2, 2, 0, 0)
_WinAPI_ReadFile($fhandle, DllStructGetPtr($bfh), DllStructGetSize($bfh), $byref)
_WinAPI_ReadFile($fhandle, DllStructGetPtr($bih), DllStructGetSize($bih), $byref)
$RetArr[0] = $bfh
$RetArr[1] = $bih
If Not $LoadData Then
_WinAPI_CloseHandle($fhandle)
Return $RetArr
EndIf
$buffer = DllStructCreate("byte[" & DllStructGetData($bfh, "size") - 54 & "]")
$RetArr[2] = $buffer
_WinAPI_ReadFile($fhandle, DllStructGetPtr($buffer), DllStructGetSize($buffer), $byref)
_WinAPI_CloseHandle($fhandle)
Return $RetArr
EndFunc ;==>LoadBitmap
; Init the avi library
Func _StartAviLibrary()
$Avi32_Dll = DllOpen("Avifil32.dll")
DllCall($Avi32_Dll, "none", "AVIFileInit")
EndFunc ;==>_StartAviLibrary
; Release the library
Func _StopAviLibrary()
DllCall($Avi32_Dll, "none", "AVIFileExit")
DllClose($Avi32_Dll)
EndFunc ;==>_StopAviLibrary
Func _CloseAvi($Avi_Handle)
DllCall($Avi32_Dll, "int", "AVIStreamRelease", "ptr", $Avi_Handle[1])
DllCall($Avi32_Dll, "int", "AVIStreamRelease", "ptr", $Avi_Handle[5])
DllCall($Avi32_Dll, "int", "AVIFileRelease", "ptr", $Avi_Handle[0])
EndFunc ;==>_CloseAvi
#endregion AVIWriter UD5
#region example
#include <Array.au3>
#include <Memory.au3>
#include <ScreenCapture.au3>
_GDIPlus_Startup()
HotKeySet("{ESC}", "close")
Break(0)
[/autoit] [autoit][/autoit] [autoit]$sFile = @ScriptDir & "\test.avi"
FileDelete($sFile)
$tPoint = DllStructCreate($tagPOINT)
$aMPos = MouseGetPos()
DllStructSetData($tPoint, 1, $aMPos[0])
DllStructSetData($tPoint, 2, $aMPos[1])
$hWin = _WinAPI_WindowFromPoint($tPoint)
$hWinAncestor = _WinAPI_GetAncestor($hWin, 2)
$hWnd = HWnd($hWinAncestor)
$aPos = WinGetPos($hWnd)
$rec_duration = 1000 * 1
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite("Starting...." & @CRLF)
[/autoit] [autoit][/autoit] [autoit]_StartAviLibrary()
$aAVI = _CreateAvi($sFile, 15, $aPos[2], $aPos[3])
If @error Then close()
$t = TimerInit()
[/autoit] [autoit][/autoit] [autoit]Do
$hBmp = _ScreenCapture_CaptureWnd("", $hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
_AddHBitmapToAvi($aAVI, $hBmp)
_WinAPI_DeleteObject($hBmp)
If TimerDiff($t) > $rec_duration Then close()
Until False
Func Close()
_GDIPlus_Shutdown()
_CloseAvi($aAVI)
_StopAviLibrary()
ConsoleWrite("AVI filesize: " & Round(FileGetSize($sFile) / 1024 ^ 2, 2) & " MB" & @CRLF)
Exit
EndFunc ;==>close
#endregion example
Gruß,
UEZ
Wie sieht der Text genau aus?
Gruß,
UEZ
Oder in SEuBo's Signatur schauen... ![]()
ich wusste, das da doch was war.
Gruß,
UEZ
Kannst du die Mail Datei hochladen? Denn mit dem Text von oben bekomme ich Test in dem Array zurück!
Gruß,
UEZ
Probiere es mal mit:
[autoit]
$StringR = StringRegExp($recv, '(?i)Subject:\s+(.*)\n',3)
Gruß,
UEZ
Tweaky: sollte jetzt "gefixt" sein: ich musste die GUI auf maximal 8192x8192 festlegen, da sonst die GUI weiß bleibt.
Gruß,
UEZ
Wenn ich diese komplette Webseite abfotografieren will kommt nur eine leere weiße Seite.
Kannst ja mal schauen, was da nicht stimmt.
Getestet mit der Version vom 09.09.2011
Die Seite hat eine riesen Auflösung -> 12916x7744, aber ich muss mal debuggen, warum die Seite so angezeigt wird!
Dein Script ist cool aber ist die "F12 Taste" nicht für Windows schon fest registriert?
F12 ist nur dann aktiv, wenn das Fenster aktiv ist, d.h. F12 funktioniert außerhalb wie gewohnt.
DANKE für euer Feedback. ![]()
Gruß,
UEZ
Hier noch eine Möglichkeit: http://www.autoitscript.com/forum/topic/13…post__p__916507
Gruß,
UEZ
@TheShadowAE: ich habe "Grab to Avi" für meinen Screenshooter implementiert, aber die Avi Datei wird umkomprimiert erstellt, und somit wird sie ziemlich groß.
Den C++ verstehe ich leider nicht richtig...
Kannst mir ja helfen ihn richtig zu übersetzen.
Gruß,
UEZ
Genau da liegt das Problem: ich weiß nicht, was ich falsch gemacht habe, denn der Rückgabewert ist 0x80040154. Wenn die Funktion richtig aufgerufen wird, sollter der Rückgabewert 0 sein.
Gruß,
UEZ
Bist du dir da sicher?
Denn $aRet[1] = 0x000000...
Wenn ich $psCompressed = $aRet[1] setze, dann stürzt das Skript ab.
Gruß,
UEZ
Hi,
weiß jemand, wie ich die AVIMakeCompressedStream aus Avifil32.dll aktivieren kann?
Ich kann die AVIWriter.au3 benutzen, um z.B. eine AVI Datei mit Screenshots vom Desktop zu erstellen. Aber das Problem ist, dass die AVI Datei relativ groß wird.
Nun gibt es die Funktion AVIMakeCompressedStream aus Avifil32.dll, um diesen Stream zu komprimieren, aber irgendwie kriege ich es nicht gebacken.
Hier die modifizierte AVIWriter.au3 mit einem Beispiel, um 1 Sekunde vom aktiven Fenster aufzunehmen:
#AutoIt3Wrapper_UseX64=n
#include <WinAPI.au3>
#region AVIWriter UDF
;Global Const $mmioFOURCC_M_S_V_C = _Create_mmioFOURCC("MSVC") ;1129730893
Global Const $BITMAPFILEHEADER = "align 2;char magic[2];int size;short res1;short res2;ptr offset;"
Global Const $BITMAPINFOHEADER = "dword biSize;long biWidth;long biHeight;short biPlanes;short biBitCount;" & _
"dword biCompression;dword biSizeImage;long biXPelsPerMeter;long biYPelsPerMeter;dword biClrUsed;dword biClrImportant;"
Global Const $OF_CREATE = 0x00001000
Global Const $AVIIF_KEYFRAME = 0x00000010
Global Const $ICMF_CHOOSE_KEYFRAME = 1, $ICMF_CHOOSE_DATARATE = 2
Global Const $AVIERR_UNSUPPORTED = 0x80044065
Global Const $AVIERR_MEMORY = 0x80044067
Global Const $AVIERR_NOCOMPRESSOR = 0x80044071
Global Const $AVIERR_CANTCOMPRESS = 0x80044075
Global Const $AVIERR_ERROR = 0x800440C7
Global Const $AVIERR_OK = 0
Global $Avi32_Dll
;http://msdn.microsoft.com/en-us/library/ms899423.aspx
Global Const $AVISTREAMINFO = "dword fccType;dword fccHandler;dword dwFlags;dword dwCaps;short wPriority;short wLanguage;dword dwScale;" & _
"dword dwRate;dword dwStart;dword dwLength;dword dwInitialFrames;dword dwSuggestedBufferSize;dword dwQuality;" & _
"dword dwSampleSize;int rleft;int rtop;int rright;int rbottom;dword dwEditCount;dword dwFormatChangeCount;wchar[64];"
;http://msdn.microsoft.com/en-us/library/…1(v=VS.85).aspx
Global Const $AVICOMPRESSOPTIONS = "DWORD fccType;DWORD fccHandler;DWORD dwKeyFrameEvery;DWORD dwQuality;DWORD dwBytesPerSecond;" & _
"DWORD dwFlags;PTR lpFormat;DWORD cbFormat;PTR lpParms;DWORD cbParms;DWORD dwInterleaveEvery;"
Func _Create_mmioFOURCC($FOURCC) ;http://www.fourcc.org/codecs.php
If StringLen($FOURCC) <> 4 Then Return SetError(1, 0, 0)
Local $aFOURCC = StringSplit($FOURCC, "", 2)
Return BitOR(Asc($aFOURCC[0]), BitShift(Asc($aFOURCC[1]), -8), BitShift(Asc($aFOURCC[2]), -16), BitShift(Asc($aFOURCC[3]), -24))
EndFunc ;==>_Create_mmioFOURCC
Func _DecodeFOURCC($iFOURCC)
If Not IsInt($iFOURCC) Then Return SetError(1, 0, 0)
Return Chr(BitAND($iFOURCC, 0xFF)) & Chr(BitShift(BitAND(0x0000FF00, $iFOURCC), 8)) & Chr(BitShift(BitAND(0x00FF0000, $iFOURCC), 16)) & Chr(BitShift($iFOURCC, 24))
EndFunc ;==>_DecodeFOURCC
; monoceres, Prog@ndy
Func _CreateAvi($sFilename, $FrameRate, $Width, $Height, $BitCount = 24, $mmioFOURCC = "MSVC")
Local $RetArr[5] ; avi file handle, stream handle, bitmap count, BitmapInfoheader, Stride
Local $aRet, $pfile, $asi, $aco, $pstream, $psCompressed
[/autoit] [autoit][/autoit] [autoit]$aRet = DllCall($Avi32_Dll, "int", "AVIFileOpenW", "ptr*", 0, "wstr", $sFilename, "uint", $OF_CREATE, "ptr", 0)
$pfile = $aRet[1]
Local $stride = BitAND(($Width * ($BitCount /
+ 3), BitNOT(3))
Local $bi = DllStructCreate($BITMAPINFOHEADER)
DllStructSetData($bi, "biSize", DllStructGetSize($bi))
DllStructSetData($bi, "biWidth", $Width)
DllStructSetData($bi, "biHeight", $Height)
DllStructSetData($bi, "biPlanes", 1)
DllStructSetData($bi, "biBitCount", $BitCount)
DllStructSetData($bi, "biSizeImage", $stride * $Height)
$asi = DllStructCreate($AVISTREAMINFO)
DllStructSetData($asi, "fccType", _Create_mmioFOURCC("vids"))
DllStructSetData($asi, "fccHandler", _Create_mmioFOURCC($mmioFOURCC))
DllStructSetData($asi, "dwScale", 1)
DllStructSetData($asi, "dwRate", $FrameRate)
;~ DllStructSetData($asi, "dwQuality", $Quality) ;Quality is represented as a number between 0 and 10,000. For compressed data, this typically represents the value of the quality parameter passed to the compression software. If set to –1, drivers use the default quality value.
DllStructSetData($asi, "rright", $Width)
DllStructSetData($asi, "rbottom", $Height)
;~ DllStructSetData($asi, "dwSuggestedBufferSize", $stride * $Height)
$aco = DllStructCreate($AVICOMPRESSOPTIONS)
$aRet = DllCall($Avi32_Dll, "int", "AVIFileCreateStream", "ptr", $pfile, "ptr*", 0, "ptr", DllStructGetPtr($asi))
$pstream = $aRet[2]
ConsoleWrite(DllStructGetData($AVICOMPRESSOPTIONS, "fccHandler") & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Local $hWnd= GUICreate("")
$aRet = DllCall($Avi32_Dll, "int_ptr", "AVISaveOptions", "hwnd", $hWnd, "uint", BitOR($ICMF_CHOOSE_DATARATE, $ICMF_CHOOSE_KEYFRAME), "int", 1, "ptr*", $pstream, "ptr*", DllStructGetPtr($aco))
GUIDelete($hWnd)
If $aRet[0] <> 1 Then
$RetArr[0] = $pfile
$RetArr[1] = $pstream
Return SetError(1, 0, $RetArr)
EndIf
ConsoleWrite(_DecodeFOURCC(DllStructGetData($aco, "fccHandler")) & @CRLF)
[/autoit] [autoit][/autoit] [autoit]$aRet = DllCall($Avi32_Dll, "int", "AVIMakeCompressedStream", "ptr*", 0, "ptr", $pstream, "ptr", DllStructGetPtr($aco), "ptr*", 0)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aRet = ' & Hex($aRet[0]) & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$psCompressed = $aRet[2]
; The format for the stream is the same as BITMAPINFOHEADER
$aRet = DllCall($Avi32_Dll, "int", "AVIStreamSetFormat", "ptr", $psCompressed, "long", 0, "ptr", DllStructGetPtr($bi), "long", DllStructGetSize($bi))
$RetArr[0] = $pfile
$RetArr[1] = $psCompressed
$RetArr[2] = 0
$RetArr[3] = $bi
$RetArr[4] = $stride
Return $RetArr
EndFunc ;==>_CreateAvi
; Adds a bitmap file to an already opened avi file.
; monoceres, Prog@ndy
Func _AddHBitmapToAvi(ByRef $Avi_Handle, $hBitmap)
Local $DC = _WinAPI_GetDC(0)
Local $hDC = _WinAPI_CreateCompatibleDC($DC)
_WinAPI_ReleaseDC(0, $DC)
Local $OldBMP = _WinAPI_SelectObject($hDC, $hBitmap)
Local $bits = DllStructCreate("byte[" & DllStructGetData($Avi_Handle[3], "biSizeImage") & "]")
_WinAPI_GetDIBits($hDC, $hBitmap, 0, Abs(DllStructGetData($Avi_Handle[3], "biHeight")), DllStructGetPtr($bits), DllStructGetPtr($Avi_Handle[3]), 0)
_WinAPI_SelectObject($hDC, $OldBMP)
_WinAPI_DeleteDC($hDC)
DllCall($Avi32_Dll, "int", "AVIStreamWrite", "ptr", $Avi_Handle[1], "long", $Avi_Handle[2], "long", 1, "ptr", DllStructGetPtr($bits), _
"long", DllStructGetSize($bits), "long", $AVIIF_KEYFRAME, "ptr*", 0, "ptr*", 0)
$Avi_Handle[2] += 1
EndFunc ;==>_AddHBitmapToAvi
; Adds a bitmap file to an already opened avi file.
Func _AddBitmapToAvi(ByRef $Avi_Handle, $sBitmap)
Local $bm = LoadBitmap($sBitmap, True)
DllCall($Avi32_Dll, "int", "AVIStreamWrite", "ptr", $Avi_Handle[1], "long", $Avi_Handle[2], "long", 1, "ptr", DllStructGetPtr($bm[2]), _
"long", DllStructGetSize($bm[2]), "long", $AVIIF_KEYFRAME, "ptr*", 0, "ptr*", 0)
$Avi_Handle[2] += 1
EndFunc ;==>_AddBitmapToAvi
; Returns array with 3 elements
; [0]=BITMAPFILEHEADER
; [1]=BITMAPINFOHEADER
; [2]=Bitmap data buffer (if specified)
Func LoadBitmap($sFilename, $LoadData = False)
Local $RetArr[3]
Local $byref
Local $bih, $bfh, $buffer, $fhandle
$bfh = DllStructCreate($BITMAPFILEHEADER)
$bih = DllStructCreate($BITMAPINFOHEADER)
$fhandle = _WinAPI_CreateFile($sFilename, 2, 2, 0, 0)
_WinAPI_ReadFile($fhandle, DllStructGetPtr($bfh), DllStructGetSize($bfh), $byref)
_WinAPI_ReadFile($fhandle, DllStructGetPtr($bih), DllStructGetSize($bih), $byref)
$RetArr[0] = $bfh
$RetArr[1] = $bih
If Not $LoadData Then
_WinAPI_CloseHandle($fhandle)
Return $RetArr
EndIf
$buffer = DllStructCreate("byte[" & DllStructGetData($bfh, "size") - 54 & "]")
$RetArr[2] = $buffer
_WinAPI_ReadFile($fhandle, DllStructGetPtr($buffer), DllStructGetSize($buffer), $byref)
_WinAPI_CloseHandle($fhandle)
Return $RetArr
EndFunc ;==>LoadBitmap
; Init the avi library
Func _StartAviLibrary()
$Avi32_Dll = DllOpen("Avifil32.dll")
DllCall($Avi32_Dll, "none", "AVIFileInit")
;~ MsgBox(0,"",@error)
EndFunc ;==>_StartAviLibrary
; Release the library
Func _StopAviLibrary()
DllCall($Avi32_Dll, "none", "AVIFileExit")
DllClose($Avi32_Dll)
EndFunc ;==>_StopAviLibrary
Func _CloseAvi($Avi_Handle)
DllCall($Avi32_Dll, "int", "AVIStreamRelease", "ptr", $Avi_Handle[1])
DllCall($Avi32_Dll, "int", "AVIFileRelease", "ptr", $Avi_Handle[0])
EndFunc ;==>_CloseAvi
#endregion
#region example
#include <Array.au3>
#include <Memory.au3>
#include <ScreenCapture.au3>
_GDIPlus_Startup()
HotKeySet("{ESC}", "close")
Break(0)
[/autoit] [autoit][/autoit] [autoit]FileDelete(@ScriptDir & "\test.avi")
[/autoit] [autoit][/autoit] [autoit]$tPoint = DllStructCreate($tagPOINT)
$aMPos = MouseGetPos()
DllStructSetData($tPoint, 1, $aMPos[0])
DllStructSetData($tPoint, 2, $aMPos[1])
$hWin = _WinAPI_WindowFromPoint($tPoint)
$hWinAncestor = _WinAPI_GetAncestor($hWin, 2)
$hWnd = HWnd($hWinAncestor)
$aPos = WinGetPos($hWnd)
$rec_duration = 1000 * 1
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite("Starting...." & @CRLF)
[/autoit] [autoit][/autoit] [autoit]_StartAviLibrary()
$aAVI = _CreateAvi(@ScriptDir & "\test.avi", 15, $aPos[2], $aPos[3])
If @error Then close()
$t = TimerInit()
[/autoit] [autoit][/autoit] [autoit]Do
$hBmp = _ScreenCapture_CaptureWnd("", $hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
_AddHBitmapToAvi($aAVI, $hBmp)
_WinAPI_DeleteObject($hBmp)
If TimerDiff($t) > $rec_duration Then close()
Until False
Func close()
_GDIPlus_Shutdown()
_CloseAvi($aAVI)
_StopAviLibrary()
Exit
EndFunc ;==>close
#endregion
Es gibt unmengen an Quellen, aber irgendwie bekomme ich das in AutoIt nicht hin, z.B. BMPs to Avi.
Hat jemand noch eine Idee?
Gruß,
UEZ