Спасибо, про функцию gdip... читал, надеюсь со временем осилю, поскольку функция не тривиальна.
По скрипту о скриншотах тоже читал, еще до создания темы, верно, нечто подобное, но не то.
И так, как написали выше, чистая реализация на AutoHotKey займет не меньше 500 строк кода, что мне явно не под силу, но:
вот что получилось узнать, или накопать)
В msdn есть функция StretchBlt по сути она делает то что нужно, вот гугловский перевода по данной функции:
StretchBlt функция копирует точечный рисунок из исходного прямоугольника в целевой прямоугольник, растягивая или сжимая растровые, чтобы соответствовать размерам прямоугольника адресата, если это необходимо. Система растягивает или сжимает растровые согласно режим растяжения в настоящее время установлен в контекст устройства назначения.
Синтаксис
Копия
BOOL StretchBlt (
__in HDC hdcDest,
__in Int nXOriginDest,
__in Int nYOriginDest,
__in Int nWidthDest,
__in Int nHeightDest,
__in HDC hdcSrc,
__in Int nXOriginSrc,
__in Int nYOriginSrc,
__in Int nWidthSrc,
__in Int nHeightSrc,
__in DWORD dwRop
);
Параметры
hdcDest [в]
Дескриптор контекста устройства.
nXOriginDest [в]
Х-координату, в логических единицах измерения, левого верхнего угла прямоугольника адресата.
nYOriginDest [в]
У-координату, в логических единицах измерения, левого верхнего угла прямоугольника адресата.
nWidthDest [в]
Ширину, в логических единицах измерения, целевого прямоугольника.
nHeightDest [в]
Высоту, в логических единицах измерения, целевого прямоугольника.
hdcSrc [в]
Дескриптор контекста устройства источника.
nXOriginSrc [в]
Х-координату, в логических единицах измерения, левого верхнего угла исходного прямоугольника.
nYOriginSrc [в]
У-координату, в логических единицах измерения, левого верхнего угла исходного прямоугольника.
nWidthSrc [в]
Ширину, в логических единиц, из исходного прямоугольника.
nHeightSrc [в]
Высоту, в логических единицах измерения, исходного прямоугольника.
dwRop [в]
Растровой операции должны быть выполнены. Коды растровых операций определить, каким образом система объединяет цвета в операциях вывода, которые связаны с кистью, исходный точечный рисунок, и точечный рисунок адресата.
О вот код , реализующий экранную лупу при помощи данной функции, к слову готовый продукт весит всего 3КБ, готовое решение можно взять здесь
;---------------------------------------------
; Magnifying Glass Demo
; Copyright (C) ManHunter / PCL
; http://www.manhunter.ru
;---------------------------------------------
format PE GUI 4.0
entry start
include 'win32a.inc'
ID_ZOOM = 104
section '.data' data readable writeable
curs POINT ; Текущие координаты курсора
coord RECT ; Размеры окна лупы
hDesktop dd ? ; Хэндл окна рабочего стола
dDC dd ? ; Контекст окна рабочего стола
wDC dd ? ; Контекст окна лупы
; Размеры прямоугольника лупы
dWidth dd ?
dHeight dd ?
;---------------------------------------------
section '.code' code readable executable
start:
invoke GetModuleHandle,0
invoke DialogBoxParam,eax,1,HWND_DESKTOP,DialogProc,0
invoke ExitProcess,0
;---------------------------------------------
proc DialogProc hwnddlg,msg,wparam,lparam
push ebx esi edi
mov eax,[msg]
cmp eax,WM_INITDIALOG
je wminitdialog
cmp eax,WM_CLOSE
je wmclose
cmp [msg],WM_LBUTTONDOWN
je drag_window
xor eax,eax
jmp finish
;---------------------------------------------
drag_window:
; Перетаскивание окна за любое место
invoke ReleaseCapture
invoke SendMessage,[hwnddlg],WM_SYSCOMMAND,61458,0
jmp processed
;---------------------------------------------
wminitdialog:
; Получить контекст окна лупы
invoke GetDlgItem,[hwnddlg],ID_ZOOM
mov ebx,eax
invoke GetDC,eax
mov [wDC],eax
; Получить размеры окна лупы
invoke GetClientRect,ebx,coord
mov eax,[coord.right]
sub eax,[coord.left]
mov [dWidth],eax
mov eax,[coord.bottom]
sub eax,[coord.top]
mov [dHeight],eax
; Получить контекст десктопа
invoke GetDesktopWindow
mov [hDesktop],eax
invoke GetDC,eax
mov [dDC],eax
; Запустить процедуру экранной лупы
invoke SetTimer,[hwnddlg],1,50,ZoomProc
jmp processed
;---------------------------------------------
wmclose:
; Остановить таймер
invoke KillTimer,[hwnddlg],1
; Очистить хэндлы
invoke ReleaseDC,[hDesktop],[dDC]
invoke ReleaseDC,[hwnddlg],[wDC]
invoke EndDialog,[hwnddlg],0
processed:
mov eax,1
finish:
pop edi esi ebx
ret
endp
;----------------------------------------------------------------------
; Процедура обновления Zoom
;----------------------------------------------------------------------
proc ZoomProc hwnd:DWORD,uMsg:DWORD,idEv:DWORD,dwTime:DWORD
; Получить позицию курсора
invoke GetCursorPos,curs
; Расчитать координаты и размер копируемой
; области рабочего стола
mov edx,[dWidth] ; Ширина / 4
shr edx,2 ; EDX - ширина копируемой области
mov eax,edx
shr eax,1
sub [curs.x],eax ; Координата Х левого угла
mov ecx,[dHeight] ; Высота / 4
shr ecx,2 ; ECX - высота копируемой области
mov eax,ecx
shr eax,1
sub [curs.y],eax ; Координата Y левого угла
; Флаг в FASM не определен
CAPTUREBLT = 0x40000000
; Скопировать участок экрана с увеличением в окно лупы
invoke StretchBlt, [wDC], 0, 0, [dWidth], [dHeight],\
[dDC], [curs.x], [curs.y], edx, ecx,\
CAPTUREBLT+MERGECOPY
ret
endp
;---------------------------------------------
section '.idata' import data readable writeable
library kernel32,'kernel32.dll',\
user32,'user32.dll',\
gdi32,'gdi32.dll'
include 'apia\kernel32.inc'
include 'apia\gdi32.inc'
include 'apia\user32.inc'
;---------------------------------------------
section '.rsrc' resource data readable
directory RT_DIALOG,dialogs
resource dialogs,\
1,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration
dialog demonstration,'Magnifying Glass Demo',0,0,150,150,WS_CAPTION+WS_SYSMENU+DS_CENTER+DS_SYSMODAL
dialogitem 'STATIC','',ID_ZOOM,0,0, 150, 150, WS_VISIBLE
enddialog
вопрос или рассуждения)
AutoHotkey умеет работать с сторонними функциями, почитал доку на эту тему, как я писал выше, у меня не так много опыта в AutoHotkey что бы так с лету решить подобный вопрос, по этому;
В доке есть пример вызова функции:
WhichButton := DllCall("MessageBox", "int", "0", "str", "Нажмите Да или Нет", "str"
, "Заголовок окна", "int", 4)
MsgBox Вы нажали кнопку #%WhichButton%.
Не подскажут ли более опытные форумчане, как это сделать, с помощью сторонней функции. По сути вопрос скатывается в плоскость вот этого раздела из документации.