1

Тема: AHK: Скриншот выделенной части экрана поверх всех окон

Доброго времени суток. Есть задумка сделать скриншот выделенной части экрана по горячей клавише и показать его поверх всех окон . Помогите реализовать пожалуйста.

2

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Начинайте, поможем.

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

3 (изменено: Ядрён, 2015-01-15 02:58:30)

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Вот мои задумки по поводу готовой программы , которая на F9 фотографирует выделенную часть экрана.

#NoEnv
#Persistent
WS_EX_TRANSPARENT := 0x20
WS_EX_LAYERED := 0x80000

*~F9::
IfExist, C:\Users\roma\Pictures\GameCenter\WEQ\Desktop\*.jpeg
Gui, -Caption +AlwaysOnTop +Lastfound +ToolWindow 
Gui, Color, EEAA99
WinSet TransColor, EEAA99
Gui, Add, Picture, AltSubmit , C:\Users\roma\Pictures\GameCenter\WEQ\Desktop\*.jpeg
Gui, Show, NA
Return

*~F7::
FileDelete, C:\Users\roma\Pictures\GameCenter\WEQ\Desktop\*.jpeg


GuiClose:
ExitApp

Но вот как всё это подогнать что бы работало . Я весь измучился. Мне кажется легче на "AHK" всё написать чем всё это подгонять.

4

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Честно говоря, задумку не понял. Как скрипт должен работать?

Если что, в коллекции есть мой скрипт для снятия скриншотов (правда, только под 32-bit, и скриншот не показывает). Для того, чтобы разобраться, в принципе сойдёт.
Кроме того, есть не совсем доделанный подобный код, который может показывать (опционально) скриншот перед сохранением и даже менять его размеры. Если нужно, могу выложить.

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

5

Re: AHK: Скриншот выделенной части экрана поверх всех окон

teadrinker пишет:

Честно говоря, задумку не понял. Как скрипт должен работать?

Если что, в коллекции есть мой скрипт для снятия скриншотов (правда, только под 32-bit, и скриншот не показывает). Для того, чтобы разобраться, в принципе сойдёт.
Кроме того, есть не совсем доделанный подобный код, который может показывать (опционально) скриншот перед сохранением и даже менять его размеры. Если нужно, могу выложить.


Ну скрипт из коллекции я нашёл своими силами,за старание всё равно спасибо но подогнать его я не смог. Задумка такая в браузере нужно списать информацию с одного сайта на другой . Вот  ссылка на "Мас" приложение , там всё описано.

6 (изменено: teadrinker, 2015-01-17 00:29:50)

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Вот простенький скрипт:

CoordMode, Mouse
SetBatchLines, -1
SetWinDelay, 0
OnExit, Exit
oGuiData := []
OnMessage(0x112, "WM_SYSCOMMAND")
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0x205, "WM_RBUTTONUP")
Return 

^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("SetWindowsHookEx"
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback("LowLevelMouseProc", "Fast")
      , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
      , UInt, 0, Ptr)
      
   KeyWait, LButton
   DllCall("UnhookWindowsHookEx", Ptr, hHookMouse), hHookMouse := ""
   CrossHair(CrossHair := "")
   WinGetPos, X, Y, W, H
   Gui, Destroy
   CreateScreenshotWindow([X, Y, W, H])
   Return
   
Exit:
   (CrossHair && CrossHair())
   (hHookMouse && DllCall("UnhookWindowsHookEx", Ptr, hHookMouse))
   for k, v in oGuiData
      (v != 0 && DllCall("DeleteObject", Ptr, v))
   ExitApp

CrossHair(OnOff = "")
{
   static IDC_CROSS := 32515, SPI_SETCURSORS := 0x57
      , hCursor := DllCall("LoadCursor", Ptr, 0, UInt, IDC_CROSS, Ptr)
      , sys_cursors := [32512,32513,32514,32516,32642,32643,32644,32645,32646,32648,32649,32650]
   
   if !OnOff
      DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   else
      for k, cursor in sys_cursors
         hCopy := DllCall("CopyImage", Ptr, hCursor, UInt, 2, Int, 0, Int, 0, UInt, 0)
         , DllCall("SetSystemCursor", 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, "Int")
      mouse_y := NumGet(lParam + 4, "Int")
      SetTimer, EventHandling, -10
   }
   Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   x := mouse_x_start < mouse_x ? mouse_x_start : mouse_x
   y := mouse_y_start < 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(oCoords)
{
   global oGuiData
   static SS_BITMAP := 0xE
   
   pToken := Gdip_Startup()
   pBitmap := Gdip_BitmapFromScreen(oCoords[1] "|" oCoords[2] "|" oCoords[3] "|" oCoords[4])
   Gdip_GetImageDimensions(pBitmap, W, H)
   hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
   Gdip_DisposeImage(pBitmap)
   
   for k, v in oGuiData
      if (v = 0 && IsEmpty := k)
         break
      
   nGui := IsEmpty ? IsEmpty : (k = "" || k = 99) ? 1 : k + 1
   oGuiData[nGui] := hBitmap

   Gui, %nGui%:New
   Gui, %nGui%:Default
   Gui, -Caption +ToolWindow +AlwaysOnTop +LastFound +Border -DPIScale
   Gui, Margin, 0, 0
   Gui, Add, Pic, hwndhPic w%W% h%H% %SS_BITMAP%
   SetImage(hPic, hBitmap)
   Gui, Show, % "x" oCoords[1] " y" oCoords[2]
   
   Gdip_Shutdown(pToken)
}

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

WM_RBUTTONUP()
{
   global oGuiData
   if (A_Gui != "Select")  {
      DllCall("DeleteObject", Ptr, oGuiData[A_Gui])
      oGuiData[A_Gui] := 0
      Gui, %A_Gui%:Destroy
   }
}

WM_SYSCOMMAND(wp)
{
   global oGuiData
   static SC_CLOSE := 0xF060
   if (wp = SC_CLOSE && A_Gui != "Select")
      DllCall("DeleteObject", Ptr, oGuiData[A_Gui]), oGuiData[A_Gui] := 0
}

Нужна библиотека Gdip.ahk.
Ctrl + Space — начать выделение (отпустив Ctrl + Space).
Двигать окно со скриншотом левой кнопкой, закрыть — щелчком правой.

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

7 (изменено: Ядрён, 2015-01-16 14:03:41)

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Огромное вам спасибо teadrinker , то что надо. Хотя и есть небольшая ошибка ,что то связанное с выделением там поле выделения опережает крестик крестик .

8

Re: AHK: Скриншот выделенной части экрана поверх всех окон

У меня, вроде, нормально всё. CoordMode, Mouse не забыли?

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

9

Re: AHK: Скриншот выделенной части экрана поверх всех окон

teadrinker пишет:

У меня, вроде, нормально всё. CoordMode, Mouse не забыли?

Попробуйте сделать скрин где нибудь на тёмном фоне и там будет видна белая полоса справа от скриншота сантиметров на 8 и снизу сантиметра на 3.

10

Re: AHK: Скриншот выделенной части экрана поверх всех окон

У меня никаких полосок нет:

https://cloclo27.cloud.mail.ru/weblink/thumb/w3/c336b62d4dc1/2015.01.16-18.04.40.5.jpg


https://cloclo15.cloud.mail.ru/weblink/thumb/w3/cc542cfe6206/2015.01.16-18.05.02.5.jpg

У кого-нибудь ещё есть полоски?

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

11

Re: AHK: Скриншот выделенной части экрана поверх всех окон

У меня тоже самое, потому всегда добавляю:

Gui, -DPIScale
По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.25.01 (Unicode 32-bit).

12

Re: AHK: Скриншот выделенной части экрана поверх всех окон

С этим ошибка пропадает? Никогда не мог понять, что это даёт?

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

13

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Ну это если в винде увеличенный шрифт, то по умолчанию (+DPIScale) размер окна увеличивается на столько же процентов.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.25.01 (Unicode 32-bit).

14

Re: AHK: Скриншот выделенной части экрана поверх всех окон

С этим нормально работает?

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

15

Re: AHK: Скриншот выделенной части экрана поверх всех окон

+ Так
CoordMode, Mouse
SetBatchLines, -1
SetWinDelay, 0
OnExit, Exit
oGuiData := []
OnMessage(0x112, "WM_SYSCOMMAND")
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0x205, "WM_RBUTTONUP")
Return 

^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("SetWindowsHookEx"
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback("LowLevelMouseProc", "Fast")
      , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
      , UInt, 0, Ptr)
      
   KeyWait, LButton
   DllCall("UnhookWindowsHookEx", Ptr, hHookMouse), hHookMouse := ""
   CrossHair(CrossHair := "")
   WinGetPos, X, Y, W, H
   Gui, Destroy
   CreateScreenshotWindow([X, Y, W, H])
   Return
   
Exit:
   (CrossHair && CrossHair())
   (hHookMouse && DllCall("UnhookWindowsHookEx", Ptr, hHookMouse))
   for k, v in oGuiData
      (v != 0 && DllCall("DeleteObject", Ptr, v))
   ExitApp

