1

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

Здравствуйте уважаемые форумчане. Прошу помощи в создании следующего скрипта.
Суть:
Создать при помощи AutoHotkey экранную лупу. Знаю, есть много вариантов готовых решений, но все они не устраивают в некотором смысле, а так же хочется самому это сделать, пусть и с помощью, но понять как.
Я не так давно изучаю AutoHotkey,  и если честно даже не знаю с чего начать, я могу написать не очень сложные скрипты, но данная задача ставит меня в тупик, попробовал почитать документацию, не разобрался.
Просьба к более опытным:
1. Не могли бы вы, ответить возможно ли это в принципе на AutoHotkey.
2. И если возможно, мог ли бы вы, привести пример кода, который выполняет следующее:

а. Выводить динамически изображение вокруг курсора, к примеру: в окно, квадратное, заданного размера, выводиться увеличенное в заданное количество раз изображение части экрана монитора, которое находится  под курсором из расчета допустим 1 на 1 сантиметр или Хпикселей, вокруг курсора.
б. Так же необходима возможность перемещать окно с увеличенным результатом в любое место на рабочем столе, в идеале сделать, что бы окошко с результатом увеличения(зума) можно было уменьшать и увеличивать в размере, то есть масштабировать.
в. Еще бы хотелось, иметь возможность, горячими клавишами увеличивать и уменьшать зум, то есть регулировать % увеличения изображения в окне результата на лету.

Вот как бы полная суть просьбы.
Заранее благодарен всем кто откликнется, и поможет реализовать данный скрипт.

2 (изменено: pant-79, 2012-01-04 03:04:26)

Re: AHK: экранная лупа на AutoHotkey

Не меньше 500 строк кода... желательно с использованием gdip...
если только начинаешь в АНК, тебе еще долго до этого пилить...
Но начинать, я считаю, следует с изучения gdip.
Функция более менее развернуто обсуждалась здесь
teadrinker в этом деле просто монстр, спроси у него...

3

Re: AHK: экранная лупа на AutoHotkey

153nikta пишет:

И если возможно, мог ли бы вы, привести пример кода, который выполняет следующее:...

Здесь, что-то подобное было реализовано с комментариями.

4 (изменено: 153nikta, 2012-01-04 15:02:22)

Re: AHK: экранная лупа на AutoHotkey

Спасибо, про функцию 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%.

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

5 (изменено: Grey, 2012-01-04 21:30:19)

Re: AHK: экранная лупа на AutoHotkey

Не много доработал. Теперь центр окна совпадает с центром курсора (ранее был левый-верхний угол), добавил фиксированное соотношение сторон при изменении размера окна.

#NoEnv
CoordMode, Mouse
Width:=159, Value:=15
Gui, +AlwaysOnTop -Caption +Resize +ToolWindow HwndGUIhWnd
Gui, Show, % "w"Width " h"Width, Magnifier
OnMessage(0x201, "WM_NCLBUTTONDOWN") ; WM_LBUTTONDOWN
hDCgui:=DllCall("GetDC", "UInt", GUIhWnd)
hDCdesk:=DllCall("GetDC", "UInt", DllCall("GetDesktopWindow"))
SetTimer, ChaseCursor, 100

^MButton::
^WheelUp::
^WheelDown::
   If SubStr(A_ThisHotkey, 2)="MButton"
   {
      Value:=15, Width:=159
      WinMove, % "ahk_id"GUIhWnd,,,, Width, Width
   }
   Else If SubStr(A_ThisHotkey, 2)="WheelDown"
      Value-=4, Value<0 ? Value:=1:Value
   Else Value+=4
   Return

GuiSize:
   If % A_EventInfo=0
   {
      Width:=A_GuiWidth
      WinMove, % "ahk_id"GUIhWnd,,,, Width, Width
   }
   Return

ChaseCursor:
   MouseGetPos, XPos, YPos
   DllCall("gdi32\StretchBlt", "UInt", hDCgui
                             , "Int", 0
                             , "Int", 0
                             , "Int", Width
                             , "Int", Width
                             , "UInt", hDCdesk
                             , "Int", XPos-(Value/2)+1
                             , "Int", YPos-(Value/2)+1
                             , "Int", Value
                             , "Int", Value
                             , "UInt", 0x40C000CA) ; CAPTUREBLT|MERGECOPY
   Return

