1 (изменено: Grey, 2013-06-10 17:09:40)

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

#NoEnv
#NoTrayIcon
#MaxHotkeysPerInterval, 1000

CoordMode, Mouse
OnMessage(WM_LBUTTONDOWN:=0x201, "WndProc"), OnMessage(AHK_NOTIFYICON:=0x404, "WndProc")
LR_DEFAULTSIZE:=0x40, CAPTUREBLT:=0x40000000, MERGECOPY:=0xC000CA, iconHex:=`"
(Join
0000010001002020000001002000A8100000160000002800000020000000400000000100200000000
000801000000000000000000000000000000000000000000000010101031919192E1B1B1B30010101
150000000200000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000101010B2D2D2D93303030B42
F2F2F7F37373737000000100000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000004E4C4EAD8584
84FF888888FF444444D53F3F3F6E2A2B2A2B0000000A0000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
0757073E5E3E0E2FF959495FF909090FE353635C14A4A4A5A15151522000000050000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000766F71A7B4ACAFFFE5E2E4FF8C8B8BFF818181F72B2A2AA7494949490505051A000
000020000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000007B767A0D6D6669CDCBC5C7FFCFCDCFFF8D8C8CFF686868EC2A2A2A
8C3E3E3E3900000011000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000747074266D6668E3DCD6D9FFB8B6B7FF8
E8E8EFF4A4A4ADB393838722B2B2B2C000000FF000000FF000000FF000000FF000000000000000000
000000000000000000000000000000000000FF000000FF000000FF000000FF0000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000706C6F45776F
71F1E5DFE2FFA5A3A4FF8A8989FF363636C244444459000000FF000000FF000000FF000000FF00000
0000000000000000000000000000000000000000000000000FF000000FF000000FF000000FF000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000006F6A6E64877E81FBE3DDE0FF969595FF767676F62A2929A4000000FF000000FF000000FF
000000FF000000000000000000000000000000000000000000000000000000FF000000FF000000FF0
00000FF00000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000006D676B81978E91FFD6D2D3FF908E8EFF575757E8000000FF000
000FF000000FF000000FF000000000000000000000000000000000000000000000000000000FF0000
00FF000000FF000000FF0000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000006B66699BA59D9EFFC3C0C0FF858485
FF000000FF000000FF000000FF000000FF0000000000000002000000080000000E000000100000000
E000000FF000000FF000000FF000000FF000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000006E686BAEA
FA7A9FFB0AEAEFF000000FF000000FF000000FF000000FF000000230F0F0F471C1C1D622525266B2A
2A2B652B2B2C58000000FF000000FF000000FF000000FF00000001000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
00007D787C06776F73B9B0A9AAFF000000FF000000FF000000FF000000FF737373CB8F8F90E6A5A5A
6EDAEAEAFF0A4A4A4ED8B8B8BE2000000FF000000FF000000FF000000FF0000001400000002000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000918A8F077A7375B5000000FF000000FF000000FF000000FFC3C2BFAB
D0CECC65D4D2D228EAC5A40BD8C9BC32D2CBC46F000000FF000000FF000000FF000000FF292A2B390
000001900000002000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000043414230000000FF000000FF000000FF000
000FFFFBB7D0FFFBB7D08FFBB7D06FFBB7D08FFBB7D0FFFBB7D17000000FF000000FF000000FF0000
00FF61605E842F2F31390000001400000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000004A4A4B5B000000FF000000
FF000000FF000000FFFFBB7D14FFBB7D0FFFBB7D0DFFDEC01CFFE6CF30FFE4CC39000000FF000000F
F000000FF000000FF8B8B8BE1605F5B721B1B1B2F0000000600000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000191A1D35858587E00
00000FF000000FF000000FF000000FFFFBB7D1BFFCA9A1CFFECDC3CFFF3E95AFFF1E65DFFEEE06000
0000FF000000FF000000FF000000FFC6C0B8BA767675CF514E4C490000001C0000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000005D5D
5F93BCBCB9E2000000FF000000FF000000FF000000FFFFC28B27FFE9D64DFFF2E86CFFF2E76BFFF1E
36CFFEEDF6E000000FF000000FF000000FF000000FFF1C79C64ADACABE55F5D5B8E2020232E000000
020000000000000000000000000000000000000000000000000000000000000000000000000000000
020212430868688DECFC6B8A8000000FF000000FF000000FF000000FFFFE0C553FFF1E57DFFF1E57B
FFF1E37AFFEFE17AFFEDDE7C000000FF000000FF000000FF000000FFFFBF865FCCC3B7B8747373CD4
040413C00000008000000000000000000000000000000000000000000000000000000000000000000
0000000000000037373952A3A2A2EFE0C7A980000000FF000000FF000000FF000000FFFFECDC7FFFF
1E38BFFF1E38AFFF0E189FFEEE088FFEDDE89000000FF000000FF000000FF000000FFFFCFA477E2C7
AB8E959495E9404141530000000F00000000000000000000000000000000000000000000000000000
00000000000000000000000000037373966B7B6B5EEF0BF906D000000FF000000FF000000FF000000
FFFFF0E29BFFF0E298FFF0E297FFEFE196FFEEDF96FFEDDE96000000FF000000FF000000FF000000F
FFFDBBA8EF1C1927AACADADF037373669000003120000000000000000000000000000000000000000
00000000000000000000000000000000000000003F3F4172BFBDBCF0FDBC8069000000FF000000FF0
00000FF000000FFFFE4CC84FFF0E2A4FFEFE1A3FFEFE0A2FFEEDFA2FFEDDEA2000000FF000000FF00
0000FF000000FFFFE2C9A3FDBB7F75B8B8B8F23232326F0000030F000000000000000000000000000
000000000000000000000000000000000000000000000000000005B5C5E7CB7B5B2F1F0BE8D790000
00FF000000FF000000FF000000FFFFC1885EFFD6B175FFE5CE92FFEFE1ADFFEEDFADFFEDDEAD00000
0FF000000FF000000FF000000FFFFE8D3B3F2C09082B1B1B0F1313132670000000800000000000000
0000000000000000000000000000000000000000000000000000000000000000005B5C5E63A6A4A2F
0E2C29F8F000000FF000000FF000000FF000000FFFFE7D1A1FFD8B582FFC18867FFD1A879FFDEC291
FFE8D4A6000000FF000000FF000000FF000000FFFFE5CEB2E6C6A6969E9E9EEC3131324C000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000008C
8C9161939291EFD0BFAAAF000000FF000000FF000000FF000000FFFFF1E3C4FFF0E2C2FFE9D5AEFFD
EC098FFD0A582FFC08773000000FF000000FF000000FF000000FFFFD9B8A2D5C7B7BB848485D72629
292000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000097989A2B919191CEBBB4ACDD000000FF000000FF000000FF000000FFFFF1E4CBFFF1E3
C9FFF1E3C9FFF0E2C8FFF0E2C7FFEAD7BA000000FF000000FF000000FF000000FFF4C79787C3BFBBE
45C5D5DA0000000040000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000A3A3A4639C9997F5CEBCA4B3FFBB7E7FFFBB7D7EFFE4CCB3F
FF1E6D1FFF1E5D0FFF1E5CFFFF1E3CEFFF1E3CEFFF0E2CEFFF0E1CDFFEFE1CDFFEFE0CDFFE3CBB4DD
CCBBBE8F8F90E51A1B1B2600000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000929393BFACA5A0F5D8BE9FA3FFBB
7E80FFD9B8A3FFF2E7D5FFF2E6D5FFF1E5D4FFF1E5D3FFF1E5D3FFF1E4D2FFF1E3D2FFF1E3D1FFE9D
5BFE9D4C0B6B1AEADF35152537F000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000004E4E4E19959493D
9B2AAA2F6D4C0AABAF4CCA08DFFECDCC8FFF2E8D7FFF2E8D7FFF2E8D6FFF2E7D6FFF2E7D5FFF1E6D4
FAE7D4BCE0D1C1C7B5B1B0F6606062A30000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000A9AAAA1C868585C8A49D97F9C4BAAFE5DBCCBAC6F0E2D4CBFAECE0D1FEF2E8D7FAECDFCFF1E
3D4C9E0D4C6CFC9C1B8EA9A9897F359595B8D00000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000003738380654545577848380E0A09994F7B3ABA4FCC1B9B2FDC7C1BB
FCC0B9B3FCB1ACA6FB979592F3747475C42A2A2B36000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000001A1A1B0B454646536060608F6
B6A69AE6A6967B3666665A050505176292A2B2C000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000083FFFFFF03FFFFFF01FFFFFF00F
FFFFF007FFFFF007FFFFF8007E1FFC007E1FFE007E1FFF007E1FFF80401FFFC0000FFFC00007FFE00
003FFF00003FFF00001FFE00001FFE00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC000
01FFC00001FFC00001FFE00003FFF00007FFF0000FFFF8001FFFFC003FFFFF00FFF
)`"
tSize:=A_PtrSize=4 ? A_IsUnicode ? 956:508:976
NumPut(VarSetCapacity(NOTIFYICONDATA, tSize, 0), NOTIFYICONDATA, 0)
VarSetCapacity(iconData, nSize:=StrLen(iconHex)//2)
Loop, % nSize
   NumPut("0x"SubStr(iconHex, 2*A_Index-1, 2), iconData, A_Index-1, "UChar")
hIcon1:=DllCall("CreateIconFromResourceEx", "Ptr", &iconData+22
                                          , "UInt", NumGet(&iconData+14)
                                          , "Int", True
                                          , "UInt", 0x30000
                                          , "Int" , 0
                                          , "Int" , 0
                                          , "UInt", LR_DEFAULTSIZE
                                          , "Ptr")
hIcon2:=DllCall("shell32\ExtractIcon"(A_IsUnicode ? "W":"A"), "Ptr", 0
                                                            , "Str", "shell32.dll"
                                                            , "Int", -23
                                                            , "Ptr")
iconHex:=iconData:=nSize:=sSize:="", tipInfo:="RCtrl+Enter - set defaults`n"
                                            . "RCtrl+Up     - dec zoom`n"
                                            . "RCtrl+Down - inc zoom`n"
                                            . "LClick(icon) - pause`n"
                                            . "Esc(hold)     - exit"
TrayIcon(A_ScriptHwnd, 1, AHK_NOTIFYICON, hIcon2, tipInfo, 0)

Gui, +AlwaysOnTop -Caption +Resize +ToolWindow HWNDhWnd_
Gui, Show, % "w155 h"value_:=width:=155, % "Magnifier"
WinGetPos, xWnd, yWnd,,, % "ahk_id"hWnd_
hDC1:=DllCall("GetDC", "Ptr", hWnd_, "Ptr")
hDC2:=DllCall("GetDC", "Ptr", DllCall("GetDesktopWindow", "Ptr"), "Ptr")
SetTimer, % "ChaseCursor", 100

Hotkey, RCtrl & Enter, % "HotkeyAction"
Hotkey, RCtrl & Up, % "HotkeyAction"
Hotkey, RCtrl & Down, % "HotkeyAction"

Menu, Tray, NoStandard
Menu, Tray, Add, % "Keep &zoom", % "ZoomMenu"
Menu, Tray, Check, % "Keep &zoom"
Menu, Tray, Add, % "Keep &aspect ratio", % "AspectMenu"
Menu, Tray, Check, % "Keep &aspect ratio"
Menu, Tray, Add
Menu, Tray, Add, % "&Exit", % "ExitScript"

~Esc::
   While, GetKeyState(SubStr(A_ThisHotkey, 2), "P")
   {
      Sleep, 50
      If A_TimeSinceThisHotkey>500
      {
         KeyWait, % SubStr(A_ThisHotkey, 2)
         Goto, ExitScript
      }
   }
   Return

HotkeyAction:
   If SubStr(A_ThisHotkey, 9)="Enter"
      SetDefault()
   Else If SubStr(A_ThisHotkey, 9)="Down"
      value_-=5, value_<0 ? value_:=1:value_
   Else value_+=5
   Return

Guisize:
   If reset
   {
      reset:=False
      Return
   }
   If % A_EventInfo=0
   {
      If !isNotKeepZ
      {
         value_*=A_Guiwidth/width
         If (Mod(value_, 2)=0)
            value_+=1
      }
      width:=A_Guiwidth, height:=A_Guiheight
      WinMove, % "ahk_id"hWnd_,,,, width, isNotKeepAR ? height:width
   }
   Return

ChaseCursor:
   MouseGetPos, xPos, yPos
   DllCall("gdi32\StretchBlt", "Ptr", hDC1
                             , "Int" , 0
                             , "Int" , 0
                             , "Int" , width
                             , "Int" , isNotKeepAR ? height:width
                             , "Ptr", hDC2
                             , "Int" , xPos-(value_/2)
                             , "Int" , yPos-(value_/2)
                             , "Int" , value_
                             , "Int" , value_
                             , "UInt", CAPTUREBLT|MERGECOPY)
   Return

ZoomMenu:
AspectMenu:
   If isPaused
   {
      MsgBox, 262208, % A_Space, % "Without result while on a pause.", % 1.5
      Return
   }
   Menu, Tray, % (A_ThisLabel~="mM" ? (isNotKeepZ:=!isNotKeepZ) ? "Unc":"C"
                               . "" : (isNotKeepAR:=!isNotKeepAR) ? "Unc":"C")"heck"
             , % "Keep &"(A_ThisLabel~="mM" ? "zoom":"aspect ratio")
   If % A_ThisLabel~="tM"
      SetDefault()
   Return

ExitScript:
   Loop, 2
      DllCall("DestroyIcon", "Ptr", hIcon%A_Index%), DllCall("ReleaseDC", "Ptr", 0
                                                                        , "Ptr", hDC%A_Index%)
   ExitApp

SetDefault()
{
   Global

   reset:=True, value_:=width:=height:=155
   WinMove, % "ahk_id"hWnd_,, xWnd, yWnd, 155, 155
}

WndProc(aParams*)
{
   Global hIcon1, hIcon2, tipInfo, isPaused, WM_LBUTTONDOWN, AHK_NOTIFYICON

   If aParams.3=WM_LBUTTONDOWN
      PostMessage, WM_NCLBUTTONDOWN:=0xA1, HTCAPTION:=2,,, % "ahk_id"aParams.4
   Else If aParams.2=WM_LBUTTONUP:=0x202
   {
      Gui, % (isPaused:=!isPaused) ? "Cancel":"Show"
      TrayIcon(A_ScriptHwnd, 1, AHK_NOTIFYICON, isPaused ? hIcon1:hIcon2, tipInfo, 1)
      Hotkey, RCtrl & Enter, % "HotkeyAction", % isPaused ? "Off":"On"
      Hotkey, RCtrl & Up, % "HotkeyAction", % isPaused ? "Off":"On"
      Hotkey, RCtrl & Down, % "HotkeyAction", % isPaused ? "Off":"On"
      SetTimer, % "ChaseCursor", % isPaused ? "Off":100
   }
}

TrayIcon(handleWnd, uID, uCbMsg:=0, hIcon:=0, szTip:="", dwMsg:=2)
{
   Global NOTIFYICONDATA

   NumPut(handleWnd, NOTIFYICONDATA,  A_PtrSize=4 ? 04:08, "Ptr")
   NumPut(uID      , NOTIFYICONDATA,  A_PtrSize=4 ? 08:16, "UInt")
   NumPut(1|2|4    , NOTIFYICONDATA,  A_PtrSize=4 ? 12:20, "UInt")
   NumPut(uCbMsg   , NOTIFYICONDATA,  A_PtrSize=4 ? 16:24, "UInt")
   NumPut(hIcon    , NOTIFYICONDATA,  A_PtrSize=4 ? 20:32, "Ptr")
   StrPut(szTip    ,&NOTIFYICONDATA +(A_PtrSize=4 ? 24:40), 141, A_IsUnicode ? "UTF-16":"")
   NumPut(1|2      , NOTIFYICONDATA,  A_PtrSize=4 ? A_IsUnicode ? 800:416:816, "UInt")
   DllCall("shell32\Shell_NotifyIcon"(A_IsUnicode ? "W":"A"), "UInt", dwMsg
                                                            , "Ptr", &NOTIFYICONDATA)
}

Тема для обсуждения на форуме.