CrossHair(OnOff = "")
{
   static IDC_CROSS := 32515, SPI_SETCURSORS := 0x57
      , hCursor := DllCall("LoadCursor", Ptr, 0, UInt, IDC_CROSS, Ptr)
      , sys_cursors := [32512,32513,32514,32516,32642,32643,32644,32645,32646,32648,32649,32650]
   
   if !OnOff
      DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   else
      for k, cursor in sys_cursors
         hCopy := DllCall("CopyImage", Ptr, hCursor, UInt, 2, Int, 0, Int, 0, UInt, 0)
         , DllCall("SetSystemCursor", 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, "Int")
      mouse_y := NumGet(lParam + 4, "Int")
      SetTimer, EventHandling, -10
   }
   Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   x := mouse_x_start < mouse_x ? mouse_x_start : mouse_x
   y := mouse_y_start < 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(oCoords)
{
   global oGuiData
   static SS_BITMAP := 0xE
   
   pToken := Gdip_Startup()
   pBitmap := Gdip_BitmapFromScreen(oCoords[1] "|" oCoords[2] "|" oCoords[3] "|" oCoords[4])
   Gdip_GetImageDimensions(pBitmap, W, H)
   hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
   Gdip_DisposeImage(pBitmap)
   
   for k, v in oGuiData
      if (v = 0 && IsEmpty := k)
         break
      
   nGui := IsEmpty ? IsEmpty : (k = "" || k = 99) ? 1 : k + 1
   oGuiData[nGui] := hBitmap

   Gui, %nGui%:New
   Gui, %nGui%:Default
   Gui, -Caption +ToolWindow +AlwaysOnTop +LastFound +Border -DPIScale
   Gui, Margin, 0, 0
   Gui, Add, Pic, hwndhPic w%W% h%H% %SS_BITMAP%
   SetImage(hPic, hBitmap)
   Gui, Show, % "x" oCoords[1] " y" oCoords[2]
   
   Gdip_Shutdown(pToken)
}

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

WM_RBUTTONUP()
{
   global oGuiData
   if (A_Gui != "Select")  {
      DllCall("DeleteObject", Ptr, oGuiData[A_Gui])
      oGuiData[A_Gui] := 0
      Gui, %A_Gui%:Destroy
   }
}

WM_SYSCOMMAND(wp)
{
   global oGuiData
   static SC_CLOSE := 0xF060
   if (wp = SC_CLOSE && A_Gui != "Select")
      DllCall("DeleteObject", Ptr, oGuiData[A_Gui]), oGuiData[A_Gui] := 0
}

это решается:

там поле выделения опережает крестик

но вот полосы я у себя не наблюдал и до этого.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.25.01 (Unicode 32-bit).

16

Re: AHK: Скриншот выделенной части экрана поверх всех окон

А нет, полосы всё таки были.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.25.01 (Unicode 32-bit).

17

Re: AHK: Скриншот выделенной части экрана поверх всех окон

А, ок, добавлю тогда.

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

18 (изменено: serzh82saratov, 2015-01-17 00:43:36)

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Заметил, что когда несколько скринов на экране, то не понятно в какие моменты (чаще в момент нового снимка) может появится пустое (белое) окно скрипта с заголовком.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.25.01 (Unicode 32-bit).

19

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Появляется когда резко отводишь мышь и отпускаешь LButton, а окно выделения ещё не "догнало" курсор.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.25.01 (Unicode 32-bit).

20 (изменено: Ядрён, 2015-01-17 01:18:35)

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Большое спасибо вам serzh82saratov ваш скрипт работае так как надо без лишних полосок.
А можно узнать что вы поменяли что бы всё заработало.

21

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Ядрён Пожалуйста, Вы тут первый с увеличенным шрифтом, а я второй и последний.
teadrinker полоски убрал, а вот про выделение забыл.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.25.01 (Unicode 32-bit).

22

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Всё спасибо разобрался "-DPIScale"  в двух местах добавили.

23

Re: AHK: Скриншот выделенной части экрана поверх всех окон

serzh82saratov пишет:

Заметил, что когда несколько скринов на экране, то не понятно в какие моменты (чаще в момент нового снимка) может появится пустое (белое) окно скрипта с заголовком.

А скриншот можно?

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

24

Re: AHK: Скриншот выделенной части экрана поверх всех окон

https://cloud.mail.ru/public/0f9d54cd90 … %D0%BA.PNG

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.25.01 (Unicode 32-bit).

25

Re: AHK: Скриншот выделенной части экрана поверх всех окон

Не представляю. В скрипте все окна создаются изначально с опцией -Caption. Если только эта самая -DPIScale с ней как-нибудь не конфликтует.

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