WM_NCLBUTTONDOWN()
{
   global
   PostMessage, 0xA1, 2,,, % "ahk_id"GUIhWnd ; WM_NCLBUTTONDOWN, HTCAPTION
}

Esc::
GuiClose:
   ExitApp

6 (изменено: 153nikta, 2012-01-04 18:44:34)

Re: AHK: экранная лупа на AutoHotkey

ой) спасибо огромное GREY
Теперь есть с чем работать, и что понимать, как доделаю под свои нужды залью готовый код.


И еще раз огромное спасибо за помощь.

7

Re: AHK: экранная лупа на AutoHotkey

Grey, по-моему, вполне годится для Коллекции!

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

8

Re: AHK: экранная лупа на AutoHotkey

Всем добрый день!

Возможно ли,сделать экранную лупу так что бы

1 - Она была в центре экрана (1280 1024).
2 - Показывала то что находиться прямо под ней,тобишь как настоящая лупа если просто приложить её к экрану.
3 - Что бы не отображалась рамка окна.
4 - Прозрачная для курсора и поверх всех окон.

9

Re: AHK: экранная лупа на AutoHotkey

OFF: Больше на заказ работ похоже, чем на вопрос!

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

10

Re: AHK: экранная лупа на AutoHotkey

OFF: Вероятно, Gabe_#33 действительно важен однозначный ответ [возможно|невозможно] на поставленный вопрос, иначе бы формулировка была «А сделайте-ка мне …».

11

Re: AHK: экранная лупа на AutoHotkey

#NoEnv
SetBatchLines, -1
CoordMode, Pixel
CoordMode, Mouse
DllCall("dwmapi\DwmEnableComposition", "UInt", False)
Gui, +AlwaysOnTop -Caption +E0x80000 +HwndGUIhWnd +Owner
Gui, Show, w150 h150, 10xZoom
WinMove, % "ahk_id"GUIhWnd,, A_ScreenWidth//2-76, A_ScreenHeight//2-76
hModule:=DllCall("LoadLibrary", "Str", "gdiplus.dll")
VarSetCapacity(GdiplusStartupInput, 16, 0)
NumPut(1, GdiplusStartupInput, 0, "Char")
DllCall("gdiplus\GdiplusStartup", "UInt*", pToken, "UInt", &GdiplusStartupInput)
VarSetCapacity(BITMAPINFO, 40, 0)
NumPut(40, BITMAPINFO, 0)
NumPut(150, BITMAPINFO, 4) ; biWidth
NumPut(150,BITMAPINFO, 8) ; biHeight
NumPut(1, BITMAPINFO, 12, "UShort")
NumPut(32, BITMAPINFO, 14, "UShort")
NumPut(0, BITMAPINFO, 16)
hBitmap:=DllCall("CreateDIBSection", "UInt", hDC
                                   , "UInt", &BITMAPINFO
                                   , "UInt", 0
                                   , "UInt*", 0
                                   , "UInt", 0
                                   , "UInt", 0)
DllCall("ReleaseDC", "UInt", 0, "UInt", hDC)
hMemDC:=DllCall("CreateCompatibleDC", "UInt", 0)
DllCall("SelectObject", "UInt", hMemDC, "UInt", hBitmap)
DllCall("gdiplus\GdipCreateFromHDC", "UInt", hMemDC, "UInt*", pGraphics)
DllCall("gdiplus\GdipCreateSolidFill", "Int", Color1, "UInt*", pBrush)
SetTimer, ChaseCursor, 50
OnExit, ExitScript
Return

ChaseCursor:
   MouseGetPos, XPos, YPos
   Loop, 15
      GdipDrawLine(A_Index-1)
   DllCall("UpdateLayeredWindow", "UInt", GUIhWnd
                                , "UInt", 0
                                , "UInt", 0
                                , "Int64*", 0x09600000096 ; 150x150
                                , "UInt", hMemDC
                                , "Int64*", 0
                                , "UInt", 0
                                , "UInt*", 0x01FF0000
                                , "UInt", 2)
   Return

ExitScript:
   DllCall("gdiplus\GdiplusShutdown", "UInt", pToken)
   DllCall("FreeLibrary", "UInt", hModule)
   DllCall("dwmapi\DwmEnableComposition", "UInt", True)
   ExitApp

