1 (изменено: serzh82saratov, 2016-04-27 02:38:48)

Тема: AHK: Экранная лупа

Перекопав примеры, так и не нашёл код с нормальным указателем пикселя (рамка пикселя который под курсором), поддержкой нескольких мониторов и толковым масштабированием при изменении размера окна лупы.
Наваял код, в нём остались проблемы:

  • [РЕШЕНО] При зуме равном 1, края экрана "зеркалируются". Возможно в параметре dwRop функции  StretchBlt надо скомбинировать флаги (я таковую комбинацию не нашёл), или вообще StretchBlt заменить на другой метод.

  • [РЕШЕНО] Если поставить на паузу (F12), то при сворачивании \ разворачивании прежняя картинка пропадает, также затирается та часть окна, которую при передвижении окна перенесли за край экрана.

  • Небольшие мелькания при изменении увеличения или растягивании окна (терпимо).

+ Старый код.

#NoEnv
#SingleInstance Force
#KeyHistory 0
ListLines Off
SetBatchLines,-1
OnExit, ZoomOnClose

Global oZoom := {}

oZoom.Zoom := 12
oZoom.Mark := "Cross"		; Cross, Square, Grid

WinX := 1559
WinY := 594
WinW := 300
WinH := 360

Gui, Zoom: +AlwaysOnTop +Resize -DPIScale +hwndhGui +LabelZoomOn
Gui, Zoom: Font, s12
Gui, Zoom: Color, ffffff
Gui, Zoom: Add, Slider, vSliderZoom gSliderZoom x8 Range1-50 w176 Center AltSubmit NoTicks, % oZoom.Zoom
Gui, Zoom: Add, Text, vTextZoom Center x+10 yp+3 w36, % oZoom.Zoom
Gui, Zoom: Font
Gui, Zoom: Add, Button, gChangeMark vChangeMark x+10 yp w52, % oZoom.Mark
Gui, Dev: +HWNDhDev -Caption -DPIScale +Parent%hGui%
Gui, Dev: Add, Text, hwndhDevCon
Gui, Dev: Show, NA
Gui, Dev: Color, ffffff

Gui, Zoom: Show, x%WinX% y%WinY% w%WinW% h%WinH%, Magnify
Gui, Zoom: +MinSize

oZoom.hdcSrc := DllCall("GetDC", Ptr, "")
oZoom.hdcDest := DllCall("GetDC", Ptr, hDevCon, Ptr)
DllCall("gdi32.dll\SetStretchBltMode", "Ptr", oZoom.hdcDest, "Int", 4)
oZoom.hGui := hGui
oZoom.hDev := hDev
oZoom.hDevCon := hDevCon
Magnify()
Return

#If !oZoom.Minimize
+Up::MouseMove, 0, -1, 0, R
+Down::MouseMove, 0, 1, 0, R
+Left::MouseMove, -1, 0, 0, R
+Right::MouseMove, 1, 0, 0, R

^Up::
^DoWn::
^WheelUp::
^WheelDown::ChangeZoom(InStr(A_ThisHotKey, "DoWn") ? oZoom.Zoom + 1 : oZoom.Zoom - 1)

F12::Pause
#If

Magnify() {
	S_CoordModeMouse := A_CoordModeMouse
	CoordMode, Mouse, Screen
	MouseGetPos, mX, mY, WinID, CtrlID, 2
	CoordMode, Mouse, %S_CoordModeMouse%
	If (oZoom.hDev != CtrlID)
	{
		StretchBlt(oZoom.hdcDest, oZoom.hdcSrc, 0, 0, oZoom.nWidthDest, oZoom.nHeightDest
			, mX - oZoom.nXOriginSrcOffset, mY - oZoom.nYOriginSrcOffset, oZoom.nWidthSrc, oZoom.nHeightSrc)
		For k, v In oZoom.oMarkers[oZoom.Mark]
			StretchBlt(oZoom.hdcDest, oZoom.hdcDest, v.x, v.y, v.w, v.h, v.x, v.y, v.w, v.h, 0x5A0049)	; PATINVERT
	}
	SetTimer, Magnify, -50
}


