Code: Select all
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
minW:= 36, minH:= 36
file := "test.mp4"
video_codec := "H264"
video_bitrate := 2000000
video_fps := 25
duration := 2
hardware_encoding := false
;audiodevice := "CABLE Output (VB-Audio Virtual Cable)"
;audiodevice := "Microphone (Realtek High Definition Audio)"
capture_cursor := true
ShowAllAudioDevicesNames := true
CoordMode, Mouse, Screen
CoordMode, ToolTip, Screen
Loop, 6
GroupAdd, CrossAndFrame, outline%A_Index%
SoundBeep, 400
SoundBeep, 800
Return
F2::
if CrossOrFrame || !WinExist("ahk_group CrossAndFrame")
Return
ToolTip, Recording started!, % nx1, % ny1
Sleep, 300
ToolTip
;Gosub Esc
setbatchlines -1
IDXGIFactory := CreateDXGIFactory()
if !IDXGIFactory
{
MsgBox, 16, Error, Create IDXGIFactory failed.
ExitApp
}
loop
{
IDXGIFactory_EnumAdapters(IDXGIFactory, A_Index-1, IDXGIAdapter)
loop
{
hr := IDXGIAdapter_EnumOutputs(IDXGIAdapter, A_Index-1, IDXGIOutput)
if (hr = "DXGI_ERROR_NOT_FOUND")
break
VarSetCapacity(DXGI_OUTPUT_DESC, 88+A_PtrSize, 0)
IDXGIOutput_GetDesc(IDXGIOutput, &DXGI_OUTPUT_DESC)
Width := NumGet(DXGI_OUTPUT_DESC, 72, "int")
Height := NumGet(DXGI_OUTPUT_DESC, 76, "int")
AttachedToDesktop := NumGet(DXGI_OUTPUT_DESC, 80, "int")
if (AttachedToDesktop = 1)
break 2
}
}
if (AttachedToDesktop != 1)
{
MsgBox, 16, Error, No adapter attached to desktop
ExitApp
}
D3D11CreateDevice(IDXGIAdapter, D3D_DRIVER_TYPE_UNKNOWN := 0, 0, 0, 0, 0, D3D11_SDK_VERSION := 7, d3d_device, 0, d3d_context)
IDXGIOutput1 := IDXGIOutput1_Query(IDXGIOutput)
IDXGIOutput1_DuplicateOutput(IDXGIOutput1, d3d_device, Duplication)
VarSetCapacity(DXGI_OUTDUPL_DESC, 36, 0)
IDXGIOutputDuplication_GetDesc(Duplication, &DXGI_OUTDUPL_DESC)
DesktopImageInSystemMemory := NumGet(DXGI_OUTDUPL_DESC, 32, "uint")
sleep 50 ; As I understand - need some sleep for successful connecting to IDXGIOutputDuplication interface
VarSetCapacity(D3D11_TEXTURE2D_DESC, 44, 0)
NumPut(width, D3D11_TEXTURE2D_DESC, 0, "uint") ; Width
NumPut(height, D3D11_TEXTURE2D_DESC, 4, "uint") ; Height
NumPut(1, D3D11_TEXTURE2D_DESC, 8, "uint") ; MipLevels
NumPut(1, D3D11_TEXTURE2D_DESC, 12, "uint") ; ArraySize
NumPut(DXGI_FORMAT_B8G8R8A8_UNORM := 87, D3D11_TEXTURE2D_DESC, 16, "uint") ; Format
NumPut(1, D3D11_TEXTURE2D_DESC, 20, "uint") ; SampleDescCount
NumPut(0, D3D11_TEXTURE2D_DESC, 24, "uint") ; SampleDescQuality
NumPut(D3D11_USAGE_STAGING := 3, D3D11_TEXTURE2D_DESC, 28, "uint") ; Usage
NumPut(0, D3D11_TEXTURE2D_DESC, 32, "uint") ; BindFlags
NumPut(D3D11_CPU_ACCESS_READ := 0x20000 | D3D11_CPU_ACCESS_WRITE := 0x10000, D3D11_TEXTURE2D_DESC, 36, "uint") ; CPUAccessFlags
NumPut(0, D3D11_TEXTURE2D_DESC, 40, "uint") ; MiscFlags
ID3D11Device_CreateTexture2D(d3d_device, &D3D11_TEXTURE2D_DESC, 0, staging_tex)
if (capture_cursor = true)
{
VarSetCapacity(D3D11_TEXTURE2D_DESC, 44, 0)
NumPut(width, D3D11_TEXTURE2D_DESC, 0, "uint") ; Width
NumPut(height, D3D11_TEXTURE2D_DESC, 4, "uint") ; Height
NumPut(1, D3D11_TEXTURE2D_DESC, 8, "uint") ; MipLevels
NumPut(1, D3D11_TEXTURE2D_DESC, 12, "uint") ; ArraySize
NumPut(DXGI_FORMAT_B8G8R8A8_UNORM := 87, D3D11_TEXTURE2D_DESC, 16, "uint") ; Format
NumPut(1, D3D11_TEXTURE2D_DESC, 20, "uint") ; SampleDescCount
NumPut(0, D3D11_TEXTURE2D_DESC, 24, "uint") ; SampleDescQuality
NumPut(D3D11_USAGE_DEFAULT := 0, D3D11_TEXTURE2D_DESC, 28, "uint") ; Usage
NumPut(D3D11_BIND_RENDER_TARGET := 0x20, D3D11_TEXTURE2D_DESC, 32, "uint") ; BindFlags
NumPut(0, D3D11_TEXTURE2D_DESC, 36, "uint") ; CPUAccessFlags
NumPut(D3D11_RESOURCE_MISC_GDI_COMPATIBLE := 0x200, D3D11_TEXTURE2D_DESC, 40, "uint") ; MiscFlags
ID3D11Device_CreateTexture2D(d3d_device, &D3D11_TEXTURE2D_DESC, 0, gdi_tex)
}
if (x1 != "")
{
width := x2-x1
height := y2-y1
VarSetCapacity(D3D11_BOX, 24, 0)
NumPut(x1, D3D11_BOX, 0, "uint") ; left
NumPut(y1, D3D11_BOX, 4, "uint") ; top
NumPut(0, D3D11_BOX, 8, "uint") ; front
NumPut(x2, D3D11_BOX, 12, "uint") ; right
NumPut(y2, D3D11_BOX, 16, "uint") ; bottom
NumPut(1, D3D11_BOX, 20, "uint") ; back
}
LOAD_DLL_Mfplat_Mfreadwrite()
MFStartup(version := 2, MFSTARTUP_FULL := 0)
MFCreateAttributes(pMFAttributes, 100)
IMFAttributes_SetGUID(pMFAttributes, MF_GUID(GUID, "MF_TRANSCODE_CONTAINERTYPE"), MF_GUID(GUID1, "MFTranscodeContainerType_MPEG4"))
if hardware_encoding
{
IMFAttributes_SetUINT32(pMFAttributes, MF_GUID(GUID, "MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS"), true)
IMFAttributes_SetUINT32(pMFAttributes, MF_GUID(GUID, "MF_SINK_WRITER_DISABLE_THROTTLING"), true)
IMFAttributes_SetUINT32(pMFAttributes, MF_GUID(GUID, "MF_LOW_LATENCY"), true)
}
MFCreateSinkWriterFromURL(file, 0, pMFAttributes, pSinkWriter)
loop 2 ; 1 - input, 2 - output
{
MFCreateMediaType(pMediaType%A_Index%)
IMFAttributes_SetGUID(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_MAJOR_TYPE"), MF_GUID(GUID1, "MFMediaType_Video"))
if (A_Index = 1)
IMFAttributes_SetGUID(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_SUBTYPE"), MF_GUID(GUID1, "MFVideoFormat_ARGB32"))
else
{
IMFAttributes_SetGUID(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_SUBTYPE"), MF_GUID(GUID1, "MFVideoFormat_" video_codec))
IMFAttributes_SetUINT32(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_AVG_BITRATE"), video_bitrate)
}
IMFAttributes_SetUINT32(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_INTERLACE_MODE"), MFVideoInterlace_Progressive := 2)
IMFAttributes_SetUINT64(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_FRAME_SIZE"), (width<<32)|height)
IMFAttributes_SetUINT64(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_FRAME_RATE"), (video_fps<<32)|1)
IMFAttributes_SetUINT64(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_PIXEL_ASPECT_RATIO"), (1<<32)|1)
}
IMFSinkWriter_AddStream(pSinkWriter, pMediaType2, streamIndex)
IMFSinkWriter_SetInputMediaType(pSinkWriter, streamIndex, pMediaType1, 0)
IMFSinkWriter_BeginWriting(pSinkWriter)
Release(pMediaType1)
Release(pMediaType2)
Release(pMFAttributes)
pMediaType1 := pMediaType2 := pMFAttributes := ""
if audiodevice or ShowAllAudioDevicesNames
{
MFCreateAttributes(pMFAttributes, 1)
IMFAttributes_SetGUID(pMFAttributes, MF_GUID(GUID, "MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE"), MF_GUID(GUID1, "MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID"))
MFEnumDeviceSources(pMFAttributes, pppSourceActivate, pcSourceActivate)
Loop % pcSourceActivate
{
IMFActivate := NumGet(pppSourceActivate + (A_Index - 1)*A_PtrSize)
devicename := IMFActivate_GetAllocatedString(IMFActivate, MF_GUID(GUID, "MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME"))
if ShowAllAudioDevicesNames
devicenames .= devicename "`n"
if (devicename = audiodevice)
IMFActivate_ActivateObject(IMFActivate, IMFMediaSource := "{279a808d-aec7-40c8-9c6b-a6b492c78a66}", MediaSource)
Release(IMFActivate)
IMFActivate := ""
}
DllCall("ole32\CoTaskMemFree", "ptr", pppSourceActivate)
if ShowAllAudioDevicesNames
{
msgbox % clipboard := devicenames
ExitApp
}
if (MediaSource = "")
{
msgbox Canot find audio device - "%audiodevice%"
ExitApp
}
MFCreateSourceReaderFromMediaSource(MediaSource, pMFAttributes, SourceReader)
Release(pMFAttributes)
pMFAttributes := ""
loop 2 ; 1 - input, 2 - output
{
MFCreateMediaType(pMediaType%A_Index%)
IMFAttributes_SetGUID(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_MAJOR_TYPE"), MF_GUID(GUID1, "MFMediaType_Audio"))
if (A_Index = 1)
IMFAttributes_SetGUID(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_SUBTYPE"), MF_GUID(GUID1, "MFAudioFormat_PCM"))
else
{
IMFAttributes_SetGUID(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_SUBTYPE"), MF_GUID(GUID1, "MFAudioFormat_AAC"))
IMFAttributes_SetUINT32(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_AUDIO_AVG_BYTES_PER_SECOND"), 20000)
}
IMFAttributes_SetUINT32(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_AUDIO_BITS_PER_SAMPLE"), 16)
IMFAttributes_SetUINT32(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_AUDIO_SAMPLES_PER_SECOND"), 44100)
IMFAttributes_SetUINT32(pMediaType%A_Index%, MF_GUID(GUID, "MF_MT_AUDIO_NUM_CHANNELS"), 2)
}
IMFSinkWriter_AddStream(pSinkWriter, pMediaType2, audioStreamIndex)
IMFSinkWriter_SetInputMediaType(pSinkWriter, audioStreamIndex, pMediaType1, 0)
/*
; functions for getting source values
IMFSourceReader_GetNativeMediaType(SourceReader, MF_SOURCE_READER_FIRST_AUDIO_STREAM := 0xFFFFFFFD, 0, ppMediaType)
IMFMediaType_GetGUID(ppMediaType, MF_GUID(GUID, "MF_MT_SUBTYPE"), pguidValue)
msgbox % numget(pguidValue, 0, "int")
IMFMediaType_GetUINT32(ppMediaType, MF_GUID(GUID, "MF_MT_AUDIO_BITS_PER_SAMPLE"), punValue)
msgbox % punValue
Release(ppMediaType)
ppMediaType := ""
*/
IMFSourceReader_SetCurrentMediaType(SourceReader, MF_SOURCE_READER_FIRST_AUDIO_STREAM := 0xFFFFFFFD, 0, pMediaType1)
Release(pMediaType1)
Release(pMediaType2)
pMediaType1 := pMediaType2 := ""
}
IMFSinkWriter_BeginWriting(pSinkWriter)
video_frame_duration := 10000000/video_fps
video_frame_count := duration*video_fps
cbWidth := 4 * width
cbBuffer := cbWidth * height
rtStart := 0
fps := 1000/video_fps
loop % video_frame_count
{
if (A_Index = 1)
timeElapsed := A_TickCount
else
{
loop
{
if (A_TickCount - timeElapsed >= fps)
{
timeElapsed+=fps
break
}
sleep 10
}
}
VarSetCapacity(DXGI_OUTDUPL_FRAME_INFO, 48, 0)
AcquireNextFrame := IDXGIOutputDuplication_AcquireNextFrame(Duplication, 0, &DXGI_OUTDUPL_FRAME_INFO, desktop_resource)
if (AcquireNextFrame != "DXGI_ERROR_WAIT_TIMEOUT")
{
if (A_Index != 1)
{
Release(pSample)
Release(pBuffer)
pSample := pBuffer := ""
}
tex := ID3D11Texture2D_Query(desktop_resource)
if (capture_cursor = true)
{
VarSetCapacity(CURSORINFO, cbSize := 16 + A_PtrSize, 0)
NumPut(cbSize, CURSORINFO, 0, "uint")
}
if (capture_cursor = true) and DllCall("GetCursorInfo", "ptr", &CURSORINFO) and (NumGet(CURSORINFO, 4, "uint") = 1) ; CURSOR_SHOWING
{
hCursor := NumGet(CURSORINFO, 8)
xCursor := NumGet(CURSORINFO, 8 + A_PtrSize, "int")
yCursor := NumGet(CURSORINFO, 12 + A_PtrSize, "int")
ID3D11DeviceContext_CopyResource(d3d_context, gdi_tex, tex)
gdi_Surface := IDXGISurface1_Query(gdi_tex)
IDXGISurface1_GetDC(gdi_Surface, 0, hdc)
DllCall("DrawIconEx", "ptr", hdc, "int", xCursor, "int", yCursor, "ptr", hCursor, "int", 0, "int", 0, "uint", 0, "ptr", 0, "uint", DI_NORMAL := 0x0003 | DI_DEFAULTSIZE := 0x0008)
IDXGISurface1_ReleaseDC(gdi_Surface, 0)
if (x1 = "")
ID3D11DeviceContext_CopyResource(d3d_context, staging_tex, gdi_tex)
else
ID3D11DeviceContext_CopySubresourceRegion(d3d_context, staging_tex, 0, 0, 0, 0, gdi_tex, 0, &D3D11_BOX) ; set region
ObjRelease(gdi_Surface)
gdi_Surface := ""
}
else
{
if (x1 = "")
ID3D11DeviceContext_CopyResource(d3d_context, staging_tex, tex)
else
ID3D11DeviceContext_CopySubresourceRegion(d3d_context, staging_tex, 0, 0, 0, 0, tex, 0, &D3D11_BOX) ; set region
}
VarSetCapacity(D3D11_MAPPED_SUBRESOURCE, 8+A_PtrSize, 0)
ID3D11DeviceContext_Map(d3d_context, staging_tex, 0, D3D11_MAP_READ := 1, 0, &D3D11_MAPPED_SUBRESOURCE)
pBits := NumGet(D3D11_MAPPED_SUBRESOURCE, 0, "ptr")
pitch := NumGet(D3D11_MAPPED_SUBRESOURCE, A_PtrSize, "uint")
MFCreateMemoryBuffer(cbBuffer, pBuffer)
IMFMediaBuffer_Lock(pBuffer, pData, 0, 0)
if hardware_encoding
MFCopyImage(pData, cbWidth, pBits, pitch, cbWidth, height)
else
MFCopyImage(pData, cbWidth, pBits+(height-1)*pitch, pitch*-1, cbWidth, height)
IMFMediaBuffer_Unlock(pBuffer)
IMFMediaBuffer_SetCurrentLength(pBuffer, cbBuffer)
MFCreateSample(pSample)
IMFSample_AddBuffer(pSample, pBuffer)
}
IMFSample_SetSampleTime(pSample, rtStart)
IMFSample_SetSampleDuration(pSample, video_frame_duration)
IMFSinkWriter_WriteSample(pSinkWriter, streamIndex, pSample)
if (AcquireNextFrame != "DXGI_ERROR_WAIT_TIMEOUT")
{
ID3D11DeviceContext_Unmap(d3d_context, staging_tex, 0)
ObjRelease(tex)
Release(desktop_resource)
tex := desktop_resource := ""
IDXGIOutputDuplication_ReleaseFrame(duplication)
}
if audiodevice
{
IMFSourceReader_ReadSample(SourceReader, MF_SOURCE_READER_FIRST_AUDIO_STREAM := 0xFFFFFFFD, 0, ActualStreamIndex, StreamFlags, Timestamp, pSampleAudio)
if (pSampleAudio != 0)
{
IMFSample_GetSampleDuration(pSampleAudio, SampleDuration)
IMFSample_SetSampleTime(pSampleAudio, rtStartAudio)
IMFSample_SetSampleDuration(pSampleAudio, video_frame_duration)
IMFSinkWriter_WriteSample(pSinkWriter, audioStreamIndex, pSampleAudio)
Release(pSampleAudio)
pSampleAudio := ""
rtStartAudio += SampleDuration
}
else if (StreamFlags & MF_SOURCE_READERF_STREAMTICK := 256)
IMFSinkWriter_SendStreamTick(pSinkWriter, audioStreamIndex, rtStartAudio)
}
rtStart += video_frame_duration
}
IMFSinkWriter_Finalize(pSinkWriter)
if audiodevice
{
Release(SourceReader)
Release(MediaSource)
SourceReader := MediaSource := ""
}
Release(pSample)
Release(pBuffer)
Release(pSinkWriter)
Release(staging_tex)
Release(d3d_device)
Release(d3d_context)
Release(duplication)
Release(IDXGIAdapter)
Release(IDXGIOutput)
ObjRelease(IDXGIOutput1)
Release(IDXGIFactory)
if (capture_cursor = true)
{
Release(gdi_tex)
gdi_tex := ""
}
pSample := pBuffer := pSinkWriter := staging_tex := d3d_device := d3d_context := duplication := IDXGIAdapter := IDXGIOutput := IDXGIOutput1 := IDXGIFactory := ""
MFShutdown()
Gosub, Esc
;msgbox,,, done, .75
run % file
;ExitApp
Return
CreateDXGIFactory()
{
if !DllCall("GetModuleHandle","str","DXGI")
DllCall("LoadLibrary","str","DXGI")
if !DllCall("GetModuleHandle","str","D3D11")
DllCall("LoadLibrary","str","D3D11")
GUID(riid, "{7b7166ec-21c7-44ae-b21a-c9ae321ae369}")
hr := DllCall("DXGI\CreateDXGIFactory1", "ptr", &riid, "ptr*", ppFactory)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
return ppFactory
}
IDXGIFactory_EnumAdapters(this, Adapter, ByRef ppAdapter)
{
hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "uint", Adapter, "ptr*", ppAdapter)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGIAdapter_EnumOutputs(this, Output, ByRef ppOutput)
{
hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "uint", Output, "ptr*", ppOutput)
if hr or ErrorLevel
{
if (hr&=0xFFFFFFFF) = 0x887A0002 ; DXGI_ERROR_NOT_FOUND
return "DXGI_ERROR_NOT_FOUND"
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
}
IDXGIAdapter_GetDesc(this, pDesc)
{
hr := DllCall(NumGet(NumGet(this+0)+8*A_PtrSize), "ptr", this, "ptr", pDesc)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGIOutput_GetDesc(this, pDesc)
{
hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "ptr", pDesc)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGIOutputDuplication_GetDesc(this, pDesc)
{
DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "ptr", pDesc)
if ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGIOutputDuplication_AcquireNextFrame(this, TimeoutInMilliseconds, pFrameInfo, ByRef ppDesktopResource)
{
hr := DllCall(NumGet(NumGet(this+0)+8*A_PtrSize), "ptr", this, "uint", TimeoutInMilliseconds, "ptr", pFrameInfo, "ptr*", ppDesktopResource)
if hr or ErrorLevel
{
if (hr&=0xFFFFFFFF) = 0x887A0027 ; DXGI_ERROR_WAIT_TIMEOUT
return "DXGI_ERROR_WAIT_TIMEOUT"
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
}
D3D11CreateDevice(pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, ByRef ppDevice, ByRef pFeatureLevel, ByRef ppImmediateContext)
{
hr := DllCall("D3D11\D3D11CreateDevice", "ptr", pAdapter, "int", DriverType, "ptr", Software, "uint", Flags, "ptr", pFeatureLevels, "uint", FeatureLevels, "uint", SDKVersion, "ptr*", ppDevice, "ptr*", pFeatureLevel, "ptr*", ppImmediateContext)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
ID3D11Device_CreateTexture2D(this, pDesc, pInitialData, ByRef ppTexture2D)
{
hr := DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this, "ptr", pDesc, "ptr", pInitialData, "ptr*", ppTexture2D)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGIOutputDuplication_MapDesktopSurface(this, pLockedRect)
{
hr := DllCall(NumGet(NumGet(this+0)+12*A_PtrSize), "ptr", this, "ptr", pLockedRect)
if hr or ErrorLevel
{
if (hr&=0xFFFFFFFF) = 0x887A0004 ; DXGI_ERROR_UNSUPPORTED
return "DXGI_ERROR_UNSUPPORTED"
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
}
IDXGIOutputDuplication_UnMapDesktopSurface(this)
{
hr := DllCall(NumGet(NumGet(this+0)+13*A_PtrSize), "ptr", this)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGIOutputDuplication_ReleaseFrame(this)
{
hr := DllCall(NumGet(NumGet(this+0)+14*A_PtrSize), "ptr", this)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGIOutput1_DuplicateOutput(this, pDevice, ByRef ppOutputDuplication)
{
hr := DllCall(NumGet(NumGet(this+0)+22*A_PtrSize), "ptr", this, "ptr", pDevice, "ptr*", ppOutputDuplication)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGISurface1_GetDC(this, Discard, ByRef phdc)
{
hr := DllCall(NumGet(NumGet(this+0)+11*A_PtrSize), "ptr", this, "int", Discard, "ptr*", phdc)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGISurface1_ReleaseDC(this, pDirtyRect)
{
hr := DllCall(NumGet(NumGet(this+0)+12*A_PtrSize), "ptr", this, "ptr", pDirtyRect)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IDXGIOutput1_Query(IDXGIOutput)
{
hr := ComObjQuery(IDXGIOutput, "{00cddea8-939b-4b83-a340-a685226666cc}")
if !hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
return hr
}
ID3D11Texture2D_Query(desktop_resource)
{
hr := ComObjQuery(desktop_resource, "{6f15aaf2-d208-4e89-9ab4-489535d34f9c}")
if !hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
return hr
}
IDXGISurface1_Query(Texture2D)
{
hr := ComObjQuery(Texture2D, "{4AE63092-6327-4c1b-80AE-BFE12EA32B86}")
if !hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
return hr
}
ID3D11DeviceContext_CopyResource(this, pDstResource, pSrcResource)
{
hr := DllCall(NumGet(NumGet(this+0)+47*A_PtrSize), "ptr", this, "ptr", pDstResource, "ptr", pSrcResource)
if ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
ID3D11DeviceContext_CopySubresourceRegion(this, pDstResource, DstSubresource, DstX, DstY, DstZ, pSrcResource, SrcSubresource, pSrcBox)
{
hr := DllCall(NumGet(NumGet(this+0)+46*A_PtrSize), "ptr", this, "ptr", pDstResource, "uint", DstSubresource, "uint", DstX, "uint", DstY, "uint", DstZ, "ptr", pSrcResource, "uint", SrcSubresource, "ptr", pSrcBox)
if ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
ID3D11DeviceContext_Map(this, pResource, Subresource, MapType, MapFlags, pMappedResource)
{
hr := DllCall(NumGet(NumGet(this+0)+14*A_PtrSize), "ptr", this, "ptr", pResource, "uint", Subresource, "uint", MapType, "uint", MapFlags, "ptr", pMappedResource)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
ID3D11DeviceContext_Unmap(this, pResource, Subresource)
{
hr := DllCall(NumGet(NumGet(this+0)+15*A_PtrSize), "ptr", this, "ptr", pResource, "uint", Subresource)
if ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
GUID(ByRef GUID, sGUID)
{
VarSetCapacity(GUID, 16, 0)
return DllCall("ole32\CLSIDFromString", "WStr", sGUID, "Ptr", &GUID) >= 0 ? &GUID : ""
}
LOAD_DLL_Mfplat_Mfreadwrite()
{
if !DllCall("GetModuleHandle","str","Mfplat")
DllCall("LoadLibrary","Str", "Mfplat.dll", "ptr")
if !DllCall("GetModuleHandle","str","Mfreadwrite")
DllCall("LoadLibrary","Str", "Mfreadwrite.dll", "ptr")
}
MFStartup(version, dwFlags)
{
hr := DllCall("Mfplat.dll\MFStartup", "uint", version, "uint", dwFlags)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MFShutdown()
{
hr := DllCall("Mfplat.dll\MFShutdown")
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MFCreateSinkWriterFromURL(pwszOutputURL, pByteStream, pAttributes, ByRef ppSinkWriter)
{
hr := DllCall("Mfreadwrite.dll\MFCreateSinkWriterFromURL", "str", pwszOutputURL, "ptr", pByteStream, "ptr", pAttributes, "ptr*", ppSinkWriter)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MFCreateMediaType(ByRef ppMFType)
{
hr := DllCall("Mfplat.dll\MFCreateMediaType", "ptr*", ppMFType)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MFCreateAttributes(ByRef ppMFAttributes, cInitialSize)
{
hr := DllCall("Mfplat.dll\MFCreateAttributes", "ptr*", ppMFAttributes, "uint", cInitialSize)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MFCreateSample(ByRef ppIMFSample)
{
hr := DllCall("Mfplat.dll\MFCreateSample", "ptr*", ppIMFSample)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MFCreateMemoryBuffer(cbMaxLength, ByRef ppBuffer)
{
hr := DllCall("Mfplat.dll\MFCreateMemoryBuffer", "uint", cbMaxLength, "ptr*", ppBuffer)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MFCopyImage(pDest, lDestStride, pSrc, lSrcStride, dwWidthInBytes, dwLines)
{
hr := DllCall("Mfplat.dll\MFCopyImage", "ptr", pDest, "int", lDestStride, "ptr", pSrc, "int", lSrcStride, "uint", dwWidthInBytes, "uint", dwLines)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFAttributes_SetUINT32(this, guidKey, unValue)
{
hr := DllCall(NumGet(NumGet(this+0)+21*A_PtrSize), "ptr", this, "ptr", guidKey, "uint", unValue)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFAttributes_SetUINT64(this, guidKey, unValue)
{
hr := DllCall(NumGet(NumGet(this+0)+22*A_PtrSize), "ptr", this, "ptr", guidKey, "uint64", unValue)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFAttributes_SetGUID(this, guidKey, guidValue)
{
hr := DllCall(NumGet(NumGet(this+0)+24*A_PtrSize), "ptr", this, "ptr", guidKey, "ptr", guidValue)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSinkWriter_AddStream(this, pMediaTypeOut, ByRef pdwStreamIndex)
{
hr := DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "ptr", pMediaTypeOut, "ptr*", pdwStreamIndex)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSinkWriter_SetInputMediaType(this, dwStreamIndex, pInputMediaType, pEncodingParameters)
{
hr := DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", dwStreamIndex, "ptr", pInputMediaType, "ptr", pEncodingParameters)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSinkWriter_BeginWriting(this)
{
hr := DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSinkWriter_WriteSample(this, dwStreamIndex, pSample)
{
hr := DllCall(NumGet(NumGet(this+0)+6*A_PtrSize), "ptr", this, "uint", dwStreamIndex, "ptr", pSample)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSinkWriter_Finalize(this)
{
hr := DllCall(NumGet(NumGet(this+0)+11*A_PtrSize), "ptr", this)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFMediaBuffer_Lock(this, ByRef ppbBuffer, ByRef pcbMaxLength, ByRef pcbCurrentLength)
{
hr := DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "ptr*", ppbBuffer, "uint*", pcbMaxLength, "uint*", pcbCurrentLength)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFMediaBuffer_Unlock(this)
{
hr := DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFMediaBuffer_SetCurrentLength(this, cbCurrentLength)
{
hr := DllCall(NumGet(NumGet(this+0)+6*A_PtrSize), "ptr", this, "uint", cbCurrentLength)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSample_AddBuffer(this, pBuffer)
{
hr := DllCall(NumGet(NumGet(this+0)+42*A_PtrSize), "ptr", this, "ptr", pBuffer)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSample_SetSampleTime(this, hnsSampleTime)
{
hr := DllCall(NumGet(NumGet(this+0)+36*A_PtrSize), "ptr", this, "int64", hnsSampleTime)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSample_SetSampleDuration(this, hnsSampleDuration)
{
hr := DllCall(NumGet(NumGet(this+0)+38*A_PtrSize), "ptr", this, "int64", hnsSampleDuration)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MF_GUID(ByRef GUID, name)
{
static init:=1, _:={}
if init
{
init:=0
_.MF_MT_MAJOR_TYPE := [0x48eba18e, 0xf8c9, 0x4687, 0xbf, 0x11, 0x0a, 0x74, 0xc9, 0xf9, 0x6a, 0x8f]
,_.MF_MT_SUBTYPE := [0xf7e34c9a, 0x42e8, 0x4714, 0xb7, 0x4b, 0xcb, 0x29, 0xd7, 0x2c, 0x35, 0xe5]
,_.MF_MT_AVG_BITRATE := [0x20332624, 0xfb0d, 0x4d9e, 0xbd, 0x0d, 0xcb, 0xf6, 0x78, 0x6c, 0x10, 0x2e]
,_.MF_MT_INTERLACE_MODE := [0xe2724bb8, 0xe676, 0x4806, 0xb4, 0xb2, 0xa8, 0xd6, 0xef, 0xb4, 0x4c, 0xcd]
,_.MF_MT_FRAME_SIZE := [0x1652c33d, 0xd6b2, 0x4012, 0xb8, 0x34, 0x72, 0x03, 0x08, 0x49, 0xa3, 0x7d]
,_.MF_MT_FRAME_RATE := [0xc459a2e8, 0x3d2c, 0x4e44, 0xb1, 0x32, 0xfe, 0xe5, 0x15, 0x6c, 0x7b, 0xb0]
,_.MF_MT_PIXEL_ASPECT_RATIO := [0xc6376a1e, 0x8d0a, 0x4027, 0xbe, 0x45, 0x6d, 0x9a, 0x0a, 0xd3, 0x9b, 0xb6]
,_.MFT_CATEGORY_VIDEO_ENCODER := [0xf79eac7d, 0xe545, 0x4387, 0xbd, 0xee, 0xd6, 0x47, 0xd7, 0xbd, 0xe4, 0x2a]
,_.MF_TRANSCODE_CONTAINERTYPE := [0x150ff23f, 0x4abc, 0x478b, 0xac, 0x4f, 0xe1, 0x91, 0x6f, 0xba, 0x1c, 0xca]
,_.MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS := [0xa634a91c, 0x822b, 0x41b9, 0xa4, 0x94, 0x4d, 0xe4, 0x64, 0x36, 0x12, 0xb0]
,_.MFTranscodeContainerType_MPEG4 := [0xdc6cd05d, 0xb9d0, 0x40ef, 0xbd, 0x35, 0xfa, 0x62, 0x2c, 0x1a, 0xb2, 0x8a]
,_.MF_SINK_WRITER_DISABLE_THROTTLING := [0x08b845d8, 0x2b74, 0x4afe, 0x9d, 0x53, 0xbe, 0x16, 0xd2, 0xd5, 0xae, 0x4f]
,_.MF_LOW_LATENCY := [0x9c27891a, 0xed7a, 0x40e1, 0x88, 0xe8, 0xb2, 0x27, 0x27, 0xa0, 0x24, 0xee]
,_.MFMediaType_Video := [0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71]
,_.MFVideoFormat_H264 := [0x34363248, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71] ; FCC("H264") = 0x34363248
,_.MFVideoFormat_RGB32 := [0x00000016, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71]
,_.MFVideoFormat_ARGB32 := [0x00000015, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71]
}
if _.haskey(name)
{
p := _[name]
VarSetCapacity(GUID,16)
,NumPut(p.1+(p.2<<32)+(p.3<<48),GUID,0,"int64")
,NumPut(p.4+(p.5<<8)+(p.6<<16)+(p.7<<24)+(p.8<<32)+(p.9<<40)+(p.10<<48)+(p.11<<56),GUID,8,"int64")
return &GUID
}
else return name
}
FCC(var)
{
c := StrSplit(var)
msgbox % clipboard := Format("{:#x}",((Asc(c[1])&255)+((Asc(c[2])&255)<<8)+((Asc(c[3])&255)<<16)+((Asc(c[4])&255)<<24)))
}
Release(this)
{
DllCall(NumGet(NumGet(this+0)+2*A_PtrSize), "ptr", this)
if ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
_Error(val)
{
msgbox % val
ExitApp
}
MFEnumDeviceSources(pAttributes, ByRef pppSourceActivate, ByRef pcSourceActivate)
{
hr := DllCall("Mf.dll\MFEnumDeviceSources", "ptr", pAttributes, "ptr*", pppSourceActivate, "uint*", pcSourceActivate)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFActivate_GetAllocatedString(this, guidKey)
{
hr := DllCall(NumGet(NumGet(this+0)+13*A_PtrSize), "ptr", this, "ptr", guidKey, "ptr*", ppwszValue, "uint*", pcchLength)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
AllocatedString := StrGet(ppwszValue, pcchLength, "UTF-16")
DllCall("ole32\CoTaskMemFree", "ptr", ppwszValue)
return AllocatedString
}
IMFActivate_ActivateObject(this, riid, ByRef ppv)
{
GUID(riid, riid)
hr := DllCall(NumGet(NumGet(this+0)+33*A_PtrSize), "ptr", this, "ptr", &riid, "ptr*", ppv)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
MFCreateSourceReaderFromMediaSource(pMediaSource, pAttributes, ByRef ppSourceReader)
{
hr := DllCall("Mfreadwrite.dll\MFCreateSourceReaderFromMediaSource", "ptr", pMediaSource, "ptr", pAttributes, "ptr*", ppSourceReader)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSourceReader_SetCurrentMediaType(this, dwStreamIndex, pdwReserved, pMediaType)
{
hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "uint", dwStreamIndex, "uint", pdwReserved, "ptr", pMediaType)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSourceReader_ReadSample(this, dwStreamIndex, dwControlFlags, ByRef pdwActualStreamIndex, ByRef pdwStreamFlags, ByRef pllTimestamp, ByRef ppSample)
{
hr := DllCall(NumGet(NumGet(this+0)+9*A_PtrSize), "ptr", this, "uint", dwStreamIndex, "uint", dwControlFlags, "uint*", pdwActualStreamIndex, "uint*", pdwStreamFlags, "int64*", pllTimestamp, "ptr*", ppSample)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSample_GetSampleDuration(this, ByRef phnsSampleDuration)
{
hr := DllCall(NumGet(NumGet(this+0)+37*A_PtrSize), "ptr", this, "int64*", phnsSampleDuration)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
IMFSinkWriter_SendStreamTick(this, dwStreamIndex, llTimestamp)
{
hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "uint", dwStreamIndex, "int64", llTimestamp)
if hr or ErrorLevel
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
#Esc::
KeyWait Esc
KeyWait LWin
KeyWait RWin
SoundBeep, 800
SoundBeep, 400
ExitApp
#LButton::
Loop, 6
Gui, % A_Index+93 ": Hide"
Hotkey, Left, DecreaseC, Off
Hotkey, Right, IncreaseC, Off
Hotkey, Right, Right, On
Hotkey, Left, Left, On
Hotkey, Up, Up, On
Hotkey, Down, Down, On
Hotkey, *LButton, *LButton, On
CrossOrFrame:= 1, EnterBox:= ""
if !GuiCreated
Loop, 6 {
Gui, % A_Index+93 ": -Caption +ToolWindow +AlwaysOnTop -DPIScale"
Gui, % A_Index+93 ": Color", % Clr? Clr: Clr:="ff8080"
Gui, % A_Index+93 ": Show", NA h0 w0, outline%A_Index%
}
KeyWait, LButton
;While !GetKeyState("LButton", "P") {
While !GetKeyState("LButton", "P") && CrossOrFrame && !EnterBox {
MouseGetPos, x1, y1
Critical
Gui, 94:Show, % "NA X" 0 " Y" y1 " W" A_ScreenWidth " H" 1, outline1
Gui, 95:Show, % "NA X" x1 " Y" 0 " W" 1 " H" A_ScreenHeight, outline2
Critical, Off
Sleep, 50
}
If EnterBox {
WinWaitNotActive, Enter ahk_class #32770
MouseMove, x1, y1
Goto #LButton
}
if !CrossOrFrame
Return
KeyWait, LButton
Gui, 94:Hide
Gui, 95:Hide
Frame:
EnterBox:= ""
;While !GetKeyState("LButton", "P") {
While !GetKeyState("LButton", "P") && CrossOrFrame && !EnterBox {
MouseGetPos, x2, y2
Gosub, Arrows
Sleep, 50
}
If EnterBox {
WinWaitNotActive, Enter ahk_class #32770
MouseMove, x2, y2
Goto Frame
}
GuiCreated:= 1
if !CrossOrFrame
Return
Hotkey, *LButton, *LButton, Off
x1:= nx1, y1:= ny1, x2:= nx2, y2:= ny2
x2-x1<minW? x2:= x1+minW: "", x2>A_ScreenWidth? (x1-=x2-A_ScreenWidth, x2:= A_ScreenWidth): ""
, y2-y1<minH? y2:= y1+minH: "", y2>A_ScreenHeight? (y1-=y2-A_ScreenHeight, y2:= A_ScreenHeight): ""
Gosub Arrows
x1:= nx1, y1:= ny1, x2:= nx2, y2:= ny2, mod(x2-x1, 2)? x2++: "", mod(y2-y1, 2)? y2++: "", CrossOrFrame:= ""
Return
F4::
KeyWait, F4, T.5
if ErrorLevel {
oldFile:= File
InputBox, newFile, Enter new File,,, 310, 105,,,,, % file
if newFile
FileMove, % file, % newFile
Return
}
If !GuiCreated {
ToolTip, No Frame was created yet!, % A_ScreenWidth//2-200, % A_ScreenHeight//2-20
Sleep, 1000
ToolTip
Return
;Loop, 6 {
;Gui, % A_Index+93 ": -Caption +ToolWindow +AlwaysOnTop -DPIScale"
;Gui, % A_Index+93 ": Color", % Clr? Clr: Clr:="ff8080"
;Gui, % A_Index+93 ": Show", % A_Index<3? "Hide ": "" "NA h0 w0", outline%A_Index%
;GuiCreated:= 1, x1:= y1:= 1, x2:= A_ScreenWidth-1, y2:= A_ScreenHeight-1
;Gosub, Arrows
;}
}
Loop, 4
Gui, % A_Index+95 ": Show", NA
Return
#IfWinActive, Enter ahk_class #32770
*Esc::Send, {Esc}
*Enter::Send, {Enter}
*Tab::Send, {Tab}
~*LButton::Send, {LButton}
#If WinActive("Enter duration ahk_class #32770")
WheelUp::
WheelDown::
;Critical
if (A_TimeSincePriorHotkey < 500 && A_ThisHotkey = A_PriorHotkey)
rNotch<=10? rNotch++: "", (rNotch>10&&rNotch<=20)? rNotch+=3: "", (rNotch>20&&rNotch<=30)? rNotch+=5: ""
else rNotch:=1
ControlGetFocus, Cf, Enter duration ahk_class #32770
if InStr(Cf, "Edit") {
ControlGetText, Ef, % Cf, Enter duration ahk_class #32770
Ef:=(A_ThisHotkey="WheelUp")? Ef+rNotch: Ef-rNotch
ControlSetText % Cf, % ((Ef<0)? 0: Ef), Enter duration ahk_class #32770
}
Return
#IfWinExist, ahk_group CrossAndFrame
*LButton::Return
F3::
KeyWait, F3, T.5
if ErrorLevel
v_bitrate:= 1
EnterBox:= 1
Hotkey, Enter, Enter, Off
Hotkey, Esc, Esc, Off
WinExist("outline1")? (xb:= x1, yb:= y1): (xb:= nx1, yb:= ny1)
if v_bitrate
InputBox, video_bitrate, Enter v_bitrate,,, 210, 105
, % (xb>(rx:=A_ScreenWidth-265)? rx: xb), % (yb>(ry:=A_ScreenHeight-135)? ry: yb),,, % video_bitrate
Else
InputBox, duration, Enter duration,,, 210, 105
, % (xb>(rx:=A_ScreenWidth-265)? rx: xb), % (yb>(ry:=A_ScreenHeight-135)? ry: yb),,, % duration
v_bitrate:= ""
Hotkey, Enter, Enter, On
Hotkey, Esc, Esc, On
Return
F5::
EnterBox:= 1
Hotkey, Enter, Enter, Off
Hotkey, Esc, Esc, Off
WinExist("outline1")? (xb:= x1, yb:= y1): (xb:= nx1, yb:= ny1)
InputBox, file, Enter File,,, 310, 105
, % (xb>(rx:=A_ScreenWidth-390)? rx: xb), % (yb>(ry:=A_ScreenHeight-135)? ry: yb),,, % file
Hotkey, Enter, Enter, On
Hotkey, Esc, Esc, On
Return
F4::
;if WinExist("outline1") || WinExist("outline3") {
if clr=0
loop, 6
Gui, % A_Index+93 ": Color", % Clr:="80ff80"
else if clr=80ff80
loop, 6
Gui, % A_Index+93 ": Color", % Clr:="8080ff"
else if clr=8080ff
loop, 6
Gui, % A_Index+93 ": Color", % Clr:="80ffff"
else if clr=80ffff
loop, 6
Gui, % A_Index+93 ": Color", % Clr:="ff80ff"
else if clr=ff80ff
loop, 6
Gui, % A_Index+93 ": Color", % Clr:="ffff80"
else if clr=ffff80
loop, 6
Gui, % A_Index+93 ": Color", % Clr:="ff8080"
else if clr=ff8080
loop, 6
Gui, % A_Index+93 ": Color", % Clr:="ffffff"
else if clr=ffffff
loop, 6
Gui, % A_Index+93 ": Color", % Clr:="0"
;}
Return
Esc::
RButton::
;Critical, 999
x1:= nx1, y1:= ny1, x2:= nx2, y2:= ny2, mod(x2-x1, 2)? x2++: "", mod(y2-y1, 2)? y2++: "", CrossOrFrame:= ""
Hotkey, Left, DecreaseC, Off
Hotkey, Right, IncreaseC, Off
Hotkey, Right, Right, On
Hotkey, Left, Left, On
Hotkey, Up, Up, On
Hotkey, Down, Down, On
Loop, 6
Gui, % A_Index+93 ": Hide"
;Critical, Off
Return
Left::
If WinExist("outline1")
Return
Coo:= "x1", Co:= "x2"
Hotkey, Left, Left, Off
;Hotkey, Up, Up, Off
;Hotkey, Down, Down, Off
Hotkey, Left, DecreaseC, On
Hotkey, Right, IncreaseC, On
Return
Right::
If WinExist("outline1")
Return
Coo:= "x2", Co:= "x1"
Hotkey, Right, Right, Off
;Hotkey, Up, Up, Off
;Hotkey, Down, Down, Off
Hotkey, Left, DecreaseC, On
Hotkey, Right, IncreaseC, On
Return
Up::
If WinExist("outline1")
Return
Coo:= "y1", Co:= "y2"
Hotkey, Up, Up, Off
;Hotkey, Left, Left, Off
;Hotkey, Right, Right, Off
Hotkey, Up, DecreaseC, On
Hotkey, Down, IncreaseC, On
Return
Down::
If WinExist("outline1")
Return
Coo:= "y2", Co:= "y1"
Hotkey, Down, Down, Off
;Hotkey, Left, Left, Off
;Hotkey, Right, Right, Off
Hotkey, Up, DecreaseC, On
Hotkey, Down, IncreaseC, On
Return
DecreaseC:
Critical, Off
;A_TimeSincePriorHotkey < 500 && A_ThisHotkey = A_PriorHotkey? (rNotch<=10? rNotch++: ""): rNotch:=1
;Sleep, -1
;loop, % rNotch {
if %Coo%-1 < %Co%+(InStr(%Co%, "x")? minW: minH) && InStr(Coo, 2)
Return
%Coo%-=2
Gosub, Arrows
%Coo%:= %Coo%<0? 0: %Coo%, mod(%Coo%-%Co%, 2)? %Coo%++: ""
;}
Return
IncreaseC:
Critical, Off
;A_TimeSincePriorHotkey < 500 && A_ThisHotkey = A_PriorHotkey? (rNotch<=10? rNotch++: ""): rNotch:=1
;Sleep, -1
;loop, % rNotch {
if InStr(Coo, 1) && %Co%-(InStr(%Co%, "x")? minW: minH)<%Coo%+1
Return
%Coo%+=2
Gosub, Arrows
%Coo%:= %Coo%>(cc:=InStr(Coo, "x")? A_ScreenWidth: A_ScreenHeight)? cc: %Coo%, mod(%Coo%-%Co%, 2)? %Coo%--: ""
;}
Return
Enter::
Hotkey, Left, DecreaseC, Off
Hotkey, Up, DecreaseC, Off
Hotkey, Right, IncreaseC, Off
Hotkey, Down, IncreaseC, Off
Hotkey, Left, Left, On
Hotkey, Up, Up, On
Hotkey, Right, Right, On
Hotkey, Down, Down, On
Return
Arrows:
Critical
if (x1<=x2 && y1<=y2) {
nx1:=x1+((x2-x1)>1?1:0), ny1:=y1+((y2-y1)>1?1:0), nx2:=x2-((x2-x1)>1?1:0), ny2:=y2-((y2-y1)>1?1:0)
Gui, 96:Show, % "NA X" x1+0 " Y" y1-4 " W" x2-x1+4 " H" 4
Gui, 97:Show, % "NA X" x2+0 " Y" y1-0 " W" 4 " H" y2-y1+4
Gui, 98:Show, % "NA X" x1-4 " Y" y2-0 " W" x2-x1+4 " H" 4
Gui, 99:Show, % "NA X" x1-4 " Y" y1-4 " W" 4 " H" y2-y1+4
} else if (x1>x2 && y1<=y2) {
nx1:=x2+((x1-x2)>1?1:0), ny1:=y1+((y2-y1)>1?1:0), nx2:=x1-((x1-x2)>1?1:0), ny2:=y2-((y2-y1)>1?1:0)
Gui, 96:Show, % "NA X" x2-4 " Y" y1-4 " W" x1-x2+4 " H" 4
Gui, 97:Show, % "NA X" x1+0 " Y" y1-4 " W" 4 " H" y2-y1+4
Gui, 98:Show, % "NA X" x2-0 " Y" y2-0 " W" x1-x2+4 " H" 4
Gui, 99:Show, % "NA X" x2-4 " Y" y1+0 " W" 4 " H" y2-y1+4
} else if (x1<=x2 && y1>y2) {
nx1:=x1+((x2-x1)>1?1:0), ny1:=y2+((y1-y2)>1?1:0), nx2:=x2-((x2-x1)>1?1:0), ny2:=y1-((y1-y2)>1?1:0)
Gui, 96:Show, % "NA X" x1-4 " Y" y2-4 " W" x2-x1+4 " H" 4
Gui, 97:Show, % "NA X" x2+0 " Y" y2-4 " W" 4 " H" y1-y2+4
Gui, 98:Show, % "NA X" x1-0 " Y" y1+0 " W" x2-x1+4 " H" 4
Gui, 99:Show, % "NA X" x1-4 " Y" y2+0 " W" 4 " H" y1-y2+4
} else if (x1>x2 && y1>y2) {
nx1:=x2+((x1-x2)>1?1:0), ny1:=y2+((y1-y2)>1?1:0), nx2:=x1-((x1-x2)>1?1:0), ny2:=y1-((y1-y2)>1?1:0)
Gui, 96:Show, % "NA X" x2-4 " Y" y2-4 " W" x1-x2+4 " H" 4
Gui, 97:Show, % "NA X" x1+0 " Y" y2-4 " W" 4 " H" y1-y2+4
Gui, 98:Show, % "NA X" x2-0 " Y" y1+0 " W" x1-x2+4 " H" 4
Gui, 99:Show, % "NA X" x2-4 " Y" y2-0 " W" 4 " H" y1-y2+4
}
Critical, Off
Return