1 (изменено: RaDley, 2021-11-02 15:54:11)

Тема: AHK: Как можно поместить фото в буффер

Здравствуйте, у меня есть фото оно находится к примеру по пути: "C:\Users\RaDley\Documents\Lightshot\Screenshot_10.png"
Как можно поместить это изображение в Clipboard?

2

Re: AHK: Как можно поместить фото в буффер

Открыть в Paint(можно без отображения окна), потом ^A^C.

3

Re: AHK: Как можно поместить фото в буффер

Примерно так:

F2::	; 1 нажатие: Сохранить картинку в буфер, 2 нажатие: Открыть Paint и вставить её из буфера.
F++
If (F = 1){
 Clipboard=
 FileName := C:\Users\RaDley\Documents\Lightshot\Screenshot_10.png
 Run, MSPaint %FileName%
 WinWait, ahk_class MSPaintApp
 Sleep, 100
 Send, ^{a}
 Sleep, 100
 Send, ^{c}
 ToolTip, Картинка в буфере
 PostMessage, 0x111, 57665, 0,, ahk_class MSPaintApp
 Sleep, 500
 WinWaitClose
 ToolTip
} 

If (F = 2){
 ToolTip, Картинка из буфера
 Run, MSPaint
 WinWait, ahk_class MSPaintApp
 Sleep, 100
 Send, ^{v}
 F := 0
 Sleep, 500
 ToolTip
}
Return
Win10x64, AHK v1.1.33.09 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Как можно поместить фото в буффер

А без пайнта никак?

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

5 (изменено: __Михаил__, 2021-11-02 21:39:59)

Re: AHK: Как можно поместить фото в буффер

Зачем нам лёгкие пути? Мы любим посложнее.

Win10x64, AHK v1.1.33.09 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: Как можно поместить фото в буффер

filePath := "C:\Users\RaDley\Documents\Lightshot\Screenshot_10.png"

GDIp := new GDIplus
pBitmam := GDIp.CreateBitmapFromFile(filePath)
GDIp.SetBitmapToClipboard(pBitmam)
GDIp.DisposeImage(pBitmap)

class GDIplus {
   __New() {
      this.hLib := DllCall("LoadLibrary", "Str", "gdiplus", "Ptr")
      VarSetCapacity(si, 8 + A_PtrSize*2, 0), si := Chr(1)
      DllCall("gdiplus\GdiplusStartup", "PtrP", pToken, "Ptr", &si, "Ptr", 0)
      this.token := pToken
   }
   __Delete() {
      DllCall("gdiplus\GdiplusShutdown", "Ptr", this.token)
      DllCall("FreeLibrary", "Ptr", this.hLib)
   }
   CreateBitmapFromFile(sFile) {
      DllCall("gdiplus\GdipCreateBitmapFromFile", "WStr", sFile, "PtrP", pBitmap)
      Return pBitmap
   }
   SetBitmapToClipboard(pBitmap) {
      hBitmap := this.CreateHBITMAPFromBitmap(pBitmap)
      off1 := A_PtrSize = 8 ? 52 : 44, off2 := A_PtrSize = 8 ? 32 : 24
      DllCall("GetObject", "Ptr", hBitmap, "int", VarSetCapacity(oi, A_PtrSize = 8 ? 104 : 84, 0), "Ptr", &oi)
      hdib := DllCall("GlobalAlloc", "UInt", 2, "Ptr", 40+NumGet(oi, off1, "UInt"), "Ptr")
      pdib := DllCall("GlobalLock", "Ptr", hdib, "Ptr")
      DllCall("RtlMoveMemory", "Ptr", pdib, "Ptr", &oi+off2, "Ptr", 40)
      DllCall("RtlMoveMemory", "Ptr", pdib+40, "Ptr", NumGet(oi, off2 - A_PtrSize, "Ptr"), "Ptr", NumGet(oi, off1, "UInt"))
      DllCall("GlobalUnlock", "Ptr", hdib)
      DllCall("DeleteObject", "Ptr", hBitmap)
      DllCall("OpenClipboard", "Ptr", 0)
      DllCall("EmptyClipboard")
      DllCall("SetClipboardData", "UInt", 8, "Ptr", hdib)
      DllCall("CloseClipboard")
   }
	CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff) {
		DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hbm, "Int", Background)
		return hbm
	}
	DisposeImage(pBitmap)  {
		return DllCall("gdiplus\GdipDisposeImage", "Ptr", pBitmap)
	}
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder