<?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=10343</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=10343&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Скриншот выделенной части экрана поверх всех окон».]]></description>
		<lastBuildDate>Mon, 17 Oct 2022 23:02:31 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155334#p155334</link>
			<description><![CDATA[<p>Немного подправил код.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 17 Oct 2022 23:02:31 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155334#p155334</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155333#p155333</link>
			<description><![CDATA[<p>Так будет в размере окна сохранять:<br /></p><div class="codebox"><pre><code>/*
Скрипт снимает скриншот выделенной области экрана и показывает его поверх всех окон.
Скрипт также позволяет изменять размеры скриншота при вращении над ним колеса мыши.
Ctrl + Space — начать выделение (отпустив Ctrl + Space).
Двигать окно со скриншотом левой кнопкой, менять размер вращая колесо, закрыть — щелчком правой.
При закрытии окна скриншот сохраняется в буфер обмена.

Для работы скрипта необходима библиотека Gdip.ahk
https://www.dropbox.com/s/73vpu9xdzn5ys13/Gdip.ahk?dl=1
*/

CoordMode, Mouse
SetBatchLines, -1
SetWinDelay, 0
SetWorkingDir, % A_ScriptDir
OnExit, Exit
global oGuiData := []

OnMessage(0x112, &quot;WM_SYSCOMMAND&quot;)
OnMessage(0x201, &quot;WM_LBUTTONDOWN&quot;)
OnMessage(0x205, &quot;WM_RBUTTONUP&quot;)
OnMessage(0x203, &quot;WM_LBUTTONDBLCLK&quot;)
Return

Exit:
   (CrossHair &amp;&amp; CrossHair())
   (hHookMouse &amp;&amp; DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse))
   for k, v in oGuiData
      DllCall(&quot;DeleteObject&quot;, Ptr, v)
   ExitApp

^Space::CrossHair(CrossHair := 1)

#If CrossHair = 1
LButton::
   MouseGetPos, mouse_x_start, mouse_y_start
   
   Gui, Select:Default
   Gui, -Caption +ToolWindow +LastFound +AlwaysOnTop -DPIScale
   Gui, Color, Grey
   WinSet, Transparent, 150
   
   hHookMouse := DllCall(&quot;SetWindowsHookEx&quot;
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback(&quot;LowLevelMouseProc&quot;, &quot;Fast&quot;)
      , Ptr, DllCall(&quot;GetModuleHandle&quot;, UInt, 0, Ptr)
      , UInt, 0, Ptr)
      
   KeyWait, LButton
   SetTimer, EventHandling, Off
   DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse), hHookMouse := &quot;&quot;
   CrossHair(CrossHair := &quot;&quot;)
   WinGetPos, X, Y, W, H
   Gui, Destroy
   CreateScreenshotWindow(X, Y, W, H)
   Return

#If hGui := ScreenWindowUnderCursor()
WheelDown::
WheelUp:: WM_WHEEL(A_ThisHotkey = &quot;WheelUp&quot; ? 0 : 1, hGui)
   
CrossHair(OnOff = &quot;&quot;)
{
   static IDC_CROSS := 32515, SPI_SETCURSORS := 0x57
      , hCursor := DllCall(&quot;LoadCursor&quot;, Ptr, 0, UInt, IDC_CROSS, Ptr)
      , sys_cursors := [32512,32513,32514,32516,32642,32643,32644,32645,32646,32648,32649,32650]
   
   if !OnOff
      DllCall(&quot;SystemParametersInfo&quot;, UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   else
      for k, cursor in sys_cursors
         hCopy := DllCall(&quot;CopyImage&quot;, Ptr, hCursor, UInt, 2, Int, 0, Int, 0, UInt, 0)
         , DllCall(&quot;SetSystemCursor&quot;, Ptr, hCopy, UInt, cursor)
}
       
LowLevelMouseProc(nCode, wParam, lParam)
{
   static mouse_x, mouse_y, WM_MOUSEMOVE := 0x200
   global mouse_x_start, mouse_y_start

   if (wParam = WM_MOUSEMOVE) {
      mouse_x := NumGet(lParam + 0, &quot;Int&quot;)
      mouse_y := NumGet(lParam + 4, &quot;Int&quot;)
      SetTimer, EventHandling, -10
   }
   Return DllCall(&quot;CallNextHookEx&quot;, Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   x := mouse_x_start &lt; mouse_x ? mouse_x_start : mouse_x
   y := mouse_y_start &lt; mouse_y ? mouse_y_start : mouse_y
   w := Abs(mouse_x - mouse_x_start)
   h := Abs(mouse_y - mouse_y_start)
   Gui, Select:Show, x%x% y%y% w%w% h%h% NA
   Return
}

CreateScreenshotWindow(X, Y, W, H)
{
   static WS_EX_LAYERED := 0x80000
   
   pToken := Gdip_Startup()
   pBitmap := Gdip_BitmapFromScreen( X &quot;|&quot; Y &quot;|&quot; W &quot;|&quot; H )
   
   hbm := CreateDIBSection(W, H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, W, H)
   
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, W - 2, H - 2)
   Gdip_DeletePen(pPen)
   
   for k, v in oGuiData
      if (v = 0 &amp;&amp; IsEmpty := 1)
         break
      
   Gui, New, -Caption +E%WS_EX_LAYERED% +LastFound +AlwaysOnTop +ToolWindow +hwndhGui -DPIScale
   Gui, Show, NA
   oGuiData[hGui] := Gdip_CreateHBITMAPFromBitmap(pBitmap)
   UpdateLayeredWindow(hGui, hdc, X, Y, W, H)
   
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
}

ScreenWindowUnderCursor()
{
   MouseGetPos,,, hGui
   WinGet, PID, Pid, ahk_id %hGui%
   if DllCall(&quot;GetCurrentProcessId&quot;) = PID
      Return hGui
}

WM_LBUTTONDOWN()
{
   if (A_Gui != &quot;Select&quot;)
      PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
}

WM_LBUTTONDBLCLK()
{
   if (A_Gui != &quot;Select&quot;) {
      pToken := Gdip_Startup()
      pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])
      Gui, %A_Gui%:Hide
      FileSelectFile, SelectFile, S3, %A_Now%.png , Сохранить скриншот, All Files(*.*)
      Gdip_SaveBitmapToFile(pBitmap, SelectFile )
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
      Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
   }
}

WM_RBUTTONUP()
{
   if (A_Gui != &quot;Select&quot;) {
      pToken := Gdip_Startup()
      pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])
      pBitmap := ScaleImage(pBitmap, A_Gui)
      Gdip_SetBitmapToClipboard(pBitmap)
      Gdip_DisposeImage(pBitmap)
      Gdip_Shutdown(pToken)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}

ScaleImage(pBitmap, hGui) {
   WinGetPos,,, W, H, ahk_id %hGui%
   Gdip_GetImageDimensions(pBitmap, WidthBM, HeightBM)
   if (W = WidthBM)
      Return pBitmap
   pNewBitmap := Gdip_CreateBitmap(W, H)
   G := Gdip_GraphicsFromImage(pNewBitmap)
   Gdip_SetInterpolationMode(G, 7)
   Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, WidthBM, HeightBM)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap)
   Return pNewBitmap
}

WM_SYSCOMMAND(wp)
{
   static SC_CLOSE := 0xF060
   if (wp = SC_CLOSE &amp;&amp; A_Gui != &quot;Select&quot;)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui]), oGuiData.Delete(A_Gui)
}

WM_WHEEL(wp, hwnd)
{
   Critical
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[hwnd])
   Gdip_GetImageDimensions(pBitmap, WidthBM, HeightBM)
   RatioBM := WidthBM/HeightBM
   SquareBM := WidthBM*HeightBM
   
   WinGetPos, X, Y, W, H, ahk_id %hwnd%
   
   DeltaW := Round(W/(!wp ? 10 : 11))
   DeltaW := wp ? -DeltaW : DeltaW
   ResultW := W + DeltaW
   ResultH := Round(ResultW/RatioBM)
   ResultX := X - Round(DeltaW/2)
   ResultY := Y - Round((ResultH - H)/2)
   SquareWin := ResultW*ResultH
   if (!wp &amp;&amp; SquareWin &gt; 13000000) || (wp &amp;&amp; SquareWin &lt; 1000 &amp;&amp; SquareWin &lt; SquareBM)
      Return, &quot;&quot;, Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

   hbm := CreateDIBSection(ResultW, ResultH)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   
   Gdip_SetInterpolationMode(G, 7)
   Gdip_DrawImage(G, pBitmap, 0, 0, ResultW, ResultH, 0, 0, WidthBM, HeightBM)
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, ResultW - 2, ResultH - 2)
   
   UpdateLayeredWindow(hwnd, hdc, ResultX, ResultY, ResultW, ResultH)

   Gdip_DeletePen(pPen), SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
}</code></pre></div><p>Вернул горячую клавишу, чтобы соответствовала описанию — Ctrl + Space.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 17 Oct 2022 20:02:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155333#p155333</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155332#p155332</link>
			<description><![CDATA[<p>Уважаемый <strong>teadrinker</strong> я исправил код алгоритм соблюдён.<br /></p><div class="codebox"><pre><code>/*
Скрипт снимает скриншот выделенной области экрана и показывает его поверх всех окон.
Скрипт также позволяет изменять размеры скриншота при вращении над ним колеса мыши.
Ctrl + Space — начать выделение (отпустив Ctrl + Space).
Двигать окно со скриншотом левой кнопкой, менять размер вращая колесо, закрыть — щелчком правой.

Для работы скрипта необходима библиотека Gdip.ahk
https://www.dropbox.com/s/73vpu9xdzn5ys13/Gdip.ahk?dl=1
*/

CoordMode, Mouse
SetBatchLines, -1
SetWinDelay, 0
SetWorkingDir, % A_ScriptDir
OnExit, Exit
global oGuiData := []

OnMessage(0x112, &quot;WM_SYSCOMMAND&quot;)
OnMessage(0x201, &quot;WM_LBUTTONDOWN&quot;)
OnMessage(0x205, &quot;WM_RBUTTONUP&quot;)
OnMessage(0x203, &quot;WM_LBUTTONDBLCLK&quot;)
Return

Exit:
   (CrossHair &amp;&amp; CrossHair())
   (hHookMouse &amp;&amp; DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse))
   for k, v in oGuiData
      DllCall(&quot;DeleteObject&quot;, Ptr, v)
   ExitApp

*~$vk2C::CrossHair(CrossHair := 1)

#If CrossHair = 1
LButton::
   MouseGetPos, mouse_x_start, mouse_y_start
   
   Gui, Select:Default
   Gui, -Caption +ToolWindow +LastFound +AlwaysOnTop -DPIScale
   Gui, Color, Grey
   WinSet, Transparent, 150
   
   hHookMouse := DllCall(&quot;SetWindowsHookEx&quot;
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback(&quot;LowLevelMouseProc&quot;, &quot;Fast&quot;)
      , Ptr, DllCall(&quot;GetModuleHandle&quot;, UInt, 0, Ptr)
      , UInt, 0, Ptr)
      
   KeyWait, LButton
   SetTimer, EventHandling, Off
   DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse), hHookMouse := &quot;&quot;
   CrossHair(CrossHair := &quot;&quot;)
   WinGetPos, X, Y, W, H
   Gui, Destroy
   CreateScreenshotWindow(X, Y, W, H)
   Return

#If hGui := ScreenWindowUnderCursor()
WheelDown::
WheelUp:: WM_WHEEL(A_ThisHotkey = &quot;WheelUp&quot; ? 0 : 1, hGui)
   