GdipDrawLine(Y)
{
   global
   Loop, 15
   {
      PixelGetColor, CurrentColor, XPos-7+A_Index-1, YPos-7+Y, RGB
      DllCall("gdiplus\GdipSetSolidFillColor", "UInt", pBrush
                                             , "UInt", CurrentColor|0xFF000000)
      DllCall("gdiplus\GdipFillRectangle", "UInt", pGraphics
                                         , "UInt", pBrush
                                         , "Float", (A_Index-1)*10
                                         , "Float", Y*10
                                         , "Float", 10
                                         , "Float", 10)
   }
}

12

Re: AHK: экранная лупа на AutoHotkey

OFF пишет:
creature.ws пишет:

OFF: Вероятно, Gabe_#33 действительно важен однозначный ответ [возможно|невозможно] .

Именно он и важен. Виноват,я не много не привык сразу выражать "формулировки"...Как могу так общаюсь.Не в коем случае не заказываю...потому как сам увлекаюсь написанием,построением скриптов.

OFF пишет:

Возможно ли?
---
Да
---
я Точ то получилось у меня...но вот тут не много не получается...Как быть здесь?
---
Сделай так и так
---
я А если здесь то то....
---
Сделай так.
---
я Ок спасибо

Разве есть что то не то?Али формулировки внеземные?
Признаю,я не излишне опытен в общении на форумах,но я учусь.А флуд легко удаляется,ничего в этом страшного нет.

По теме - То что получилось у меня,из имеющегося скрипта экранной лупы это заставить её отображать информацию в из указанных координат а не то что под курсором,тут сталкнулся с осложностью.Лупа показывает сама себя если указать координаты откуда показывать и непосредственно саму лупу установить на этиже координаты.Можно ли здесь чегонибудь придумать,или эта функция вообще не подходит?

13

Re: AHK: экранная лупа на AutoHotkey

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

#NoEnv
SetBatchLines, -1
CoordMode, Pixel
DllCall("dwmapi\DwmEnableComposition", "UInt", False)
Gui, +AlwaysOnTop -Caption +E0x80000 +HwndGUIhWnd +Owner
Gui, Show, w150 h150, 10xZoom
WinMove, % "ahk_id"GUIhWnd,, A_ScreenWidth//2-76, A_ScreenHeight//2-76
hModule:=DllCall("LoadLibrary", "Str", "gdiplus.dll")
VarSetCapacity(GdiplusStartupInput, 16, 0)
NumPut(1, GdiplusStartupInput, 0, "Char")
DllCall("gdiplus\GdiplusStartup", "UInt*", pToken, "UInt", &GdiplusStartupInput)
VarSetCapacity(BITMAPINFO, 40, 0)
NumPut(40, BITMAPINFO, 0)
NumPut(150, BITMAPINFO, 4) ; biWidth
NumPut(150,BITMAPINFO, 8) ; biHeight
NumPut(1, BITMAPINFO, 12, "UShort")
NumPut(32, BITMAPINFO, 14, "UShort")
NumPut(0, BITMAPINFO, 16)
hBitmap:=DllCall("CreateDIBSection", "UInt", hDC
                                   , "UInt", &BITMAPINFO
                                   , "UInt", 0
                                   , "UInt*", 0
                                   , "UInt", 0
                                   , "UInt", 0)
DllCall("ReleaseDC", "UInt", 0, "UInt", hDC)
hMemDC:=DllCall("CreateCompatibleDC", "UInt", 0)
DllCall("SelectObject", "UInt", hMemDC, "UInt", hBitmap)
DllCall("gdiplus\GdipCreateFromHDC", "UInt", hMemDC, "UInt*", pGraphics)
DllCall("gdiplus\GdipCreateSolidFill", "Int", Color1, "UInt*", pBrush)
SetTimer, UpdWindow, 50
OnExit, ExitScript
Return

UpdWindow:
   Loop, 15
      GdipDrawLine(A_Index-1)
   DllCall("UpdateLayeredWindow", "UInt", GUIhWnd
                                , "UInt", 0
                                , "UInt", 0
                                , "Int64*", 0x09600000096 ; 150x150
                                , "UInt", hMemDC
                                , "Int64*", 0
                                , "UInt", 0
                                , "UInt*", 0x01FF0000
                                , "UInt", 2)
   Return

ExitScript:
   DllCall("gdiplus\GdiplusShutdown", "UInt", pToken)
   DllCall("FreeLibrary", "UInt", hModule)
   DllCall("dwmapi\DwmEnableComposition", "UInt", True)
   ExitApp

GdipDrawLine(Y)
{
   global
   Loop, 15
   {
      PixelGetColor, CurrentColor, A_ScreenWidth//2-7+A_Index-1
                                 , A_ScreenHeight//2-7+Y, RGB
      DllCall("gdiplus\GdipSetSolidFillColor", "UInt", pBrush
                                             , "UInt", CurrentColor|0xFF000000)
      DllCall("gdiplus\GdipFillRectangle", "UInt", pGraphics
                                         , "UInt", pBrush
                                         , "Float", (A_Index-1)*10
                                         , "Float", Y*10
                                         , "Float", 10
                                         , "Float", 10)
   }
}

14

Re: AHK: экранная лупа на AutoHotkey

Grey,а в какой строке находится значение с зумом?
Возможно ли убрать вот это - "Цветовая схема изменена на упрощённый стиль"при включении скрипта.Что бы цветовая схема не затрагивалась. Если да то как?

15

Re: AHK: экранная лупа на AutoHotkey

Grey, в связи с тем, что сейчас существуют несколько альтернативных версий AHK, главные из которых AHK_L Unicode x86 и AHK_L Unicode x64, желательно указывать, для какой версии написан код, либо писать универсальный (но всё равно версию стоит указать, т. к. некоторые ещё используют AHK-basic).

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

16

Re: AHK: экранная лупа на AutoHotkey

Gabe_#33 пишет:

...в какой строке находится значение с зумом?

Это эмуляция увеличения, тут на общий вид влияют несколько значений (я представил их в коде ввиде переменных):

#NoEnv
SetBatchLines, -1
CoordMode, Pixel
;DllCall("dwmapi\DwmEnableComposition", "UInt", False)
Run, % "net stop uxsms",, Hide
hModule:=DllCall("LoadLibrary", "Str", "gdiplus.dll")
VarSetCapacity(GdiplusStartupInput, 16, 0)
NumPut(1, GdiplusStartupInput, 0, "Char")
DllCall("gdiplus\GdiplusStartup", "UInt*", pToken
                                , "UInt", &GdiplusStartupInput)
VarSetCapacity(BITMAPINFO, 40, 0), NumPut(40, BITMAPINFO, 0)
NumPut(1, BITMAPINFO, 12, "UShort"), NumPut(32, BITMAPINFO, 14, "UShort")
NumPut(0, BITMAPINFO, 16), ChangeZoom(10)
SetTimer, UpdWindow, 250
OnExit, ExitScript

1::ChangeZoom(5)
2::ChangeZoom(10)
3::ChangeZoom(15)

UpdWindow:
   Loop, % Var1
      GdipDrawLine(A_Index-1)
   DllCall("UpdateLayeredWindow", "UInt", GUIhWnd
                                , "UInt", 0
                                , "UInt", 0
                                , "Int64*", Var0|Var0<<32
                                , "UInt", hMemDC
                                , "Int64*", 0
                                , "UInt", 0
                                , "UInt*", 0x01FF0000
                                , "UInt", 2)
   Return

ExitScript:
   DllCall("gdiplus\GdiplusShutdown", "UInt", pToken)
   DllCall("FreeLibrary", "UInt", hModule)
;   DllCall("dwmapi\DwmEnableComposition", "UInt", True)
   Run, % "net start uxsms",, Hide
   ExitApp

GdipDrawLine(Y)
{
   global
   Loop, % Var1
   {
      PixelGetColor, CurrentColor, A_ScreenWidth//2-Var2+A_Index-1
                                 , A_ScreenHeight//2-Var2+Y, RGB
      DllCall("gdiplus\GdipSetSolidFillColor", "UInt", pBrush
                                             , "UInt", CurrentColor
                                                     | 0xFF000000)
      DllCall("gdiplus\GdipFillRectangle", "UInt", pGraphics
                                         , "UInt", pBrush
                                         , "Float", (A_Index-1)*Var3
                                         , "Float", Y*Var3
                                         , "Float", Var3
                                         , "Float", Var3)
   }
}

