<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Сохранить скриншот в файл]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=13256</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=13256&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Сохранить скриншот в файл».]]></description>
		<lastBuildDate>Sun, 19 Jul 2020 15:09:36 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140784#p140784</link>
			<description><![CDATA[<div class="quotebox"><cite>__Михаил__ пишет:</cite><blockquote><p>Вот весь код, должно заработать я полагаю (если есть GDIplus):</p><div class="codebox"><pre><code>4::
Format := &quot;jpg&quot;
Quality := 55
T := % A_ScriptDir &quot;\ScreenS1\&quot;
FileName := T . A_YYYY &quot;.&quot; A_MM &quot;.&quot; A_DD &quot; (&quot; A_Hour &quot;.&quot; A_Min &quot;.&quot; A_Sec &quot;.&quot; A_MSec &quot;).&quot; Format
FileCreateDir, % T
SaveScreenshotToFile(FileName)
Return


SaveScreenshotToFile(filePath, x := 0, y := 0, w := 0, h := 0, Quality := 75)
{
   If (W+H &lt; 2)
   {
    W := A_ScreenWidth
    H := A_ScreenHeight
   }
   hBitmap := GetHBitmapFromScreen(x, y, w, h)
   gdip := new GDIplus
   pBitmap := gdip.BitmapFromHBitmap(hBitmap)
   DllCall(&quot;DeleteObject&quot;, Ptr, hBitmap)
   gdip.SaveBitmapToFile(pBitmap, filePath, Quality)
   gdip.DisposeImage(pBitmap)
}

GetHBitmapFromScreen(x, y, w, h)  {
   hDC := DllCall(&quot;GetDC&quot;, Ptr, 0, Ptr)
   hBM := DllCall(&quot;CreateCompatibleBitmap&quot;, Ptr, hDC, Int, w, Int, h, Ptr)
   pDC := DllCall(&quot;CreateCompatibleDC&quot;, Ptr, hDC, Ptr)
   oBM := DllCall(&quot;SelectObject&quot;, Ptr, pDC, Ptr, hBM, Ptr)
   DllCall(&quot;BitBlt&quot;, Ptr, pDC, Int, 0, Int, 0, Int, w, Int, h, Ptr, hDC, Int, x, Int, y, UInt, 0x00CC0020)
   DllCall(&quot;SelectObject&quot;, Ptr, pDC, Ptr, oBM)
   DllCall(&quot;DeleteDC&quot;, Ptr, pDC)
   DllCall(&quot;ReleaseDC&quot;, Ptr, 0, Ptr, hDC)
   Return hBM  ; should be deleted with DllCall(&quot;DeleteObject&quot;, Ptr, hBM)
}

class GDIplus   {
   __New()  {
      if !DllCall(&quot;GetModuleHandle&quot;, Str, &quot;gdiplus&quot;, Ptr)
         DllCall(&quot;LoadLibrary&quot;, Str, &quot;gdiplus&quot;)
      VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
      DllCall(&quot;gdiplus\GdiplusStartup&quot;, PtrP, pToken, Ptr, &amp;si, Ptr, 0)
      this.token := pToken
   }
   
   __Delete()  {
      DllCall(&quot;gdiplus\GdiplusShutdown&quot;, Ptr, this.token)
      if hModule := DllCall(&quot;GetModuleHandle&quot;, Str, &quot;gdiplus&quot;, Ptr)
         DllCall(&quot;FreeLibrary&quot;, Ptr, hModule)
   }
   
   BitmapFromHBitmap(hBitmap, Palette := 0)  {
      DllCall(&quot;gdiplus\GdipCreateBitmapFromHBITMAP&quot;, Ptr, hBitmap, Ptr, Palette, PtrP, pBitmap)
      Return pBitmap  ; should be deleted with this.DisposeImage(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(&quot;gdiplus\GdipGetImageEncodersSize&quot;, UIntP, nCount, UIntP, nSize)
      VarSetCapacity(ci, nSize)
      DllCall(&quot;gdiplus\GdipGetImageEncoders&quot;, UInt, nCount, UInt, nSize, Ptr, &amp;ci)
      if !(nCount &amp;&amp; nSize)
         Return -2
      
      Loop, % nCount  {
         sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), &quot;UTF-16&quot;)
         if !InStr(sString, &quot;*.&quot; Extension)
            continue
         
         pCodec := &amp;ci+idx
         break
      }
      
      if !pCodec
         Return -3

      if RegExMatch(Extension, &quot;i)^J(PG|PEG|PE|FIF)$&quot;) &amp;&amp; Quality != 75  {
         DllCall(&quot;gdiplus\GdipGetEncoderParameterListSize&quot;, Ptr, pBitmap, Ptr, pCodec, UintP, nSize)
         VarSetCapacity(EncoderParameters, nSize, 0)
         DllCall(&quot;gdiplus\GdipGetEncoderParameterList&quot;, Ptr, pBitmap, Ptr, pCodec, UInt, nSize, Ptr, &amp;EncoderParameters)
         Loop, % NumGet(EncoderParameters, &quot;UInt&quot;)  {
            elem := (24+A_PtrSize)*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
            if (NumGet(EncoderParameters, elem+16, &quot;UInt&quot;) = 1) &amp;&amp; (NumGet(EncoderParameters, elem+20, &quot;UInt&quot;) = 6)  {
               p := elem+&amp;EncoderParameters-pad-4
               NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, &quot;UInt&quot;)), &quot;UInt&quot;)
               break
            }
         }      
      }
      
      if A_IsUnicode
         pOutput := &amp;sOutput
      else  {
         VarSetCapacity(wOutput, StrPut(sOutput, &quot;UTF-16&quot;)*2, 0)
         StrPut(sOutput, &amp;wOutput, &quot;UTF-16&quot;)
         pOutput := &amp;wOutput
      }
      E := DllCall(&quot;gdiplus\GdipSaveImageToFile&quot;, Ptr, pBitmap, Ptr, pOutput, Ptr, pCodec, UInt, p ? p : 0)
      Return E ? -5 : 0
   }
   
   DisposeImage(pBitmap)  {
      Return DllCall(&quot;gdiplus\GdipDisposeImage&quot;, Ptr, pBitmap)
   }
}
Return</code></pre></div></blockquote></div><p>УУУ Круть!<br />Он еще и папочку создаёт)<br />Всёравно я прикрутил <br /></p><div class="codebox"><pre><code>ToolTip Скриншот создан
sleep 2000
ToolTip</code></pre></div><p>И жду секунду прежде чем он сохранится. Оповещения не хватает.</p><p>По этой же аналогии хотелось бы увидеть применение команды FileAppend со счётчиком, <br />Например </p><div class="codebox"><pre><code>первый клик, вид строки: Строка 1, переменная1, переменная2, переменная3
второй клик: Строка2, переменная1, переменная2, переменная3, переменная4
третий клик: Строка3, переменная6, переменная8, переменная2, переменная9</code></pre></div><p>по типу: Если создана запись в файл, то ей присваивается номер(№1 начиная со старта скрипта, или обнуление по ключу, но тут FileDelete сгодится) создаётся оповещение об этом(подтверждает успешность выполнения), и предлагает создать следующую, но уже присваивает ей №2 в файле и так далее, до бесконечности.<br />+ Функция удаления предыдущей записи по ключу<br />т.к. я пока сейчас пользуюсь:<br /></p><div class="codebox"><pre><code>A::
{
ToolTip, Предыдущая запись неверна `nЗадайте новую
FileAppend, Предыдущая строка неверна`nНовая строка:`n, %A_ScriptDir%\Test.txt
SoundPlay, %A_ScriptDir%\New.wav
return
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (fgslm)]]></author>
			<pubDate>Sun, 19 Jul 2020 15:09:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140784#p140784</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140783#p140783</link>
			<description><![CDATA[<p>Вот весь код, должно заработать я полагаю (если есть GDIplus):</p><div class="codebox"><pre><code>4::
Format := &quot;jpg&quot;
Quality := 55
T := % A_ScriptDir &quot;\ScreenS1\&quot;
FileName := T . A_YYYY &quot;.&quot; A_MM &quot;.&quot; A_DD &quot; (&quot; A_Hour &quot;.&quot; A_Min &quot;.&quot; A_Sec &quot;.&quot; A_MSec &quot;).&quot; Format
FileCreateDir, % T
SaveScreenshotToFile(FileName)
Return


SaveScreenshotToFile(filePath, x := 0, y := 0, w := 0, h := 0, Quality := 75)
{
   If (W+H &lt; 2)
   {
    W := A_ScreenWidth
    H := A_ScreenHeight
   }
   hBitmap := GetHBitmapFromScreen(x, y, w, h)
   gdip := new GDIplus
   pBitmap := gdip.BitmapFromHBitmap(hBitmap)
   DllCall(&quot;DeleteObject&quot;, Ptr, hBitmap)
   gdip.SaveBitmapToFile(pBitmap, filePath, Quality)
   gdip.DisposeImage(pBitmap)
}

GetHBitmapFromScreen(x, y, w, h)  {
   hDC := DllCall(&quot;GetDC&quot;, Ptr, 0, Ptr)
   hBM := DllCall(&quot;CreateCompatibleBitmap&quot;, Ptr, hDC, Int, w, Int, h, Ptr)
   pDC := DllCall(&quot;CreateCompatibleDC&quot;, Ptr, hDC, Ptr)
   oBM := DllCall(&quot;SelectObject&quot;, Ptr, pDC, Ptr, hBM, Ptr)
   DllCall(&quot;BitBlt&quot;, Ptr, pDC, Int, 0, Int, 0, Int, w, Int, h, Ptr, hDC, Int, x, Int, y, UInt, 0x00CC0020)
   DllCall(&quot;SelectObject&quot;, Ptr, pDC, Ptr, oBM)
   DllCall(&quot;DeleteDC&quot;, Ptr, pDC)
   DllCall(&quot;ReleaseDC&quot;, Ptr, 0, Ptr, hDC)
   Return hBM  ; should be deleted with DllCall(&quot;DeleteObject&quot;, Ptr, hBM)
}

class GDIplus   {
   __New()  {
      if !DllCall(&quot;GetModuleHandle&quot;, Str, &quot;gdiplus&quot;, Ptr)
         DllCall(&quot;LoadLibrary&quot;, Str, &quot;gdiplus&quot;)
      VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
      DllCall(&quot;gdiplus\GdiplusStartup&quot;, PtrP, pToken, Ptr, &amp;si, Ptr, 0)
      this.token := pToken
   }
   
   __Delete()  {
      DllCall(&quot;gdiplus\GdiplusShutdown&quot;, Ptr, this.token)
      if hModule := DllCall(&quot;GetModuleHandle&quot;, Str, &quot;gdiplus&quot;, Ptr)
         DllCall(&quot;FreeLibrary&quot;, Ptr, hModule)
   }
   
   BitmapFromHBitmap(hBitmap, Palette := 0)  {
      DllCall(&quot;gdiplus\GdipCreateBitmapFromHBITMAP&quot;, Ptr, hBitmap, Ptr, Palette, PtrP, pBitmap)
      Return pBitmap  ; should be deleted with this.DisposeImage(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(&quot;gdiplus\GdipGetImageEncodersSize&quot;, UIntP, nCount, UIntP, nSize)
      VarSetCapacity(ci, nSize)
      DllCall(&quot;gdiplus\GdipGetImageEncoders&quot;, UInt, nCount, UInt, nSize, Ptr, &amp;ci)
      if !(nCount &amp;&amp; nSize)
         Return -2
      
      Loop, % nCount  {
         sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), &quot;UTF-16&quot;)
         if !InStr(sString, &quot;*.&quot; Extension)
            continue
         
         pCodec := &amp;ci+idx
         break
      }
      
      if !pCodec
         Return -3

      if RegExMatch(Extension, &quot;i)^J(PG|PEG|PE|FIF)$&quot;) &amp;&amp; Quality != 75  {
         DllCall(&quot;gdiplus\GdipGetEncoderParameterListSize&quot;, Ptr, pBitmap, Ptr, pCodec, UintP, nSize)
         VarSetCapacity(EncoderParameters, nSize, 0)
         DllCall(&quot;gdiplus\GdipGetEncoderParameterList&quot;, Ptr, pBitmap, Ptr, pCodec, UInt, nSize, Ptr, &amp;EncoderParameters)
         Loop, % NumGet(EncoderParameters, &quot;UInt&quot;)  {
            elem := (24+A_PtrSize)*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
            if (NumGet(EncoderParameters, elem+16, &quot;UInt&quot;) = 1) &amp;&amp; (NumGet(EncoderParameters, elem+20, &quot;UInt&quot;) = 6)  {
               p := elem+&amp;EncoderParameters-pad-4
               NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, &quot;UInt&quot;)), &quot;UInt&quot;)
               break
            }
         }      
      }
      
      if A_IsUnicode
         pOutput := &amp;sOutput
      else  {
         VarSetCapacity(wOutput, StrPut(sOutput, &quot;UTF-16&quot;)*2, 0)
         StrPut(sOutput, &amp;wOutput, &quot;UTF-16&quot;)
         pOutput := &amp;wOutput
      }
      E := DllCall(&quot;gdiplus\GdipSaveImageToFile&quot;, Ptr, pBitmap, Ptr, pOutput, Ptr, pCodec, UInt, p ? p : 0)
      Return E ? -5 : 0
   }
   
   DisposeImage(pBitmap)  {
      Return DllCall(&quot;gdiplus\GdipDisposeImage&quot;, Ptr, pBitmap)
   }
}
Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (__Михаил__)]]></author>
			<pubDate>Sun, 19 Jul 2020 14:38:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140783#p140783</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140782#p140782</link>
			<description><![CDATA[<div class="quotebox"><cite>__Михаил__ пишет:</cite><blockquote><p>Примерно так будет выглядеть код:</p></blockquote></div><p>Понятно. У меня всё равно не работает. Там половины переменных в виде функций нет.<br />Но мне сама идея первого поста понравилась - то, что по нажатию можно сохранять скриншот без сторонних программ. Но вот отсуствие потока смены имён, и как следствие нескольких скриншотов подряд ... это минус.<br />Я надеялся как-то так сделать<br /></p><div class="quotebox"><cite>fgslm пишет:</cite><blockquote><p>Или проверку: Если файл test ++i уже существует, то +++i что-то такое</p></blockquote></div><p>Со временем конечно не новая идея, но не всё же к нему привязываться.</p>]]></description>
			<author><![CDATA[null@example.com (fgslm)]]></author>
			<pubDate>Sun, 19 Jul 2020 14:34:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140782#p140782</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140778#p140778</link>
			<description><![CDATA[<p>Примерно так будет выглядеть код:</p><div class="codebox"><pre><code>4::
Format := &quot;jpg&quot;
Quality := 55
T := % A_ScriptDir &quot;\ScreenS1\&quot;
FileName := T . A_YYYY &quot;.&quot; A_MM &quot;.&quot; A_DD &quot; (&quot; A_Hour &quot;.&quot; A_Min &quot;.&quot; A_Sec &quot;.&quot; A_MSec &quot;).&quot; Format
FileCreateDir, % T
SaveScreenshotToFile(FileName)
Return


SaveScreenshotToFile(filePath, x := 0, y := 0, w := 0, h := 0, Quality := 75)
{
   If (W+H &lt; 2)
   {
    W := A_ScreenWidth
    H := A_ScreenHeight
   }
   hBitmap := GetHBitmapFromScreen(x, y, w, h)
   gdip := new GDIplus
   pBitmap := gdip.BitmapFromHBitmap(hBitmap)
   DllCall(&quot;DeleteObject&quot;, Ptr, hBitmap)
   gdip.SaveBitmapToFile(pBitmap, filePath, Quality)
   gdip.DisposeImage(pBitmap)
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (__Михаил__)]]></author>
			<pubDate>Sun, 19 Jul 2020 13:22:28 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140778#p140778</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140775#p140775</link>
			<description><![CDATA[<p><strong>fgslm</strong></p><p>Не нужно глупо копировать чужой код. Я предоставил лишь одну строку, у вас же нет переменных &#039;T&#039; и &#039;Format&#039; как у меня.</p>]]></description>
			<author><![CDATA[null@example.com (__Михаил__)]]></author>
			<pubDate>Sun, 19 Jul 2020 13:02:15 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140775#p140775</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140774#p140774</link>
			<description><![CDATA[<div class="quotebox"><cite>__Михаил__ пишет:</cite><blockquote><p><strong>fgslm</strong></p><p>Логика просто на высшем уровне:</p><div class="codebox"><pre><code>4::
ToolTip, Скриншот сохранён.
sleep 200
ToolTip
...</code></pre></div><p>Сначала отобразить информации о сохранении, подождать (окно изменить что-нибудь) и сохранить. Это же не верно.</p><p>Не легче в имени файла добавлять время? Я так скриншотам имя выдаю:</p><div class="codebox"><pre><code>FileName := T A_YYYY &quot;.&quot; A_MM &quot;.&quot; A_DD &quot; (&quot; A_Hour &quot;.&quot; A_Min &quot;.&quot; A_Sec &quot;.&quot; A_MSec &quot;).&quot; Format</code></pre></div></blockquote></div><p>Я чет неверное не туда поставил, но у меня не работает<br /></p><div class="codebox"><pre><code>4::

;ToolTip, Скриншот сохранён.
;sleep 20
;ToolTip

FileName := T A_YYYY &quot;.&quot; A_MM &quot;.&quot; A_DD &quot; (&quot; A_Hour &quot;.&quot; A_Min &quot;.&quot; A_Sec &quot;.&quot; A_MSec &quot;).&quot; Format
;i := 0
;SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\FileName&quot; . ++i . &quot;.png&quot;)
SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\FileName&quot; . . &quot;.png&quot;)
;Run, % A_ScriptDir . &quot;\test.png&quot;


SaveScreenshotToFile(x, y, w, h, filePath)  {
   hBitmap := GetHBitmapFromScreen(x, y, w, h)
   gdip := new GDIplus
   pBitmap := gdip.BitmapFromHBitmap(hBitmap)
   DllCall(&quot;DeleteObject&quot;, Ptr, hBitmap)
   gdip.SaveBitmapToFile(pBitmap, filePath)
   gdip.DisposeImage(pBitmap)
}</code></pre></div><p>один файл создал и всё.</p>]]></description>
			<author><![CDATA[null@example.com (fgslm)]]></author>
			<pubDate>Sun, 19 Jul 2020 12:55:30 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140774#p140774</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140772#p140772</link>
			<description><![CDATA[<div class="quotebox"><cite>__Михаил__ пишет:</cite><blockquote><p>Это же не верно</p></blockquote></div><p>А почему это неработает с точки зрения логики языка? Там же нет никаких команд - просто вывод информации.<br />Где там скобки надо поставить чтобы последовательно выполнялось?</p>]]></description>
			<author><![CDATA[null@example.com (fgslm)]]></author>
			<pubDate>Sun, 19 Jul 2020 12:43:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140772#p140772</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140771#p140771</link>
			<description><![CDATA[<p><strong>fgslm</strong></p><p>Логика просто на высшем уровне:</p><div class="codebox"><pre><code>4::
ToolTip, Скриншот сохранён.
sleep 200
ToolTip
...</code></pre></div><p>Сначала отобразить информации о сохранении, подождать (окно изменит что-нибудь) и сохранить. Это же не верно.</p><p>Не легче в имени файла добавлять время? Я так скриншотам имя выдаю:</p><div class="codebox"><pre><code>FileName := T A_YYYY &quot;.&quot; A_MM &quot;.&quot; A_DD &quot; (&quot; A_Hour &quot;.&quot; A_Min &quot;.&quot; A_Sec &quot;.&quot; A_MSec &quot;).&quot; Format</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (__Михаил__)]]></author>
			<pubDate>Sun, 19 Jul 2020 12:41:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140771#p140771</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140769#p140769</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Нет, не начинает. Наверно как-то криво написали. Покажите свой код полностью.</p></blockquote></div><div class="codebox"><pre><code>4::
ToolTip, Скриншот сохранён.
sleep 200
ToolTip
{
i := 0
SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\test&quot; . ++i . &quot;.png&quot;)
;Run, % A_ScriptDir . &quot;\test.png&quot;


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

GetHBitmapFromScreen(x, y, w, h)  {
   hDC := DllCall(&quot;GetDC&quot;, Ptr, 0, Ptr)
   hBM := DllCall(&quot;CreateCompatibleBitmap&quot;, Ptr, hDC, Int, w, Int, h, Ptr)
   pDC := DllCall(&quot;CreateCompatibleDC&quot;, Ptr, hDC, Ptr)
   oBM := DllCall(&quot;SelectObject&quot;, Ptr, pDC, Ptr, hBM, Ptr)
   DllCall(&quot;BitBlt&quot;, Ptr, pDC, Int, 0, Int, 0, Int, w, Int, h, Ptr, hDC, Int, x, Int, y, UInt, 0x00CC0020)
   DllCall(&quot;SelectObject&quot;, Ptr, pDC, Ptr, oBM)
   DllCall(&quot;DeleteDC&quot;, Ptr, pDC)
   DllCall(&quot;ReleaseDC&quot;, Ptr, 0, Ptr, hDC)
   Return hBM  ; should be deleted with DllCall(&quot;DeleteObject&quot;, Ptr, hBM)
}

class GDIplus   {
   __New()  {
      if !DllCall(&quot;GetModuleHandle&quot;, Str, &quot;gdiplus&quot;, Ptr)
         DllCall(&quot;LoadLibrary&quot;, Str, &quot;gdiplus&quot;)
      VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
      DllCall(&quot;gdiplus\GdiplusStartup&quot;, PtrP, pToken, Ptr, &amp;si, Ptr, 0)
      this.token := pToken
   }
   
   __Delete()  {
      DllCall(&quot;gdiplus\GdiplusShutdown&quot;, Ptr, this.token)
      if hModule := DllCall(&quot;GetModuleHandle&quot;, Str, &quot;gdiplus&quot;, Ptr)
         DllCall(&quot;FreeLibrary&quot;, Ptr, hModule)
   }
   
   BitmapFromHBitmap(hBitmap, Palette := 0)  {
      DllCall(&quot;gdiplus\GdipCreateBitmapFromHBITMAP&quot;, Ptr, hBitmap, Ptr, Palette, PtrP, pBitmap)
      return pBitmap  ; should be deleted with this.DisposeImage(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(&quot;gdiplus\GdipGetImageEncodersSize&quot;, UIntP, nCount, UIntP, nSize)
      VarSetCapacity(ci, nSize)
      DllCall(&quot;gdiplus\GdipGetImageEncoders&quot;, UInt, nCount, UInt, nSize, Ptr, &amp;ci)
      if !(nCount &amp;&amp; nSize)
         return -2
      
      Loop, % nCount  {
         sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), &quot;UTF-16&quot;)
         if !InStr(sString, &quot;*.&quot; Extension)
            continue
         
         pCodec := &amp;ci+idx
         break
      }
      
      if !pCodec
         return -3

      if RegExMatch(Extension, &quot;i)^J(PG|PEG|PE|FIF)$&quot;) &amp;&amp; Quality != 75  {
         DllCall(&quot;gdiplus\GdipGetEncoderParameterListSize&quot;, Ptr, pBitmap, Ptr, pCodec, UintP, nSize)
         VarSetCapacity(EncoderParameters, nSize, 0)
         DllCall(&quot;gdiplus\GdipGetEncoderParameterList&quot;, Ptr, pBitmap, Ptr, pCodec, UInt, nSize, Ptr, &amp;EncoderParameters)
         Loop, % NumGet(EncoderParameters, &quot;UInt&quot;)  {
            elem := (24+A_PtrSize)*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
            if (NumGet(EncoderParameters, elem+16, &quot;UInt&quot;) = 1) &amp;&amp; (NumGet(EncoderParameters, elem+20, &quot;UInt&quot;) = 6)  {
               p := elem+&amp;EncoderParameters-pad-4
               NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, &quot;UInt&quot;)), &quot;UInt&quot;)
               break
            }
         }      
      }
      
      if A_IsUnicode
         pOutput := &amp;sOutput
      else  {
         VarSetCapacity(wOutput, StrPut(sOutput, &quot;UTF-16&quot;)*2, 0)
         StrPut(sOutput, &amp;wOutput, &quot;UTF-16&quot;)
         pOutput := &amp;wOutput
      }
      E := DllCall(&quot;gdiplus\GdipSaveImageToFile&quot;, Ptr, pBitmap, Ptr, pOutput, Ptr, pCodec, UInt, p ? p : 0)
      return E ? -5 : 0
   }
   
   DisposeImage(pBitmap)  {
      return DllCall(&quot;gdiplus\GdipDisposeImage&quot;, Ptr, pBitmap)
   }
   }
   return
   }</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (fgslm)]]></author>
			<pubDate>Sun, 19 Jul 2020 12:36:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140769#p140769</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140768#p140768</link>
			<description><![CDATA[<p>Нет, не начинает. Наверно как-то криво написали. Покажите свой код полностью.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 19 Jul 2020 12:34:20 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140768#p140768</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140767#p140767</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Счётчик можно так организовать:<br /></p><div class="codebox"><pre><code>i := 0
F10:: SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\test&quot; . ++i . &quot;.png&quot;)</code></pre></div></blockquote></div><p>Нет, доходит до test1 и им начинает заменять все предыдущие.<br />Где-то нужен сброс счетчика, и уникальное имя.<br />Или проверку: Если файл test ++i уже существует, то +++i что-то такое<br />Или<br /></p><div class="codebox"><pre><code>DllCall(&quot;DeleteObject&quot;, Ptr, hBitmap)</code></pre></div><p>помоему там в коде, что-то отвечает за удаление чего-то, но я точно не понял</p>]]></description>
			<author><![CDATA[null@example.com (fgslm)]]></author>
			<pubDate>Sun, 19 Jul 2020 12:28:25 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140767#p140767</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140757#p140757</link>
			<description><![CDATA[<p>Счётчик можно так организовать:<br /></p><div class="codebox"><pre><code>i := 0
F10:: SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\test&quot; . ++i . &quot;.png&quot;)</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 19 Jul 2020 11:15:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140757#p140757</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140751#p140751</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\test1.png&quot;) SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\test2.png&quot;)</p></blockquote></div><p>Нет, я имею ввиду чтобы они создавались по счетчику не повторяя имена предыдущих. А не все сразу.<br />Как-то использовать count в назначении имени, чтобы при последующем нажатии ключа создавался еще один скриншот там же, но с именем, отличным от первого. Так они перезаписываются.</p><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>сформулируйте вопрос более точно.</p></blockquote></div><p>Я имел ввиду что вместо PrintScreen будет команда FileAppend, но уже вроде понял что надо подставить A_ScriptDir в условие.<br />Но тут тоже не мешало бы использовать счетчик, чтобы записи нумеровались в файле, а не шли просто одна за другой.</p>]]></description>
			<author><![CDATA[null@example.com (fgslm)]]></author>
			<pubDate>Sun, 19 Jul 2020 10:58:28 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140751#p140751</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140747#p140747</link>
			<description><![CDATA[<div class="quotebox"><cite>fgslm пишет:</cite><blockquote><p>Можно как-то несколько скриншотов сохранить?</p></blockquote></div><div class="codebox"><pre><code>SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\test1.png&quot;)
SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\test2.png&quot;)
;Run, % A_ScriptDir . &quot;\test.png&quot;

SaveScreenshotToFile(x, y, w, h, filePath)  {
   hBitmap := GetHBitmapFromScreen(x, y, w, h)
   gdip := new GDIplus
   pBitmap := gdip.BitmapFromHBitmap(hBitmap)
   DllCall(&quot;DeleteObject&quot;, Ptr, hBitmap)
   gdip.SaveBitmapToFile(pBitmap, filePath)
   gdip.DisposeImage(pBitmap)
}</code></pre></div><div class="quotebox"><cite>fgslm пишет:</cite><blockquote><p>записать текст в файл командой FileAppend?</p></blockquote></div><p>Если вопрос не связан с темой топика, создайте новый, и сформулируйте вопрос более точно.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 19 Jul 2020 10:21:15 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140747#p140747</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Сохранить скриншот в файл]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140744#p140744</link>
			<description><![CDATA[<p>Можно как-то несколько скриншотов сохранить? чтобы они сохранялись как test.png test1.png test2.png и прочее? А то при повторе скрипта файл перезаписывается.<br />И еще, как по аналогии с... <br /></p><div class="codebox"><pre><code>SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . &quot;\test.png&quot;)
;Run, % A_ScriptDir . &quot;\test.png&quot;

SaveScreenshotToFile(x, y, w, h, filePath)  {
   hBitmap := GetHBitmapFromScreen(x, y, w, h)
   gdip := new GDIplus
   pBitmap := gdip.BitmapFromHBitmap(hBitmap)
   DllCall(&quot;DeleteObject&quot;, Ptr, hBitmap)
   gdip.SaveBitmapToFile(pBitmap, filePath)
   gdip.DisposeImage(pBitmap)
}</code></pre></div><p>...записать текст в файл командой FileAppend?<br />Т.е. чтобы функция создавала, к примеру, файл в директории нахождения скрипта с записью в него содержимого. Типо такого:<br /></p><div class="codebox"><pre><code>SaveTxt(A_ScriptDir . &quot;\test.txt&quot;)

SaveTxt(filePath)  {
   FileAppend(Записать переменную %a% и %b% в файл.`n, filePath)
}</code></pre></div><p>Вобще непонятно как использовать в данном случае команду&nbsp; A_ScriptDir для &quot;\test.txt&quot;</p>]]></description>
			<author><![CDATA[null@example.com (fgslm)]]></author>
			<pubDate>Sun, 19 Jul 2020 05:52:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140744#p140744</guid>
		</item>
	</channel>
</rss>