CrossHair(OnOff = &quot;&quot;)
{
   static IDC_CROSS := 32515, SPI_SETCURSORS := 0x57
      , hCursor := DllCall(&quot;LoadCursor&quot;, Ptr, 0, UInt, IDC_CROSS, Ptr)
      , sys_cursors := [32512,32513,32514,32516,32642,32643,32644,32645,32646,32648,32649,32650]
   
   if !OnOff
      DllCall(&quot;SystemParametersInfo&quot;, UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   else
      for k, cursor in sys_cursors
         hCopy := DllCall(&quot;CopyImage&quot;, Ptr, hCursor, UInt, 2, Int, 0, Int, 0, UInt, 0)
         , DllCall(&quot;SetSystemCursor&quot;, Ptr, hCopy, UInt, cursor)
}
       
LowLevelMouseProc(nCode, wParam, lParam)
{
   static mouse_x, mouse_y, WM_MOUSEMOVE := 0x200
   global mouse_x_start, mouse_y_start

   if (wParam = WM_MOUSEMOVE)  {
      mouse_x := NumGet(lParam + 0, &quot;Int&quot;)
      mouse_y := NumGet(lParam + 4, &quot;Int&quot;)
      SetTimer, EventHandling, -10
   }
   Return DllCall(&quot;CallNextHookEx&quot;, Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   x := mouse_x_start &lt; mouse_x ? mouse_x_start : mouse_x
   y := mouse_y_start &lt; mouse_y ? mouse_y_start : mouse_y
   w := Abs(mouse_x - mouse_x_start)
   h := Abs(mouse_y - mouse_y_start)
   Gui, Select:Show, x%x% y%y% w%w% h%h% NA
   Return
}

CreateScreenshotWindow(X, Y, W, H)
{
   static WS_EX_LAYERED := 0x80000
   
   pToken := Gdip_Startup()
   pBitmap := Gdip_BitmapFromScreen( X &quot;|&quot; Y &quot;|&quot; W &quot;|&quot; H )
   
   hbm := CreateDIBSection(W, H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, W, H)
   
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, W - 2, H - 2)
   Gdip_DeletePen(pPen)
   
   for k, v in oGuiData
      if (v = 0 &amp;&amp; IsEmpty := 1)
         break
      
   Gui, New, -Caption +E%WS_EX_LAYERED% +LastFound +AlwaysOnTop +ToolWindow +hwndhGui -DPIScale
   Gui, Show, NA
   oGuiData[hGui] := Gdip_CreateHBITMAPFromBitmap(pBitmap)
   UpdateLayeredWindow(hGui, hdc, X, Y, W, H)
   
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
}

ScreenWindowUnderCursor()
{
   MouseGetPos,,, hGui
   WinGet, PID, Pid, ahk_id %hGui%
   if DllCall(&quot;GetCurrentProcessId&quot;) = PID
      Return hGui
}

WM_LBUTTONDOWN()
{
   if (A_Gui != &quot;Select&quot;)
      PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
}

WM_LBUTTONDBLCLK()
{
    if (A_Gui != &quot;Select&quot;)  {
     pToken := Gdip_Startup()
     pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])
     Gui, %A_Gui%:Hide
     FileSelectFile, SelectFile, S3, %A_Now%.png , Сохранить скриншот, All Files(*.*)
     Gdip_SaveBitmapToFile(pBitmap, SelectFile )
     DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
     oGuiData.Delete(A_Gui)
     Gui, %A_Gui%:Destroy
     Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
    }
}

WM_RBUTTONUP()
{
     if (A_Gui != &quot;Select&quot;)  {
      pToken := Gdip_Startup()
      pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])
      Gdip_SetBitmapToClipboard(pBitmap)
      Gdip_DisposeImage(pBitmap)
      Gdip_Shutdown(pToken)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}

WM_SYSCOMMAND(wp)
{
   static SC_CLOSE := 0xF060
   if (wp = SC_CLOSE &amp;&amp; A_Gui != &quot;Select&quot;)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui]), oGuiData.Delete(A_Gui)
}