ChangeZoom(ZSize)
{
   global
   Gui, Destroy
   Var0:=ZSize=5 ? 155:ZSize=10 ? 150:165
   Var1:=ZSize=5 ?  31:ZSize=10 ?  15: 11
   Var2:=ZSize=5 ?  15:ZSize=10 ?   7:  5
   Var3:=ZSize=5 ?   5:ZSize=10 ?  10: 15
   Gui, +AlwaysOnTop -Caption +E0x80000 +HwndGUIhWnd +Owner
   Gui, Show, % "w"Var0 " h"Var0
   WinMove, % "ahk_id"GUIhWnd,, A_ScreenWidth//2-Var0/2
                              , A_ScreenHeight//2-Var0/2
   NumPut(Var0, BITMAPINFO, 4), NumPut(Var0, BITMAPINFO, 8)
   hBitmap:=DllCall("CreateDIBSection", "UInt", hDC
                                      , "UInt", &BITMAPINFO
                                      , "UInt", 0
                                      , "UInt*", 0
                                      , "UInt", 0
                                      , "UInt", 0)
   DllCall("ReleaseDC", "UInt", 0, "UInt", hDC)
   hMemDC:=DllCall("CreateCompatibleDC", "UInt", 0)
   DllCall("SelectObject", "UInt", hMemDC, "UInt", hBitmap)
   DllCall("gdiplus\GdipCreateFromHDC", "UInt", hMemDC
                                      , "UInt*", pGraphics)
   DllCall("gdiplus\GdipCreateSolidFill", "Int", 0, "UInt*", pBrush)
   TrayTip,, % ZSize "x"
}
Gabe_#33 пишет:

Возможно ли убрать вот это - ... Если да то как?

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

teadrinker пишет:

...в связи с тем, что сейчас существуют несколько альтернативных версий AHK, ...желательно указывать, для какой версии написан код...

Писалось для AHK_L Unicode x86.

17

Re: AHK: экранная лупа на AutoHotkey

Grey пишет:

Писалось для AHK_L Unicode x86.

Может имеет смысл писать код, совместимый как с x86, так и с x64? Тем более, что дополнительных усилий для этого не требуется.

18

Re: AHK: экранная лупа на AutoHotkey

Видимо, у Grey'я нет доступа к 64-битной системе, а код, который невозможно проверить, писать не хочется. Кстати, дополнительные усилия требуются, когда дело доходит до составления структур.

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

19

Re: AHK: экранная лупа на AutoHotkey

teadrinker пишет:

Видимо, у Grey'я нет доступа к 64-битной системе, а код, который невозможно проверить, писать не хочется. Кстати, дополнительные усилия требуются, когда дело доходит до составления структур.

Да ладно, там всего одно правило- видишь указатель/хендл/{параметр, который можно использовать как указатель(например LPARAM)}, пишешь "ptr". При составлении структур тоже самое, только прибавляешь PtrSize- отступы ты при любом раскладе должен считать.

20

Re: AHK: экранная лупа на AutoHotkey

Александр_ пишет:

Да ладно, там всего одно правило- видишь указатель/хендл/{параметр, который можно использовать как указатель(например LPARAM)}, пишешь "ptr".

Плюс ещё нужно добавлять в конце "Ptr", когда функция возвращает поинтер либо хэндл, ибо по умолчанию "Int".

Александр_ пишет:

При составлении структур тоже самое, только прибавляешь PtrSize- отступы ты при любом раскладе должен считать.

Плюс ещё не забывать о выравнивании.

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

21

Re: AHK: экранная лупа на AutoHotkey

teadrinker пишет:

Плюс ещё не забывать о выравнивании.

Ну дык оно тоже есть и в x86 и в x64 .

22

Re: AHK: экранная лупа на AutoHotkey

Хорошо я попробовал:

#NoEnv
SetBatchLines, -1
CoordMode, Pixel
Run, % "net stop uxsms",, Hide
hModule:=DllCall("LoadLibrary", "Str", "gdiplus.dll")
VarSetCapacity(GdiplusStartupInput, A_PtrSize=8 ? 24:16, 0)
NumPut(1, GdiplusStartupInput, 0, "Char")
DllCall("gdiplus\GdiplusStartup", "Ptr*", pToken
                                , "Ptr", &GdiplusStartupInput
                                , "Ptr", 0)