SetSize() {
	Static Top := 64, Left := 4, Right := 4, Bottom := 4

	SetTimer, Magnify, Off
	GetClientPos(oZoom.hGui, GuiWidth, GuiHeight)
	Width := GuiWidth - Left - Right
	Height := GuiHeight - Top - Bottom
	Zoom := oZoom.Zoom
	conW := Mod(Width, Zoom) ? Width - Mod(Width, Zoom) + Zoom : Width
	conW := Mod(conW // Zoom, 2) ? conW : conW + Zoom
	conH := Mod(Height, Zoom) ? Height - Mod(Height, Zoom) + Zoom : Height
	conH := Mod(conH // Zoom, 2) ? conH : conH + Zoom
	conX := ((conW - Width) // 2) * -1
	conY :=  ((conH - Height) // 2) * -1

	oZoom.nWidthSrc := conW // Zoom
	oZoom.nHeightSrc := conH // Zoom
	oZoom.nXOriginSrcOffset := oZoom.nWidthSrc//2
	oZoom.nYOriginSrcOffset := oZoom.nHeightSrc//2
	oZoom.nWidthDest := conW
	oZoom.nHeightDest := conH
	oZoom.xCenter := conW / 2 - Zoom / 2
	oZoom.yCenter := conH / 2 - Zoom / 2

	Zoom := oZoom.Zoom
	nWidthDest := oZoom.nWidthDest
	nHeightDest := oZoom.nHeightDest
	xCenter := oZoom.xCenter, yCenter := oZoom.yCenter

	oZoom.oMarkers["Cross"] := [{x:0,y:yCenter - 1,w:nWidthDest,h:1}
		, {x:0,y:yCenter + Zoom,w:nWidthDest,h:1}
		, {x:xCenter - 1,y:0,w:1,h:nHeightDest}
		, {x:xCenter + Zoom,y:0,w:1,h:nHeightDest}]

	oZoom.oMarkers["Square"] := [{x:xCenter - 1,y:yCenter,w:Zoom + 2,h:1}
		, {x:xCenter - 1,y:yCenter + Zoom + 1,w:Zoom + 2,h:1}
		, {x:xCenter - 1,y:yCenter + 1,w:1,h:Zoom}
		, {x:xCenter + Zoom,y:yCenter + 1,w:1,h:Zoom}]

	oZoom.oMarkers["Grid"] := Zoom = 1 ? oZoom.oMarkers["Square"]
		: [{x:xCenter - Zoom,y:yCenter - Zoom,w:Zoom * 3,h:1}
		, {x:xCenter - Zoom,y:yCenter,w:Zoom * 3,h:1}
		, {x:xCenter - Zoom,y:yCenter + Zoom,w:Zoom * 3,h:1}
		, {x:xCenter - Zoom,y:yCenter + Zoom * 2,w:Zoom * 3,h:1}
		, {x:xCenter - Zoom,y:yCenter - Zoom,w:1,h:Zoom * 3}
		, {x:xCenter,y:yCenter - Zoom,w:1,h:Zoom * 3}
		, {x:xCenter + Zoom,y:yCenter - Zoom,w:1,h:Zoom * 3}
		, {x:xCenter + Zoom * 2,y:yCenter - Zoom,w:1,h:Zoom * 3}]

	WinMove, % "ahk_id" oZoom.hDev, , Left, Top, Width, Height
	GuiControl, Dev: -Redraw, % oZoom.hDevCon
	WinMove, % "ahk_id" oZoom.hDevCon, , conX, conY, conW, conH
	Magnify()
	GuiControl, Dev: +Redraw, % oZoom.hDevCon
}

StretchBlt(hdcDest, hdcSrc, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, dwRop = 0xC000CA) {	; MERGECOPY
	DllCall("gdi32.dll\StretchBlt", Ptr, hdcDest
								, Int, nXOriginDest
								, Int, nYOriginDest
								, Int, nWidthDest
								, Int, nHeightDest
								, Ptr, hdcSrc
								, Int, nXOriginSrc
								, Int, nYOriginSrc
								, Int, nWidthSrc
								, Int, nHeightSrc
								, UInt, dwRop)
}

ZoomOnSize() {
	If A_EventInfo != 1
	{
		SetTimer, SetSize, -100
		oZoom.Minimize := 0
	}
	Else
		oZoom.Minimize := 1
}

SliderZoom()  {
	GuiControlGet, SliderZoom, Zoom:
	ChangeZoom(SliderZoom)
}

ChangeZoom(Val)  {
	If (Val < 1 || Val > 50)
		Return
	GuiControl, Zoom: , TextZoom, % oZoom.Zoom := Val
	GuiControl, Zoom: , SliderZoom, % oZoom.Zoom
	SetTimer, SetSize, -150
}

ChangeMark()  {
	oZoom.Mark := ["Cross","Square","Grid","None"][{"Cross":2,"Square":3,"Grid":4,"None":1}[oZoom.Mark]]
	GuiControl, Zoom: , ChangeMark, % oZoom.Mark
}

ZoomOnClose:
	DllCall("gdi32.dll\DeleteDC", "Ptr", oZoom.hdcDest)
	DllCall("gdi32.dll\DeleteDC", "Ptr", oZoom.hdcSrc)
	ExitApp

GetClientPos(hwnd, ByRef W, ByRef H)  {
	VarSetCapacity(pwi, 60, 0), NumPut(60, pwi, 0, "UInt")
	DllCall("GetWindowInfo", "Ptr", hwnd, "UInt", &pwi)
	W := NumGet(pwi, 28, "int") - NumGet(pwi, 20, "int")
	H := NumGet(pwi, 32, "int") - NumGet(pwi, 24, "int")
}

Текущая версия здесь.

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

2

Re: AHK: Экранная лупа

Первый вопрос решился с помощью SetStretchBltMode. Но есть такая фишка, что недействительная область экрана может быть не только чёрной, а белой например.

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

3 (изменено: Alectric, 2016-03-28 17:48:22)

Re: AHK: Экранная лупа

Может у окна "Redraw" отключать во время паузы?...

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

4

Re: AHK: Экранная лупа

Не совсем понял, это как?

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

5

Re: AHK: Экранная лупа

Не знаю, я просто предположил...

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

6

Re: AHK: Экранная лупа

Вообщем по второму вопросу так и не нашёл решения, почему картинка "сделанная" с помощью StretchBlt как бы не "закрепляется", не понятно. Думаю требуются более глубокие познания gdi.

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

7

Re: AHK: Экранная лупа

Возможно стоит смотреть в сторону UpdateLayeredWindow, но сразу не понятно как сделать Layered Window дочерним, аналогично как в коде выше.

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

8

Re: AHK: Экранная лупа

Layered Windows дочерними не бывают. Я бы посмотрел, но пока некогда, завал по работе.

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

9

Re: AHK: Экранная лупа

Спасибо. Пока смотрю в сторону отловить WM_PAINT, и нарисовать прежнюю картинку, но конечно интереснее знать как нарисовать стабильное изображение.

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

10

Re: AHK: Экранная лупа

serzh82saratov пишет:

Пока смотрю в сторону отловить WM_PAINT

А, я просто не совсем понял, вот пример, может, поможет. Вроде, если поставить на паузу, не затирается.

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

11

Re: AHK: Экранная лупа

Что то получается, но как в моём случае сохранить саму картинку чтобы её указать в BitBlt как hdcSrc?



#NoEnv
#SingleInstance Force
#KeyHistory 0
ListLines Off
SetBatchLines,-1
OnExit, ZoomOnClose
OnMessage(0xF, "WM_Paint")
Global oZoom := {} 

oZoom.Zoom := 2
oZoom.Mark := "Cross"		; Cross, Square, Grid

WinX := 1559
WinY := 594
WinW := 300
WinH := 360

Gui, Zoom: +AlwaysOnTop +Resize -DPIScale +hwndhGui +LabelZoomOn
Gui, Zoom: Font, s12
Gui, Zoom: Color, ffffff
Gui, Zoom: Add, Slider, vSliderZoom gSliderZoom x8 Range1-50 w176 Center AltSubmit NoTicks, % oZoom.Zoom
Gui, Zoom: Add, Text, vTextZoom Center x+10 yp+3 w36, % oZoom.Zoom
Gui, Zoom: Font
Gui, Zoom: Add, Button, gChangeMark vChangeMark x+10 yp w52, % oZoom.Mark
Gui, Dev: +HWNDhDev -Caption -DPIScale +Parent%hGui%
Gui, Dev: Add, Pic, hwndhDevCon
Gui, Dev: Show, NA
Gui, Dev: Color, ffffff

Gui, Zoom: Show, x%WinX% y%WinY% w%WinW% h%WinH%, Magnify
Gui, Zoom: +MinSize

oZoom.hdcSrc := DllCall("GetDC", Ptr, "")
oZoom.hdcDest := DllCall("GetDC", Ptr, hDevCon, Ptr)
DllCall("gdi32.dll\SetStretchBltMode", "Ptr", oZoom.hdcDest, "Int", 4)
oZoom.hGui := hGui
oZoom.hDev := hDev
oZoom.hDevCon := hDevCon
Magnify() 
Return

#If !oZoom.Minimize
+Up::MouseMove, 0, -1, 0, R
+Down::MouseMove, 0, 1, 0, R
+Left::MouseMove, -1, 0, 0, R
+Right::MouseMove, 1, 0, 0, R

^Up::
^DoWn::
^WheelUp::
^WheelDown::ChangeZoom(InStr(A_ThisHotKey, "DoWn") ? oZoom.Zoom + 1 : oZoom.Zoom - 1)

1:: oZoom.Pause := !oZoom.Pause
#If

Magnify() {
	S_CoordModeMouse := A_CoordModeMouse
	CoordMode, Mouse, Screen
	MouseGetPos, mX, mY, WinID, CtrlID, 2
	CoordMode, Mouse, %S_CoordModeMouse%
	If (!oZoom.Pause && oZoom.hDev != CtrlID && WinID != oZoom.hGui)
	{  
		StretchBlt(oZoom.hdcDest, 0, 0, oZoom.nWidthDest, oZoom.nHeightDest
			, oZoom.hdcSrc, mX - oZoom.nXOriginSrcOffset, mY - oZoom.nYOriginSrcOffset, oZoom.nWidthSrc, oZoom.nHeightSrc)
		For k, v In oZoom.oMarkers[oZoom.Mark]
			StretchBlt(oZoom.hdcDest, v.x, v.y, v.w, v.h, oZoom.hdcDest, v.x, v.y, v.w, v.h, 0x5A0049)	; PATINVERT 
	}
	SetTimer, Magnify, -50
} 

SetSize() {
	Static Top := 64, Left := 4, Right := 4, Bottom := 4

	SetTimer, Magnify, Off
	GetClientPos(oZoom.hGui, GuiWidth, GuiHeight)
	Width := GuiWidth - Left - Right
	Height := GuiHeight - Top - Bottom
	Zoom := oZoom.Zoom
	conW := Mod(Width, Zoom) ? Width - Mod(Width, Zoom) + Zoom : Width
	conW := Mod(conW // Zoom, 2) ? conW : conW + Zoom
	conH := Mod(Height, Zoom) ? Height - Mod(Height, Zoom) + Zoom : Height
	conH := Mod(conH // Zoom, 2) ? conH : conH + Zoom
	conX := ((conW - Width) // 2) * -1
	conY :=  ((conH - Height) // 2) * -1

	oZoom.nWidthSrc := conW // Zoom
	oZoom.nHeightSrc := conH // Zoom
	oZoom.nXOriginSrcOffset := oZoom.nWidthSrc//2
	oZoom.nYOriginSrcOffset := oZoom.nHeightSrc//2
	oZoom.nWidthDest := conW
	oZoom.nHeightDest := conH
	oZoom.xCenter := conW / 2 - Zoom / 2
	oZoom.yCenter := conH / 2 - Zoom / 2

	Zoom := oZoom.Zoom
	nWidthDest := oZoom.nWidthDest
	nHeightDest := oZoom.nHeightDest
	xCenter := oZoom.xCenter, yCenter := oZoom.yCenter

	oZoom.oMarkers["Cross"] := [{x:0,y:yCenter - 1,w:nWidthDest,h:1}
		, {x:0,y:yCenter + Zoom,w:nWidthDest,h:1}
		, {x:xCenter - 1,y:0,w:1,h:nHeightDest}
		, {x:xCenter + Zoom,y:0,w:1,h:nHeightDest}]

	oZoom.oMarkers["Square"] := [{x:xCenter - 1,y:yCenter,w:Zoom + 2,h:1}
		, {x:xCenter - 1,y:yCenter + Zoom + 1,w:Zoom + 2,h:1}
		, {x:xCenter - 1,y:yCenter + 1,w:1,h:Zoom}
		, {x:xCenter + Zoom,y:yCenter + 1,w:1,h:Zoom}]

	oZoom.oMarkers["Grid"] := Zoom = 1 ? oZoom.oMarkers["Square"]
		: [{x:xCenter - Zoom,y:yCenter - Zoom,w:Zoom * 3,h:1}
		, {x:xCenter - Zoom,y:yCenter,w:Zoom * 3,h:1}
		, {x:xCenter - Zoom,y:yCenter + Zoom,w:Zoom * 3,h:1}
		, {x:xCenter - Zoom,y:yCenter + Zoom * 2,w:Zoom * 3,h:1}
		, {x:xCenter - Zoom,y:yCenter - Zoom,w:1,h:Zoom * 3}
		, {x:xCenter,y:yCenter - Zoom,w:1,h:Zoom * 3}
		, {x:xCenter + Zoom,y:yCenter - Zoom,w:1,h:Zoom * 3}
		, {x:xCenter + Zoom * 2,y:yCenter - Zoom,w:1,h:Zoom * 3}]

	WinMove, % "ahk_id" oZoom.hDev, , Left, Top, Width, Height
	GuiControl, Dev: -Redraw, % oZoom.hDevCon
	WinMove, % "ahk_id" oZoom.hDevCon, , conX, conY, conW, conH
	Magnify()
	GuiControl, Dev: +Redraw, % oZoom.hDevCon
} 

ZoomOnSize() {
	If A_EventInfo != 1
	{
		SetTimer, SetSize, -100
		oZoom.Minimize := 0
	}
	Else
		oZoom.Minimize := 1
}

SliderZoom()  {
	GuiControlGet, SliderZoom, Zoom:
	ChangeZoom(SliderZoom)
}

ChangeZoom(Val)  {
	If (Val < 1 || Val > 50)
		Return
	GuiControl, Zoom: , TextZoom, % oZoom.Zoom := Val
	GuiControl, Zoom: , SliderZoom, % oZoom.Zoom
	SetTimer, SetSize, -150
}

ChangeMark()  {
	oZoom.Mark := ["Cross","Square","Grid","None"][{"Cross":2,"Square":3,"Grid":4,"None":1}[oZoom.Mark]]
	GuiControl, Zoom: , ChangeMark, % oZoom.Mark
}

ZoomOnClose:
	DllCall("gdi32.dll\DeleteDC", "Ptr", oZoom.hdcDest)
	DllCall("gdi32.dll\DeleteDC", "Ptr", oZoom.hdcSrc)
	ExitApp

GetClientPos(hwnd, ByRef W, ByRef H)  {
	VarSetCapacity(pwi, 60, 0), NumPut(60, pwi, 0, "UInt")
	DllCall("GetWindowInfo", "Ptr", hwnd, "UInt", &pwi)
	W := NumGet(pwi, 28, "int") - NumGet(pwi, 20, "int")
	H := NumGet(pwi, 32, "int") - NumGet(pwi, 24, "int")
}

WM_Paint() {
	SetTimer, Redraw, -10
}

Redraw() { 
	ToolTip % BitBlt(oZoom.hdcDest, 0, 0, oZoom.nWidthDest, oZoom.nHeightDest, oZoom.hdcDest, 0, 0) 
}

BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster="") {
	Ptr := A_PtrSize ? "UPtr" : "UInt" 
	return DllCall("gdi32\BitBlt"
					, Ptr, dDC
					, "int", dx
					, "int", dy
					, "int", dw
					, "int", dh
					, Ptr, sDC
					, "int", sx
					, "int", sy
					, "uint", Raster ? Raster : 0x00CC0020)
}

StretchBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, sw, sh, Raster="") {
	Ptr := A_PtrSize ? "UPtr" : "UInt" 
	return DllCall("gdi32\StretchBlt"
					, Ptr, ddc
					, "int", dx
					, "int", dy
					, "int", dw
					, "int", dh
					, Ptr, sdc
					, "int", sx
					, "int", sy
					, "int", sw
					, "int", sh
					, "uint", Raster ? Raster : 0x00CC0020)
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.28.02 (Unicode 32-bit).

12

Re: AHK: Экранная лупа

Особо не вдумывался, но наверное можно создать отдельный контекст (DC) для запоминания картинки.

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

13

Re: AHK: Экранная лупа

Тоже сразу об этом подумал, но всё это похоже на костыли, наверное.

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

14

Re: AHK: Экранная лупа

OFF: AHK - это один большой костыль...

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

15

Re: AHK: Экранная лупа

Alectric
Ну не знаю, думаю в данном случае просто недостаточно знаний в gdi.

teadrinker
А каковы вообще причины того что что картинка не закрепяется? Это и есть отличие от LayeredWindow?

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

16

Re: AHK: Экранная лупа

serzh82saratov пишет:

Тоже сразу об этом подумал, но всё это похоже на костыли

Нет, ничуть. Так всегда поступают при создании изменяющейся графики. Делают Memory Device Context специально для запоминания, и чтобы не нужно было всё время что-то стирать в видимом окне.

serzh82saratov пишет:

А каковы вообще причины того что что картинка не закрепяется? Это и есть отличие от LayeredWindow?

Она в обычном окне и не должна в таком случае. Да, LayeredWindow для этого удобнее, но там есть свои сложности.

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

17

Re: AHK: Экранная лупа

teadrinker пишет:

Делают Memory Device Context

А как лучше его сделать? Скрытый контрол?

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

18

Re: AHK: Экранная лупа

Нет, просто контекст экрана.

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

19

Re: AHK: Экранная лупа

Ещё один?

DllCall("GetDC", Ptr, "")
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.28.02 (Unicode 32-bit).

20

Re: AHK: Экранная лупа

Ну да.

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

21

Re: AHK: Экранная лупа

Так мы когда в него пишем, это же на экране отображается...

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

22

Re: AHK: Экранная лупа

То есть пишем чтобы сохранить. Нужно получать картинку которая была перед паузой скрипта.

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

23

Re: AHK: Экранная лупа

Нужно от него ещё получить CompatibleDC. Сейчас не могу подробнее, не дома.

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

24

Re: AHK: Экранная лупа

Алгоритм такой — то, что нужно показать в окне, посылаем и в наш дополнительный контекст. Когда отлавливается WM_PAINT — отправляем из контекста в окно.

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

25

Re: AHK: Экранная лупа

Кажется разобрался

DllCall("CreateCompatibleDC", "Ptr", 0) 

ещё потребовались CreateCompatibleBitmap и SelectObject перед записью.

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