WM_WHEEL(wp, hwnd)
{
   Critical
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[hwnd])
   Gdip_GetImageDimensions(pBitmap, WidthBM, HeightBM)
   RatioBM := WidthBM/HeightBM
   SquareBM := WidthBM*HeightBM
   
   WinGetPos, X, Y, W, H, ahk_id %hwnd%
   
   DeltaW := Round(W/(!wp ? 10 : 11))
   DeltaW := wp ? -DeltaW : DeltaW
   ResultW := W + DeltaW
   ResultH := Round(ResultW/RatioBM)
   ResultX := X - Round(DeltaW/2)
   ResultY := Y - Round((ResultH - H)/2)
   SquareWin := ResultW*ResultH
   if (!wp &amp;&amp; SquareWin &gt; 13000000) || (wp &amp;&amp; SquareWin &lt; 1000 &amp;&amp; SquareWin &lt; SquareBM)
      Return, &quot;&quot;, Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

   hbm := CreateDIBSection(ResultW, ResultH)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   
   Gdip_SetInterpolationMode(G, 7)
   Gdip_DrawImage(G, pBitmap, 0, 0, ResultW, ResultH, 0, 0, WidthBM, HeightBM)
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, ResultW - 2, ResultH - 2)
   
   UpdateLayeredWindow(hwnd, hdc, ResultX, ResultY, ResultW, ResultH)

   Gdip_DeletePen(pPen), SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Mon, 17 Oct 2022 19:47:08 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155332#p155332</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155331#p155331</link>
			<description><![CDATA[<div class="quotebox"><cite>Ядрён пишет:</cite><blockquote><p>WM_RBUTTONUP -удаление окна</p></blockquote></div><p>Понял.<br /></p><div class="codebox"><pre><code>WM_RBUTTONUP()
{
      if (A_Gui != &quot;Select&quot;)  {
     Gdip_SetBitmapToClipboard(pBitmap)
     DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
     Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
      Gui, %A_Gui%:Destroy
   }

}</code></pre></div><p>А что там делает строка<br /></p><div class="codebox"><pre><code>Gdip_SetBitmapToClipboard(pBitmap)</code></pre></div><p>? Она явно лишняя. А в коде<br /></p><div class="codebox"><pre><code>WM_MBUTTONDOWN()
{
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])

Gui, %A_Gui%:Hide
   FileSelectFile, SelectFile, S3, %A_Now%.png , Сохранить скриншот, All Files(*.*)
      res := Gdip_SaveBitmapToFile(pBitmap, SelectFile )

   DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
   oGuiData.Delete(A_Gui)
   Gui, %A_Gui%:Destroy
   Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
}</code></pre></div><p>не сохранён приведённый мной алгоритм, там<br /></p><div class="codebox"><pre><code>if (A_Gui != &quot;Select&quot;)</code></pre></div><p>совсем не напрасно было.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 17 Oct 2022 18:46:30 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155331#p155331</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155330#p155330</link>
			<description><![CDATA[<p>Уважаемый <strong>teadrinker</strong> я всё исправил. <br />Был не прав.</p>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Mon, 17 Oct 2022 18:41:03 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155330#p155330</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155328#p155328</link>
			<description><![CDATA[<p>Почему баг, изначально функционал для сохранения в буфер обмена не предполагался. Версия, которую вы выложили, не сохраняет даже изначальный размер. Проверяйте код, перед тем как выкладывать.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 17 Oct 2022 18:30:58 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155328#p155328</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155327#p155327</link>
			<description><![CDATA[<p>Доброго времени суток. Обнаружил в работе скрипта баг. Если выделенную часть экрана заскролить <br />&quot;<strong>WheelDown</strong>&quot; &quot;<strong>WheelUp</strong>&quot;(увеличить или уменьшить окно) а потом сохранить или копировать картинку в буфер то сохраняется картинка изначального размера т.е(без увеличения или уменьшения окна). Помогите пожалуйста разобраться.</p><div class="codebox"><pre><code>/*
Скрипт снимает скриншот выделенной области экрана и показывает его поверх всех окон.
Скрипт также позволяет изменять размеры скриншота при вращении над ним колеса мыши.
Ctrl + Space — начать выделение (отпустив Ctrl + Space).
Двигать окно со скриншотом левой кнопкой, менять размер вращая колесо, закрыть — щелчком правой.

Для работы скрипта необходима библиотека Gdip.ahk
https://www.dropbox.com/s/73vpu9xdzn5ys13/Gdip.ahk?dl=1
*/

CoordMode, Mouse
SetBatchLines, -1
SetWinDelay, 0
SetWorkingDir, % A_ScriptDir
OnExit, Exit
global oGuiData := []

OnMessage(0x112, &quot;WM_SYSCOMMAND&quot;)
OnMessage(0x201, &quot;WM_LBUTTONDOWN&quot;)
OnMessage(0x205, &quot;WM_RBUTTONUP&quot;)
OnMessage(0x203, &quot;WM_LBUTTONDBLCLK&quot;)
Return

Exit:
   (CrossHair &amp;&amp; CrossHair())
   (hHookMouse &amp;&amp; DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse))
   for k, v in oGuiData
      DllCall(&quot;DeleteObject&quot;, Ptr, v)
   ExitApp

*~$vk2C::CrossHair(CrossHair := 1)

#If CrossHair = 1
LButton::
   MouseGetPos, mouse_x_start, mouse_y_start
   
   Gui, Select:Default
   Gui, -Caption +ToolWindow +LastFound +AlwaysOnTop -DPIScale
   Gui, Color, Grey
   WinSet, Transparent, 150
   
   hHookMouse := DllCall(&quot;SetWindowsHookEx&quot;
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback(&quot;LowLevelMouseProc&quot;, &quot;Fast&quot;)
      , Ptr, DllCall(&quot;GetModuleHandle&quot;, UInt, 0, Ptr)
      , UInt, 0, Ptr)
      
   KeyWait, LButton
   SetTimer, EventHandling, Off
   DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse), hHookMouse := &quot;&quot;
   CrossHair(CrossHair := &quot;&quot;)
   WinGetPos, X, Y, W, H
   Gui, Destroy
   CreateScreenshotWindow(X, Y, W, H)
   Return

#If hGui := ScreenWindowUnderCursor()
WheelDown::
WheelUp:: WM_WHEEL(A_ThisHotkey = &quot;WheelUp&quot; ? 0 : 1, hGui)
   
CrossHair(OnOff = &quot;&quot;)
{
   static IDC_CROSS := 32515, SPI_SETCURSORS := 0x57
      , hCursor := DllCall(&quot;LoadCursor&quot;, Ptr, 0, UInt, IDC_CROSS, Ptr)
      , sys_cursors := [32512,32513,32514,32516,32642,32643,32644,32645,32646,32648,32649,32650]
   
   if !OnOff
      DllCall(&quot;SystemParametersInfo&quot;, UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   else
      for k, cursor in sys_cursors
         hCopy := DllCall(&quot;CopyImage&quot;, Ptr, hCursor, UInt, 2, Int, 0, Int, 0, UInt, 0)
         , DllCall(&quot;SetSystemCursor&quot;, Ptr, hCopy, UInt, cursor)
}
       
LowLevelMouseProc(nCode, wParam, lParam)
{
   static mouse_x, mouse_y, WM_MOUSEMOVE := 0x200
   global mouse_x_start, mouse_y_start

   if (wParam = WM_MOUSEMOVE)  {
      mouse_x := NumGet(lParam + 0, &quot;Int&quot;)
      mouse_y := NumGet(lParam + 4, &quot;Int&quot;)
      SetTimer, EventHandling, -10
   }
   Return DllCall(&quot;CallNextHookEx&quot;, Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   x := mouse_x_start &lt; mouse_x ? mouse_x_start : mouse_x
   y := mouse_y_start &lt; mouse_y ? mouse_y_start : mouse_y
   w := Abs(mouse_x - mouse_x_start)
   h := Abs(mouse_y - mouse_y_start)
   Gui, Select:Show, x%x% y%y% w%w% h%h% NA
   Return
}

CreateScreenshotWindow(X, Y, W, H)
{
   static WS_EX_LAYERED := 0x80000
   
   pToken := Gdip_Startup()
   pBitmap := Gdip_BitmapFromScreen( X &quot;|&quot; Y &quot;|&quot; W &quot;|&quot; H )
   
   hbm := CreateDIBSection(W, H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, W, H)
   
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, W - 2, H - 2)
   Gdip_DeletePen(pPen)
   
   for k, v in oGuiData
      if (v = 0 &amp;&amp; IsEmpty := 1)
         break
      
   Gui, New, -Caption +E%WS_EX_LAYERED% +LastFound +AlwaysOnTop +ToolWindow +hwndhGui -DPIScale
   Gui, Show, NA
   oGuiData[hGui] := Gdip_CreateHBITMAPFromBitmap(pBitmap)
   UpdateLayeredWindow(hGui, hdc, X, Y, W, H)
   
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
}

ScreenWindowUnderCursor()
{
   MouseGetPos,,, hGui
   WinGet, PID, Pid, ahk_id %hGui%
   if DllCall(&quot;GetCurrentProcessId&quot;) = PID
      Return hGui
}

WM_LBUTTONDOWN()
{
   if (A_Gui != &quot;Select&quot;)
      PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
}

WM_LBUTTONDBLCLK()
{
    if (A_Gui != &quot;Select&quot;)  {
     pToken := Gdip_Startup()
     pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])
     Gui, %A_Gui%:Hide
     FileSelectFile, SelectFile, S3, %A_Now%.png , Сохранить скриншот, All Files(*.*)
     Gdip_SaveBitmapToFile(pBitmap, SelectFile )
     DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
     oGuiData.Delete(A_Gui)
     Gui, %A_Gui%:Destroy
     Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
    }
}

WM_RBUTTONUP()
{
     if (A_Gui != &quot;Select&quot;)  {
      pToken := Gdip_Startup()
      pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])
      Gdip_SetBitmapToClipboard(pBitmap)
      Gdip_DisposeImage(pBitmap)
      Gdip_Shutdown(pToken)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}

WM_SYSCOMMAND(wp)
{
   static SC_CLOSE := 0xF060
   if (wp = SC_CLOSE &amp;&amp; A_Gui != &quot;Select&quot;)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui]), oGuiData.Delete(A_Gui)
}

