1

Тема: AHK: Автоматическое сохранение скриншотов в Paint

Всем привет!
Находил такой код, но не работает (видимо из-за того что код писался на старой версии паинта)

SendInput, {PrintScreen}
FileAppend ,, D:\pctr.bmp
Run, mspaint.exe D:\pctr.bmp
WinWait, PrScr.bmp - Paint
PostMessage, 0x111, 57637, 0, , pctr.bmp - Paint
PostMessage, 0x111, 57603, 0, , pctr.bmp - Paint
PostMessage, 0x111, 57665, 0, , pctr.bmp - Paint
WinWaitClose, pctr.bmp - Paint

Помогите сделать, чтоб скрипт при активации нажимал PrintScreen и сохранял скриншот в формате .png

2 (изменено: teadrinker, 2018-01-09 22:33:10)

Re: AHK: Автоматическое сохранение скриншотов в Paint

Для сохранения скриншотов пайнт не нужен, тема много раз поднималась, воспользуйтесь поиском.

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

3 (изменено: Letik, 2018-01-09 23:11:17)

Re: AHK: Автоматическое сохранение скриншотов в Paint

teadrinker пишет:

Для сохранения скриншотов пайнт не нужен, тема много раз поднималась, воспользуйтесь поиском.

Все нашел спасибо большое за Ваш ответ в той теме))))

4

Re: AHK: Автоматическое сохранение скриншотов в Paint

teadrinker пишет:

Для сохранения скриншотов пайнт не нужен, тема много раз поднималась, воспользуйтесь поиском.

А как сделать рандомное название для файла там?

SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_ScriptDir . "/%word1%.png")
;Run, % A_ScriptDir . "/%word1%.png"

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  ; should be deleted with DllCall("DeleteObject", Ptr, 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  ; 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("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)
   }
}

У меня такой, не получается

Вот код рандома:

list := "abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ0123456789" 
StringSplit, letter, list
loop 6
{
   random, rand, 1, 64
   word1 .= letter%rand%
}

5

Re: AHK: Автоматическое сохранение скриншотов в Paint

stealzy пишет:
Letik пишет:

A_ScriptDir . "/%word1%.png"

A_ScriptDir  - это переменная, "/%word1%.png" - это странная строка со знаками процентов. И потом зачем рандом, если есть A_Now?

Мне с рандомом нужнее, потому что файл загружает PNG и TXT документ на FTP сервер и нужны уникальные имена для каждого, а он их таки генерирует

6

Re: AHK: Автоматическое сохранение скриншотов в Paint

stealzy пишет:

И потом зачем рандом, если есть A_Now?

А во-вашему за 1 секунду несколько снимков экрана сделать невозможно?
Letik, используйте в названии файла A_TickCount.

7

Re: AHK: Автоматическое сохранение скриншотов в Paint

Malcev пишет:
stealzy пишет:

И потом зачем рандом, если есть A_Now?

А во-вашему за 1 секунду несколько снимков экрана сделать невозможно?
Letik, используйте в названии файла A_TickCount.

Не понял, что именно в коде заменить на A_TickCount?

8 (изменено: Malcev, 2018-01-10 15:29:46)

Re: AHK: Автоматическое сохранение скриншотов в Paint

Хотя A_TickCount - не вариант.
Делайте так:

SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_Now A_Msec ".png")

Можно еще для надежности от перевода часов:

SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_Now A_Msec A_TickCount ".png")

9

Re: AHK: Автоматическое сохранение скриншотов в Paint

Malcev пишет:

Хотя A_TickCount - не вариант.
Делайте так:

SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_Now A_Msec ".png")

Можно еще для надежности от перевода часов:

SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, A_Now A_Msec A_TickCount ".png")

Работает, круто, но мне нужно, чтобы у меня отправлялся на ftp сервер PNG и TXT файл и нужное одинаковое название для обоих, а для TXT файла у меня стоит переменная, которая генерирует ему название и я хотел эту переменную в этот код засунуть, чтобы у PNG и TXT было одно название

10

Re: AHK: Автоматическое сохранение скриншотов в Paint

list := "abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ0123456789" 
StringSplit, letter, list
loop 6
{
   random, rand, 1, 64
   word1 .= letter%rand%
}
SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, word1 ".png")

11

Re: AHK: Автоматическое сохранение скриншотов в Paint

Malcev пишет:
list := "abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ0123456789" 
StringSplit, letter, list
loop 6
{
   random, rand, 1, 64
   word1 .= letter%rand%
}
SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, word1 ".png")

Большое спасибо!

12

Re: AHK: Автоматическое сохранение скриншотов в Paint

Malcev пишет:
list := "abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ0123456789" 
StringSplit, letter, list
loop 6
{
   random, rand, 1, 64
   word1 .= letter%rand%
}
SaveScreenshotToFile(0, 0, A_ScreenWidth, A_ScreenHeight, word1 ".png")

Кстати, вопрос не по теме, могу ли я сделать, чтобы файлы заливались в определенную папку на FTP?

13

Re: AHK: Автоматическое сохранение скриншотов в Paint

Бессмысленно цитировать пост не нужно и одна тема - один вопрос.

14 (изменено: Malcev, 2018-01-10 17:21:49)

Re: AHK: Автоматическое сохранение скриншотов в Paint

Letik, для уникального имени лучше использовать UUID:

MsgBox % CreateUUID()
return

CreateUUID()
{
    VarSetCapacity(puuid, 16, 0)
    if !(DllCall("rpcrt4.dll\UuidCreate", "ptr", &puuid))
        if !(DllCall("rpcrt4.dll\UuidToString", "ptr", &puuid, "uint*", suuid))
            return StrGet(suuid), DllCall("rpcrt4.dll\RpcStringFree", "uint*", suuid)
    return ""
}

15

Re: AHK: Автоматическое сохранение скриншотов в Paint

Letik, избыточное цитирование запрещено правилами. Предложение начинается с заглавной буквы и заканчиваться знаками препинания.
Исправьте свои сообщения!