1 (изменено: KEKS1K, 2022-08-25 21:53:07)

Тема: AHK: Не получается сделать сравнение

У меня не получается сделать так, чтобы после скриншота он закидался в разные папки.
То-есть если скриншот был сделан до 21:00,то в одну папку, а если после 21:00,то в другую.
Вот сам код:


F1::
Gosub skr
return

skr:
time := A_NowUTC
time += 3, H
FormatTime, vDate,% time, HH_mm_ss ; 
vDate := "\" vDate ".png" ; 
msgbox, % vDate ; 
screenshot:=(A_ScriptDir . vDate) ; 
SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, screenshot)

SaveScreenshotToFile(x, y, w, h, filePath)
{
	hBitmap := GetHBitmapFromScreen(x, y, w, h)
	gdip := new GDIplus
	pBitmap := gdip.BitmapFromHBitmap(hBitmap)
	DllCall("DeleteObject", Ptr, hBitmap)
	gdip.SaveBitmapToFile(pBitmap, filePath)
	gdip.DisposeImage(pBitmap)
}

GetHBitmapFromScreen(x, y, w, h)
{
	hDC := DllCall("GetDC", Ptr, 0, Ptr)
	hBM := DllCall("CreateCompatibleBitmap", Ptr, hDC, Int, w, Int, h, Ptr)
	pDC := DllCall("CreateCompatibleDC", Ptr, hDC, Ptr)
	oBM := DllCall("SelectObject", Ptr, pDC, Ptr, hBM, Ptr)
	DllCall("BitBlt", Ptr, pDC, Int, 0, Int, 0, Int, w, Int, h, Ptr, hDC, Int, x, Int, y, UInt, 0x00CC0020)
	DllCall("SelectObject", Ptr, pDC, Ptr, oBM)
	DllCall("DeleteDC", Ptr, pDC)
	DllCall("ReleaseDC", Ptr, 0, Ptr, hDC)
	Return hBM
}

class GDIplus   {
	__New()  {
		if !DllCall("GetModuleHandle", Str, "gdiplus", Ptr)
			DllCall("LoadLibrary", Str, "gdiplus")
		VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
		DllCall("gdiplus\GdiplusStartup", PtrP, pToken, Ptr, &si, Ptr, 0)
		this.token := pToken
	}
	__Delete()  {
		DllCall("gdiplus\GdiplusShutdown", Ptr, this.token)
		if hModule := DllCall("GetModuleHandle", Str, "gdiplus", Ptr)
			DllCall("FreeLibrary", Ptr, hModule)
	}
	BitmapFromHBitmap(hBitmap, Palette := 0)  {
		DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", Ptr, hBitmap, Ptr, Palette, PtrP, pBitmap)
		return pBitmap
	}
	SaveBitmapToFile(pBitmap, sOutput, Quality=75)  {
		SplitPath, sOutput,,, Extension
		if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
			return -1
		DllCall("gdiplus\GdipGetImageEncodersSize", UIntP, nCount, UIntP, nSize)
		VarSetCapacity(ci, nSize)
		DllCall("gdiplus\GdipGetImageEncoders", UInt, nCount, UInt, nSize, Ptr, &ci)
		if !(nCount && nSize)
			return -2
		Loop, % nCount  {
			sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
			if !InStr(sString, "*." Extension)
				continue
			pCodec := &ci+idx
			break
		}
		if !pCodec
			return -3
		if RegExMatch(Extension, "i)^J(PG|PEG|PE|FIF)$") && Quality != 75  {
			DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, UintP, nSize)
			VarSetCapacity(EncoderParameters, nSize, 0)
			DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, UInt, nSize, Ptr, &EncoderParameters)
			Loop, % NumGet(EncoderParameters, "UInt")  {
				elem := (24+A_PtrSize)*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
				if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6)  {
					p := elem+&EncoderParameters-pad-4
					NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt")
					break
				}
			}
		}
		if A_IsUnicode
			pOutput := &sOutput
		else  {
			VarSetCapacity(wOutput, StrPut(sOutput, "UTF-16")*2, 0)
			StrPut(sOutput, &wOutput, "UTF-16")
			pOutput := &wOutput
		}
		E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, pOutput, Ptr, pCodec, UInt, p ? p : 0)
		return E ? -5 : 0
	}
	DisposeImage(pBitmap)  {
		return DllCall("gdiplus\GdipDisposeImage", Ptr, pBitmap)
	}
}
Return

2

Re: AHK: Не получается сделать сравнение

Выделите из переменной time время в часах, затем сравните с 21.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: KEKS1K, 2022-08-25 22:55:14)

Re: AHK: Не получается сделать сравнение

teadrinker
Можете в виде кода показать пожалуйста?
А то я кодер начинающий, и вообще не понимаю как это реализовать.
Даже примерно незнаю!

4

Re: AHK: Не получается сделать сравнение

KEKS1K пишет:

я кодер начинающий

Ну вот и начинайте! Чтобы узнать, как устроена переменная time, её можно отобразить в MsgBox:

...
time += 3, H
MsgBox, % time

Сразу станет понятно, где там часы. Их можно выделить с помощью SubStr() (читайте справку).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Clannad5, 2022-08-26 04:45:58)