WM_WHEEL(wp, hwnd)
{
   Critical
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[hwnd])
   Gdip_GetImageDimensions(pBitmap, WidthBM, HeightBM)
   RatioBM := WidthBM/HeightBM
   SquareBM := WidthBM*HeightBM
   
   WinGetPos, X, Y, W, H, ahk_id %hwnd%
   
   DeltaW := Round(W/(!wp ? 10 : 11))
   DeltaW := wp ? -DeltaW : DeltaW
   ResultW := W + DeltaW
   ResultH := Round(ResultW/RatioBM)
   ResultX := X - Round(DeltaW/2)
   ResultY := Y - Round((ResultH - H)/2)
   SquareWin := ResultW*ResultH
   if (!wp &amp;&amp; SquareWin &gt; 13000000) || (wp &amp;&amp; SquareWin &lt; 1000 &amp;&amp; SquareWin &lt; SquareBM)
      Return, &quot;&quot;, Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

   hbm := CreateDIBSection(ResultW, ResultH)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   
   Gdip_SetInterpolationMode(G, 7)
   Gdip_DrawImage(G, pBitmap, 0, 0, ResultW, ResultH, 0, 0, WidthBM, HeightBM)
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, ResultW - 2, ResultH - 2)
   
   UpdateLayeredWindow(hwnd, hdc, ResultX, ResultY, ResultW, ResultH)

   Gdip_DeletePen(pPen), SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Mon, 17 Oct 2022 18:02:05 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155327#p155327</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155301#p155301</link>
			<description><![CDATA[<p>Отлично, лучше так:<br /></p><div class="codebox"><pre><code>WM_RBUTTONUP()
{
   if (A_Gui != &quot;Select&quot;)  {
      pToken := Gdip_Startup()
      pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])
      Gdip_SetBitmapToClipboard(pBitmap)
      Gdip_DisposeImage(pBitmap)
      Gdip_Shutdown(pToken)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 16 Oct 2022 20:35:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155301#p155301</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155300#p155300</link>
			<description><![CDATA[<p>Уважаемый <strong>teadrinker</strong> большое спасибо за подсказку .</p><div class="codebox"><pre><code>WM_RBUTTONUP()
{
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])

   res := Gdip_SetBitmapToClipboard(pBitmap)

   if (A_Gui != &quot;Select&quot;)  {
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}
</code></pre></div><p>Так всё получилось.</p>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Sun, 16 Oct 2022 20:19:27 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155300#p155300</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155297#p155297</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Используйте Gdip_SetBitmapToClipboard().</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 16 Oct 2022 15:19:53 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155297#p155297</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155292#p155292</link>
			<description><![CDATA[<p>Уважаемый <strong>teadrinker</strong> что то не получается.</p><div class="codebox"><pre><code>WM_RBUTTONUP()
{

 pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])
   if (A_Gui != &quot;Select&quot;)  {
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}</code></pre></div><p>Вот так помещает в буфер скрин полного экрана а не выделенной части экрана.</p>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Sat, 15 Oct 2022 23:36:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155292#p155292</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155291#p155291</link>
			<description><![CDATA[<p>Используйте Gdip_SetBitmapToClipboard().</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 15 Oct 2022 22:44:09 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155291#p155291</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=155290#p155290</link>
			<description><![CDATA[<p>Доброго времени суток. Подскажите как сделать при исчезании окна копирование выделенной части в буфер.</p><div class="codebox"><pre><code>WM_RBUTTONUP()
{
   if (A_Gui != &quot;Select&quot;)  {
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}
</code></pre></div><p>Где то здесь я думаю.</p><div class="codebox"><pre><code>/*
Скрипт снимает скриншот выделенной области экрана и показывает его поверх всех окон.
Скрипт также позволяет изменять размеры скриншота при вращении над ним колеса мыши.
Ctrl + Space — начать выделение (отпустив Ctrl + Space).
Двигать окно со скриншотом левой кнопкой, менять размер вращая колесо, закрыть — щелчком правой.

Для работы скрипта необходима библиотека Gdip.ahk
https://www.dropbox.com/s/73vpu9xdzn5ys13/Gdip.ahk?dl=1
*/

CoordMode, Mouse
SetBatchLines, -1
SetWinDelay, 0
SetWorkingDir, % A_ScriptDir
OnExit, Exit
global oGuiData := []

OnMessage(0x112, &quot;WM_SYSCOMMAND&quot;)
OnMessage(0x201, &quot;WM_LBUTTONDOWN&quot;)
OnMessage(0x205, &quot;WM_RBUTTONUP&quot;)
OnMessage(0x203, &quot;WM_LBUTTONDBLCLK&quot;)
Return

Exit:
   (CrossHair &amp;&amp; CrossHair())
   (hHookMouse &amp;&amp; DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse))
   for k, v in oGuiData
      DllCall(&quot;DeleteObject&quot;, Ptr, v)
   ExitApp

*~$vk2C::CrossHair(CrossHair := 1)

#If CrossHair = 1
LButton::
   MouseGetPos, mouse_x_start, mouse_y_start
   
   Gui, Select:Default
   Gui, -Caption +ToolWindow +LastFound +AlwaysOnTop -DPIScale
   Gui, Color, Grey
   WinSet, Transparent, 150
   
   hHookMouse := DllCall(&quot;SetWindowsHookEx&quot;
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback(&quot;LowLevelMouseProc&quot;, &quot;Fast&quot;)
      , Ptr, DllCall(&quot;GetModuleHandle&quot;, UInt, 0, Ptr)
      , UInt, 0, Ptr)
      
   KeyWait, LButton
   SetTimer, EventHandling, Off
   DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse), hHookMouse := &quot;&quot;
   CrossHair(CrossHair := &quot;&quot;)
   WinGetPos, X, Y, W, H
   Gui, Destroy
   CreateScreenshotWindow(X, Y, W, H)
   Return

#If hGui := ScreenWindowUnderCursor()
WheelDown::
WheelUp:: WM_WHEEL(A_ThisHotkey = &quot;WheelUp&quot; ? 0 : 1, hGui)
   
CrossHair(OnOff = &quot;&quot;)
{
   static IDC_CROSS := 32515, SPI_SETCURSORS := 0x57
      , hCursor := DllCall(&quot;LoadCursor&quot;, Ptr, 0, UInt, IDC_CROSS, Ptr)
      , sys_cursors := [32512,32513,32514,32516,32642,32643,32644,32645,32646,32648,32649,32650]
   
   if !OnOff
      DllCall(&quot;SystemParametersInfo&quot;, UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   else
      for k, cursor in sys_cursors
         hCopy := DllCall(&quot;CopyImage&quot;, Ptr, hCursor, UInt, 2, Int, 0, Int, 0, UInt, 0)
         , DllCall(&quot;SetSystemCursor&quot;, Ptr, hCopy, UInt, cursor)
}
       
LowLevelMouseProc(nCode, wParam, lParam)
{
   static mouse_x, mouse_y, WM_MOUSEMOVE := 0x200
   global mouse_x_start, mouse_y_start

   if (wParam = WM_MOUSEMOVE)  {
      mouse_x := NumGet(lParam + 0, &quot;Int&quot;)
      mouse_y := NumGet(lParam + 4, &quot;Int&quot;)
      SetTimer, EventHandling, -10
   }
   Return DllCall(&quot;CallNextHookEx&quot;, Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   x := mouse_x_start &lt; mouse_x ? mouse_x_start : mouse_x
   y := mouse_y_start &lt; mouse_y ? mouse_y_start : mouse_y
   w := Abs(mouse_x - mouse_x_start)
   h := Abs(mouse_y - mouse_y_start)
   Gui, Select:Show, x%x% y%y% w%w% h%h% NA
   Return
}

CreateScreenshotWindow(X, Y, W, H)
{
   static WS_EX_LAYERED := 0x80000
   
   pToken := Gdip_Startup()
   pBitmap := Gdip_BitmapFromScreen( X &quot;|&quot; Y &quot;|&quot; W &quot;|&quot; H )
   
   hbm := CreateDIBSection(W, H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, W, H)
   
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, W - 2, H - 2)
   Gdip_DeletePen(pPen)
   
   for k, v in oGuiData
      if (v = 0 &amp;&amp; IsEmpty := 1)
         break
      
   Gui, New, -Caption +E%WS_EX_LAYERED% +LastFound +AlwaysOnTop +ToolWindow +hwndhGui -DPIScale
   Gui, Show, NA
   oGuiData[hGui] := Gdip_CreateHBITMAPFromBitmap(pBitmap)
   UpdateLayeredWindow(hGui, hdc, X, Y, W, H)
   
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
}

ScreenWindowUnderCursor()
{
   MouseGetPos,,, hGui
   WinGet, PID, Pid, ahk_id %hGui%
   if DllCall(&quot;GetCurrentProcessId&quot;) = PID
      Return hGui
}

WM_LBUTTONDOWN()
{
   if (A_Gui != &quot;Select&quot;)
      PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
}

WM_LBUTTONDBLCLK()
{
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])

Gui, %A_Gui%:Hide
FileSelectFile, SelectFile, S3, %A_Now%.png , Сохранить скриншот, All Files(*.*)

   
 res := Gdip_SaveBitmapToFile(pBitmap, SelectFile )




 DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
   oGuiData.Delete(A_Gui)
   Gui, %A_Gui%:Destroy
   Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

  ; if (res = 0)  

      ;MsgBox, Скриншот успешно сохранён: `n%SelectFile%\%A_Now%.png
  ;else

      ;MsgBox, Не удалось сохранить скриншот. Ошибка: %res%
}



WM_RBUTTONUP()
{
   if (A_Gui != &quot;Select&quot;)  {
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}

WM_SYSCOMMAND(wp)
{
   static SC_CLOSE := 0xF060
   if (wp = SC_CLOSE &amp;&amp; A_Gui != &quot;Select&quot;)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui]), oGuiData.Delete(A_Gui)
}

WM_WHEEL(wp, hwnd)
{
   Critical
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[hwnd])
   Gdip_GetImageDimensions(pBitmap, WidthBM, HeightBM)
   RatioBM := WidthBM/HeightBM
   SquareBM := WidthBM*HeightBM
   
   WinGetPos, X, Y, W, H, ahk_id %hwnd%
   
   DeltaW := Round(W/(!wp ? 10 : 11))
   DeltaW := wp ? -DeltaW : DeltaW
   ResultW := W + DeltaW
   ResultH := Round(ResultW/RatioBM)
   ResultX := X - Round(DeltaW/2)
   ResultY := Y - Round((ResultH - H)/2)
   SquareWin := ResultW*ResultH
   if (!wp &amp;&amp; SquareWin &gt; 13000000) || (wp &amp;&amp; SquareWin &lt; 1000 &amp;&amp; SquareWin &lt; SquareBM)
      Return, &quot;&quot;, Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

   hbm := CreateDIBSection(ResultW, ResultH)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   
   Gdip_SetInterpolationMode(G, 7)
   Gdip_DrawImage(G, pBitmap, 0, 0, ResultW, ResultH, 0, 0, WidthBM, HeightBM)
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, ResultW - 2, ResultH - 2)
   
   UpdateLayeredWindow(hwnd, hdc, ResultX, ResultY, ResultW, ResultH)

   Gdip_DeletePen(pPen), SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Sat, 15 Oct 2022 20:36:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=155290#p155290</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=151938#p151938</link>
			<description><![CDATA[<p>Доброго времени суток. Помогите пожалуйста сделать кнопки на окне поделиться скриншотом в Telegram и WhatsApp .</p><div class="codebox"><pre><code>/*
Скрипт снимает скриншот выделенной области экрана и показывает его поверх всех окон.
Скрипт также позволяет изменять размеры скриншота при вращении над ним колеса мыши.
Ctrl + Space — начать выделение (отпустив Ctrl + Space).
Двигать окно со скриншотом левой кнопкой, менять размер вращая колесо, закрыть — щелчком правой.

Для работы скрипта необходима библиотека Gdip.ahk
https://www.dropbox.com/s/73vpu9xdzn5ys13/Gdip.ahk?dl=1
*/

CoordMode, Mouse
SetBatchLines, -1
SetWinDelay, 0
SetWorkingDir, % A_ScriptDir
OnExit, Exit
global oGuiData := []

OnMessage(0x112, &quot;WM_SYSCOMMAND&quot;)
OnMessage(0x201, &quot;WM_LBUTTONDOWN&quot;)
OnMessage(0x205, &quot;WM_RBUTTONUP&quot;)
OnMessage(0x203, &quot;WM_LBUTTONDBLCLK&quot;)
Return

Exit:
   (CrossHair &amp;&amp; CrossHair())
   (hHookMouse &amp;&amp; DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse))
   for k, v in oGuiData
      DllCall(&quot;DeleteObject&quot;, Ptr, v)
   ExitApp

*~$vk2C::CrossHair(CrossHair := 1)

#If CrossHair = 1
LButton::
   MouseGetPos, mouse_x_start, mouse_y_start
   
   Gui, Select:Default
   Gui, -Caption +ToolWindow +LastFound +AlwaysOnTop -DPIScale
   Gui, Color, Grey
   WinSet, Transparent, 150
   
   hHookMouse := DllCall(&quot;SetWindowsHookEx&quot;
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback(&quot;LowLevelMouseProc&quot;, &quot;Fast&quot;)
      , Ptr, DllCall(&quot;GetModuleHandle&quot;, UInt, 0, Ptr)
      , UInt, 0, Ptr)
      
   KeyWait, LButton
   SetTimer, EventHandling, Off
   DllCall(&quot;UnhookWindowsHookEx&quot;, Ptr, hHookMouse), hHookMouse := &quot;&quot;
   CrossHair(CrossHair := &quot;&quot;)
   WinGetPos, X, Y, W, H
   Gui, Destroy
   CreateScreenshotWindow(X, Y, W, H)
   Return

#If hGui := ScreenWindowUnderCursor()
WheelDown::
WheelUp:: WM_WHEEL(A_ThisHotkey = &quot;WheelUp&quot; ? 0 : 1, hGui)
   
CrossHair(OnOff = &quot;&quot;)
{
   static IDC_CROSS := 32515, SPI_SETCURSORS := 0x57
      , hCursor := DllCall(&quot;LoadCursor&quot;, Ptr, 0, UInt, IDC_CROSS, Ptr)
      , sys_cursors := [32512,32513,32514,32516,32642,32643,32644,32645,32646,32648,32649,32650]
   
   if !OnOff
      DllCall(&quot;SystemParametersInfo&quot;, UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   else
      for k, cursor in sys_cursors
         hCopy := DllCall(&quot;CopyImage&quot;, Ptr, hCursor, UInt, 2, Int, 0, Int, 0, UInt, 0)
         , DllCall(&quot;SetSystemCursor&quot;, Ptr, hCopy, UInt, cursor)
}
       
LowLevelMouseProc(nCode, wParam, lParam)
{
   static mouse_x, mouse_y, WM_MOUSEMOVE := 0x200
   global mouse_x_start, mouse_y_start

   if (wParam = WM_MOUSEMOVE)  {
      mouse_x := NumGet(lParam + 0, &quot;Int&quot;)
      mouse_y := NumGet(lParam + 4, &quot;Int&quot;)
      SetTimer, EventHandling, -10
   }
   Return DllCall(&quot;CallNextHookEx&quot;, Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   x := mouse_x_start &lt; mouse_x ? mouse_x_start : mouse_x
   y := mouse_y_start &lt; mouse_y ? mouse_y_start : mouse_y
   w := Abs(mouse_x - mouse_x_start)
   h := Abs(mouse_y - mouse_y_start)
   Gui, Select:Show, x%x% y%y% w%w% h%h% NA
   Return
}

CreateScreenshotWindow(X, Y, W, H)
{
   static WS_EX_LAYERED := 0x80000
   
   pToken := Gdip_Startup()
   pBitmap := Gdip_BitmapFromScreen( X &quot;|&quot; Y &quot;|&quot; W &quot;|&quot; H )
   
   hbm := CreateDIBSection(W, H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, W, H)
   
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, W - 2, H - 2)
   Gdip_DeletePen(pPen)
   
   for k, v in oGuiData
      if (v = 0 &amp;&amp; IsEmpty := 1)
         break
      
   Gui, New, -Caption +E%WS_EX_LAYERED% +LastFound +AlwaysOnTop +ToolWindow +hwndhGui -DPIScale
   Gui, Show, NA
   oGuiData[hGui] := Gdip_CreateHBITMAPFromBitmap(pBitmap)
   UpdateLayeredWindow(hGui, hdc, X, Y, W, H)
   
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
}

ScreenWindowUnderCursor()
{
   MouseGetPos,,, hGui
   WinGet, PID, Pid, ahk_id %hGui%
   if DllCall(&quot;GetCurrentProcessId&quot;) = PID
      Return hGui
}

WM_LBUTTONDOWN()
{
   if (A_Gui != &quot;Select&quot;)
      PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
}

WM_LBUTTONDBLCLK()
{
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[A_Gui])

Gui, %A_Gui%:Hide
FileSelectFile, SelectFile, S3, %A_Now%.png , Сохранить скриншот, All Files(*.*)

   
 res := Gdip_SaveBitmapToFile(pBitmap, SelectFile )




 DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
   oGuiData.Delete(A_Gui)
   Gui, %A_Gui%:Destroy
   Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

  ; if (res = 0)  

      ;MsgBox, Скриншот успешно сохранён: `n%SelectFile%\%A_Now%.png
  ;else

      ;MsgBox, Не удалось сохранить скриншот. Ошибка: %res%
}



WM_RBUTTONUP()
{
   if (A_Gui != &quot;Select&quot;)  {
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui])
      oGuiData.Delete(A_Gui)
      Gui, %A_Gui%:Destroy
   }
}

WM_SYSCOMMAND(wp)
{
   static SC_CLOSE := 0xF060
   if (wp = SC_CLOSE &amp;&amp; A_Gui != &quot;Select&quot;)
      DllCall(&quot;DeleteObject&quot;, Ptr, oGuiData[A_Gui]), oGuiData.Delete(A_Gui)
}

WM_WHEEL(wp, hwnd)
{
   Critical
   pToken := Gdip_Startup()
   pBitmap := Gdip_CreateBitmapFromHBITMAP(oGuiData[hwnd])
   Gdip_GetImageDimensions(pBitmap, WidthBM, HeightBM)
   RatioBM := WidthBM/HeightBM
   SquareBM := WidthBM*HeightBM
   
   WinGetPos, X, Y, W, H, ahk_id %hwnd%
   
   DeltaW := Round(W/(!wp ? 10 : 11))
   DeltaW := wp ? -DeltaW : DeltaW
   ResultW := W + DeltaW
   ResultH := Round(ResultW/RatioBM)
   ResultX := X - Round(DeltaW/2)
   ResultY := Y - Round((ResultH - H)/2)
   SquareWin := ResultW*ResultH
   if (!wp &amp;&amp; SquareWin &gt; 13000000) || (wp &amp;&amp; SquareWin &lt; 1000 &amp;&amp; SquareWin &lt; SquareBM)
      Return, &quot;&quot;, Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

   hbm := CreateDIBSection(ResultW, ResultH)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   
   Gdip_SetInterpolationMode(G, 7)
   Gdip_DrawImage(G, pBitmap, 0, 0, ResultW, ResultH, 0, 0, WidthBM, HeightBM)
   pPen := Gdip_CreatePen(0xFF808080, 2)
   Gdip_DrawRectangle(G, pPen, 1, 1, ResultW - 2, ResultH - 2)
   
   UpdateLayeredWindow(hwnd, hdc, ResultX, ResultY, ResultW, ResultH)

   Gdip_DeletePen(pPen), SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Tue, 01 Feb 2022 20:54:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=151938#p151938</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Скриншот выделенной части экрана поверх всех окон]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=113942#p113942</link>
			<description><![CDATA[<p><strong>Всем</strong> <strong>огромное</strong> спасибо разобрался.<br /></p><div class="codebox"><pre><code>FileSelectFile, SelectFile, S3, %A_Now%.png , Сохранить скриншот, All Files(*.*)
 Gdip_SaveBitmapToFile(pBitmap, SelectFile)</code></pre></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>Ну я и тугой .Хотя ребёнок малениький 2.5 месяца отходишь то и дело и сосредоточиться нереально.</p></div></div>]]></description>
			<author><![CDATA[null@example.com (Ядрён)]]></author>
			<pubDate>Wed, 22 Mar 2017 19:40:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=113942#p113942</guid>
		</item>
	</channel>
</rss>