VarSetCapacity(BITMAPINFO, 44, 0)
NumPut(40, BITMAPINFO, 0), NumPut(1, BITMAPINFO, 12, "UShort")
NumPut(32, BITMAPINFO, 14, "UShort"), NumPut(0, BITMAPINFO, 16)
VarSetCapacity(Size, 8, 0), ChangeZoom(10)
SetTimer, UpdWindow, 250
OnExit, ExitScript

1::ChangeZoom(5)
2::ChangeZoom(10)
3::ChangeZoom(15)

UpdWindow:
   Loop, % Var1
      GdipDrawLine(A_Index-1)
   NumPut(Var0, Size, 0), NumPut(Var0, Size, 4)
   DllCall("UpdateLayeredWindow", "Ptr", GUIhWnd
                                , "Ptr", 0
                                , "Ptr", 0
                                , "Ptr", &Size
                                , "Ptr", hMemDC
                                , "Int64*", 0
                                , "Ptr", 0
                                , "Ptr*", 0x01FF0000
                                , "UInt", 2)
   Return

ExitScript:
   DllCall("gdiplus\GdiplusShutdown", "Ptr", pToken)
   DllCall("FreeLibrary", "Ptr", hModule)
   Run, % "net start uxsms",, Hide
   ExitApp

GdipDrawLine(Y)
{
   global
   Loop, % Var1
   {
      PixelGetColor, CurrentColor, A_ScreenWidth//2-Var2+A_Index-1
                                 , A_ScreenHeight//2-Var2+Y, RGB
      DllCall("gdiplus\GdipSetSolidFillColor", "Ptr", pBrush
                                             , "UInt", CurrentColor
                                                     | 0xFF000000)
      DllCall("gdiplus\GdipFillRectangle", "Ptr", pGraphics
                                         , "Ptr", pBrush
                                         , "Float", (A_Index-1)*Var3
                                         , "Float", Y*Var3
                                         , "Float", Var3
                                         , "Float", Var3)
   }
}

ChangeZoom(ZSize)
{
   global
   Gui, Destroy
   Var0:=ZSize=5 ? 155:ZSize=10 ? 150:165
   Var1:=ZSize=5 ?  31:ZSize=10 ?  15: 11
   Var2:=ZSize=5 ?  15:ZSize=10 ?   7:  5
   Var3:=ZSize=5 ?   5:ZSize=10 ?  10: 15
   Gui, +AlwaysOnTop -Caption +E0x80000 +HwndGUIhWnd +Owner
   Gui, Show, % "w"Var0 " h"Var0
   WinMove, % "ahk_id"GUIhWnd,, A_ScreenWidth//2-Var0/2
                              , A_ScreenHeight//2-Var0/2
   NumPut(Var0, BITMAPINFO, 4), NumPut(Var0, BITMAPINFO, 8)
   hdC:=DllCall("GetDC", "Ptr", 0)
   hBitmap:=DllCall("CreateDIBSection", "Ptr", hDC
                                      , "Ptr", &BITMAPINFO
                                      , "UInt", 0
                                      , "Ptr", 0
                                      , "Ptr", 0
                                      , "UInt", 0)
   DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)
   hMemDC:=DllCall("CreateCompatibleDC", "Ptr", 0)
   DllCall("SelectObject", "Ptr", hMemDC, "Ptr", hBitmap)
   DllCall("gdiplus\GdipCreateFromHDC", "Ptr", hMemDC
                                      , "Ptr*", pGraphics)
   DllCall("gdiplus\GdipCreateSolidFill", "Int", 0, "Ptr*", pBrush)
   TrayTip,, % ZSize "x"
}

у меня не сработало на х64, интересно какой код будет у Вас.

teadrinker пишет:

...писать не хочется.

Если честно, то да, не хочется.

23 (изменено: Александр_, 2012-06-12 00:24:31)

Re: AHK: экранная лупа на AutoHotkey

Grey пишет:

Хорошо я попробовал:

Ну в код вникать я не стал, но там в функции "ChangeZoom" используются возвращаемые значения неверного типа.

код пишет:

hdC:=DllCall("GetDC", "Ptr", 0)
должно быть:
hdC:=DllCall("GetDC", "ptr", 0, "ptr")

Далее- в "NumPut" почти никогда не указывается тип значения. Не знаю в каком именно месте это необходимо сделать, но я проставил везде и окно скрипта появилось.
Хотя работает немножко по-дэбильному, но это, наверно, проблема не x64 .