Re: AHK: Не получается сделать сравнение

KEKS1K
Обратите внимание, что папки нужно заранее создать, либо делайте это вручную, либо проверяйте папку на наличии нужных директив и если их нет - создавайте соответствующей командой.



F1::
Gosub skr
return

skr:
time := A_NowUTC
time += 3, H
FormatTime, vDate,% time, HH_mm_ss ; 
VHH := SubStr(vDate, 1, 2) ; Извлекаем из первой позиции (это у нас H) два символа (это у нас HH получается)
VMM := SubStr(vDate, 4, 2) ;  Извлекаем из четвертой позиции (это у нас m) два символа (это у нас mm получается)
if (VHH = 21) and (VMM > 00) or (VHH > 21) ; Если равно 21 час и больше 00 минут ИЛИ больше 21 часа (например 22 часа)
Dira := "\Dir21" ; то засунем в папку Dir21
else
Dira := "\Dir00" ; Если не подходит условия, то засунем скриншоты сюда
vDate := "\" vDate ".png" ; 
screenshot:=(A_ScriptDir . Dira . vDate) ; 
msgbox, %screenshot%
SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, screenshot)

SaveScreenshotToFile(x, y, w, h, filePath)
{
	hBitmap := GetHBitmapFromScreen(x, y, w, h)
	gdip := new GDIplus
	pBitmap := gdip.BitmapFromHBitmap(hBitmap)
	DllCall("DeleteObject", Ptr, hBitmap)
	gdip.SaveBitmapToFile(pBitmap, filePath)
	gdip.DisposeImage(pBitmap)
}

GetHBitmapFromScreen(x, y, w, h)
{
	hDC := DllCall("GetDC", Ptr, 0, Ptr)
	hBM := DllCall("CreateCompatibleBitmap", Ptr, hDC, Int, w, Int, h, Ptr)
	pDC := DllCall("CreateCompatibleDC", Ptr, hDC, Ptr)
	oBM := DllCall("SelectObject", Ptr, pDC, Ptr, hBM, Ptr)
	DllCall("BitBlt", Ptr, pDC, Int, 0, Int, 0, Int, w, Int, h, Ptr, hDC, Int, x, Int, y, UInt, 0x00CC0020)
	DllCall("SelectObject", Ptr, pDC, Ptr, oBM)
	DllCall("DeleteDC", Ptr, pDC)
	DllCall("ReleaseDC", Ptr, 0, Ptr, hDC)
	Return hBM
}

class GDIplus   {
	__New()  {
		if !DllCall("GetModuleHandle", Str, "gdiplus", Ptr)
			DllCall("LoadLibrary", Str, "gdiplus")
		VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
		DllCall("gdiplus\GdiplusStartup", PtrP, pToken, Ptr, &si, Ptr, 0)
		this.token := pToken
	}
	__Delete()  {
		DllCall("gdiplus\GdiplusShutdown", Ptr, this.token)
		if hModule := DllCall("GetModuleHandle", Str, "gdiplus", Ptr)
			DllCall("FreeLibrary", Ptr, hModule)
	}
	BitmapFromHBitmap(hBitmap, Palette := 0)  {
		DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", Ptr, hBitmap, Ptr, Palette, PtrP, pBitmap)
		return pBitmap
	}
	SaveBitmapToFile(pBitmap, sOutput, Quality=75)  {
		SplitPath, sOutput,,, Extension
		if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
			return -1
		DllCall("gdiplus\GdipGetImageEncodersSize", UIntP, nCount, UIntP, nSize)
		VarSetCapacity(ci, nSize)
		DllCall("gdiplus\GdipGetImageEncoders", UInt, nCount, UInt, nSize, Ptr, &ci)
		if !(nCount && nSize)
			return -2
		Loop, % nCount  {
			sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
			if !InStr(sString, "*." Extension)
				continue
			pCodec := &ci+idx
			break
		}
		if !pCodec
			return -3
		if RegExMatch(Extension, "i)^J(PG|PEG|PE|FIF)$") && Quality != 75  {
			DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, UintP, nSize)
			VarSetCapacity(EncoderParameters, nSize, 0)
			DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, UInt, nSize, Ptr, &EncoderParameters)
			Loop, % NumGet(EncoderParameters, "UInt")  {
				elem := (24+A_PtrSize)*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
				if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6)  {
					p := elem+&EncoderParameters-pad-4
					NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt")
					break
				}
			}
		}
		if A_IsUnicode
			pOutput := &sOutput
		else  {
			VarSetCapacity(wOutput, StrPut(sOutput, "UTF-16")*2, 0)
			StrPut(sOutput, &wOutput, "UTF-16")
			pOutput := &wOutput
		}
		E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, pOutput, Ptr, pCodec, UInt, p ? p : 0)
		return E ? -5 : 0
	}
	DisposeImage(pBitmap)  {
		return DllCall("gdiplus\GdipDisposeImage", Ptr, pBitmap)
	}
}
Return

Это своеобразный пример из примерно того, что вы хотели.
Если головой подумаете, сможете довести до идеала.

6

Re: AHK: Не получается сделать сравнение

Clannad5 Огромное вам спасибо!