1

Тема: AHK: Манипуляции с окном и его элементами управления

Некоторые участники форума явно претендуют на звание разработчика. Не хватает только формальности - сделать разработку.
Предлагаю участникам такое задание.
Разработать скрипт, который позволил бы делать различные действия с окнами и их элементами управления ("контролами"). Например, чтобы при удержании Ctrl+Alt можно было курсором подвинуть контрол. Или изменить его статус (enable / disable), видимость. Также возможность изменять размер окон, у которых это не предусмотрено, сворачивать их в область уведомлений ("трей"). Было бы здорово организовать GUI-окно с выводом информации об окне, контроле под курсором и т. д., как в AutoIt3 Window Spy.

2

Re: AHK: Манипуляции с окном и его элементами управления

ypppu пишет:

Было бы здорово организовать GUI-окно с выводом информации об окне, контроле под курсором и т. д., как в AutoIt3 Window Spy.

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

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

3

Re: AHK: Манипуляции с окном и его элементами управления

Я знаю. Но объединить их в один универсальный - тоже интересная задача.

4

Re: AHK: Манипуляции с окном и его элементами управления

ypppu пишет:

Некоторые участники форума явно претендуют на звание разработчика. Не хватает только формальности - сделать разработку.
Предлагаю участникам такое задание.

Т.е. это задание только для тех, у кого статус "Участник", а хочет иметь "Разработчик"?
Кстати, этот статус("Разработчик") ничего кроме права писать в коллекцию(а это скорее "почётная обязанность") не даёт. Обычно есть ещё плюшки вроде использования HTML в сообщениях.

5 (изменено: Zohann, 2011-11-13 11:45:50)

Re: AHK: Манипуляции с окном и его элементами управления

А разработка игры Life не является разработкой?)

6

Re: AHK: Манипуляции с окном и его элементами управления

ypppu пишет:

...делать различные действия с окнами и их элементами управления ("контролами").

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

/*
*клавиши задающие направления:
   numpadup, numpaddown, numpadleft, numpadright

клавиши задающие вид действия:
   lalt+lwin+lbutton - скрытие/отображение окна (с иконой в трее)
   lalt+lbutton - движение контрола
   ralt+rctrl+* - движение контрола**
   rwin+rctrl+* - ресайз контрола**
   ralt+mbutton - раз/блокировка контрола
   ralt+mbutton(x2) - скрытие/отображение контрола
   ralt+wu/wd - прозрачность окна**
   ralt+appskey+* - ресайз окна**
   ralt+rshift - сохранение значений
   ralt/rwin+numpadclear - восстановление значений**

пункты меню:
   переключение отображения окна**
   скрытие/отображение окна**
   tilde+esc - закрытие скрипта

**требуется сохранение значений окна
 */

#NoEnv
#UseHook
#WinActivateForce
SetBatchLines, -1
DetectHiddenWindows, On
Value:=5, TransValue:=255
Menu, Tray, NoStandard
Menu, Tray, Tip, Test
Menu, Tray, Add, &AOT stored window, AOTWindow
Menu, Tray, Add, &Hide stored window, ToggleVWindow
Menu, Tray, Add
Menu, Tray, Add, &Exit (Tilde+Esc), ExitScript
OnMessage(0x401, "WM_LBUTTONUP")
SetTimer, ChaseCursor, 100
Hotkey, *NumpadUp, Action
Hotkey, *NumpadDown, Action
Hotkey, *NumpadLeft, Action
Hotkey, *NumpadRight, Action
Hotkey, *NumpadClear, Action
Hotkey, RAlt & WheelUp, Action2
Hotkey, RAlt & WheelDown, Action2
Hotkey, RAlt & LButton, Action3
Hotkey, vkC0 & Esc, ExitScript
~*LButton::Goto, Action

ChaseCursor:
   CoordMode, Mouse
   MouseGetPos, XPosA, YPosA
   CoordMode, Mouse, Relative
   MouseGetPos, XPosR, YPosR, WinID, WinCtrl
   WinGetTitle, WinTitle, % "ahk_id"WinID
   WinGetPos, WinX, WinY, WinW, WinH, % "ahk_id"WinID
   ControlGetPos, CtrlX, CtrlY, CtrlW
                , CtrlH, % WinCtrl, % "ahk_id"WinID
;   CurrentInfo()
   If GetKeyState("RAlt", "P") And GetKeyState("RShift", "P")
   {
      If IsInvisible
      {
         TrayTip,, hidden window must be visible
         Return
      }
      StoreInfo(), Message("stored", "stored size")
   }
   Return

Action:
   If GetKeyState("Alt", "P") Or GetKeyState("RWin", "P")
   {
      If GetKeyState("RAlt", "P") And GetKeyState("RCtrl", "P")
      {
         If SubStr(A_ThisHotkey, 2)="NumpadUp"
            CtrlMove(CtrlXC, CtrlYC-=Value
                   , CtrlWC, CtrlHC, "Y", "-", CtrlYC)
         Else If SubStr(A_ThisHotkey, 2)="NumpadDown"
            CtrlMove(CtrlXC, CtrlYC+=Value
                   , CtrlWC, CtrlHC, "Y", "+", CtrlYC)
         Else If SubStr(A_ThisHotkey, 2)="NumpadLeft"
            CtrlMove(CtrlXC-=Value, CtrlYC
                   , CtrlWC, CtrlHC, "X", "-", CtrlXC)
         Else If SubStr(A_ThisHotkey, 2)="NumpadRight"
            CtrlMove(CtrlXC+=Value, CtrlYC
                   , CtrlWC, CtrlHC, "X", "+", CtrlXC)
      }
      Else If GetKeyState("RWin", "P") And GetKeyState("RCtrl", "P")
      {
         If SubStr(A_ThisHotkey, 2)="NumpadUp"
            CtrlMove(CtrlXC, CtrlYC
                   , CtrlWC, CtrlHC-=Value, "H", "-", CtrlHC)
         Else If SubStr(A_ThisHotkey, 2)="NumpadDown"
            CtrlMove(CtrlXC, CtrlYC
                   , CtrlWC, CtrlHC+=Value, "H", "+", CtrlHC)
         Else If SubStr(A_ThisHotkey, 2)="NumpadLeft"
            CtrlMove(CtrlXC, CtrlYC
                   , CtrlWC-=Value, CtrlHC, "W", "-", CtrlWC)
         Else If SubStr(A_ThisHotkey, 2)="NumpadRight"
            CtrlMove(CtrlXC, CtrlYC
                   , CtrlWC+=Value, CtrlHC, "W", "+", CtrlWC)
      }
      Else If GetKeyState("AppsKey", "P")
      {
         If SubStr(A_ThisHotkey, 2)="NumpadUp"
            WinResize(WinWC, WinHC-=Value)
         Else If SubStr(A_ThisHotkey, 2)="NumpadDown"
            WinResize(WinWC, WinHC+=Value)
         Else If SubStr(A_ThisHotkey, 2)="NumpadLeft"
            WinResize(WinWC-=Value, WinHC)
         Else If SubStr(A_ThisHotkey, 2)="NumpadRight"
            WinResize(WinWC+=Value, WinHC)
      }
      Else If GetKeyState("RAlt", "P") And GetKeyState("NumpadClear", "P")
           Or GetKeyState("RWin", "P") And GetKeyState("NumpadClear", "P")
      {
         If !WinTitleS
         {
            TrayTip,, stored window is not found!
            Return
         }
         Else BackInfo()
      }
      Else If GetKeyState("LAlt", "P") And !GetKeyState("LWin", "P")
      {
         If IsInvisible
         {
            TrayTip,, hidden window must be visible!!!
            Return
         }
         StoreInfo()
         While GetKeyState("LButton", "P")
         {
            ControlMove, % WinCtrlS, XPosR-CtrlW/2, YPosR-CtrlH/2
                       ,,, % "ahk_id"WinIDS
            TrayTip,, % " control: "WinCtrlS
                    . "`nx: "CtrlX ", y: "CtrlY
            WinSet, Redraw,, % "ahk_id"WinID
            Sleep, 100
         }
         BackInfo()
      }
      Else If GetKeyState("LWin", "P") And !IsUsed
      {
         WinTitleT:=WinTitle, WinIDT:=WinID, IsUsed:=True
         WinGet, ProcPath, ProcessPath, % "ahk_id"WinIDT
         WinHide, % "ahk_id"WinIDT
         hIcon:=DllCall("Shell32.dll\ExtractAssociatedIcon", Int, 0
                                                           , Str, ProcPath
                                                           , "Ptr*", 0)
         TrayIcon(A_ScriptHwnd, 1, 0x401, hIcon, WinTitleT, 0)
      }
   }
   Else Send, % "{"SubStr(A_ThisHotkey, 2)" Down}"
   KeyWait, % A_ThisHotkey
   If GetKeyState("Alt", "P") Or GetKeyState("RWin", "P")
      Return
   Else Send, % "{"SubStr(A_ThisHotkey, 2)" Up}"
   Return

Action2:
   Hotkey, % A_ThisHotkey, WBlock, On
   If (WinIDSV!=WinIDS Or IsInvisible)
   {
      If IsInvisible
      {
         TrayTip,, hidden window must be visible
         Sleep, 50
         Hotkey, % A_ThisHotkey, Action2, On
         Return
      }
      WinSet, Trans, % TransValue:=255, % "ahk_id"WinIDSV
      WinIDSV:=""
   }
   WinActivate, % "ahk_id"WinIDS
   TTransValue:=A_ThisHotkey="RAlt & WheelUp" ? 255:0
   If (TransValue=TTransValue Or !WinIDS)
   {
      If !WinIDS
         TrayTip,, stored window is not found!
      Sleep, 50
      Hotkey, % A_ThisHotkey, Action2, On
      Return
   }
   TransValue.=A_ThisHotkey="RAlt & WheelUp" ? +=15:-=15
   WinSet, Trans, % TransValue, % "ahk_id"WinIDS
   Str:="", WinIDSV:=WinIDS
   If TransValue=255
      Str:=" (opaque)"
   Else If TransValue=0
      Str:=" (transparent)"
   TrayTip,, % "transparency: "TransValue . Str
   Sleep, 50
   Hotkey, % A_ThisHotkey, Action2, On
WBlock:
   Return

Action3:
   KeyWait, LButton
   Itr++
   SetTimer, Counter, -250
   Return
Counter:
   If Itr=1
      SetTimer, ActionBySClick, -0
   Else If Itr=2
      SetTimer, ActionByDClick, -0
   Itr:=""
   Return
ActionBySClick:
   ControlGet, CCheck, Enabled,, % WinCtrl, % "ahk_id"WinID
   Control, % CCheck ? "Disable":"Enable",, % WinCtrl, % "ahk_id"WinID
   WinSet, Redraw,, % "ahk_id"WinID
   TrayTip,, % "control: "WinCtrl . (CCheck ? "`ndisable":"`nenable")
   Return
ActionByDClick:
   If !CtrlHidden
      WinCtrlV:=WinCtrl, WinIDV:=WinID
   WinActivate, % "ahk_id"WinIDV
   Control, % !CtrlHidden ? "Hide":"Show",, % WinCtrlV, % "ahk_id"WinIDV
   WinSet, Redraw,, % "ahk_id"WinID
   TrayTip,, % "control: "WinCtrlV . (!CtrlHidden ? "`nhidden":"`nvisible")
   CtrlHidden:=!CtrlHidden
   Return

ToggleVWindow:
   If (!WinIDS Or WinIDT=WinIDS)
   {
      TrayTip,, % "stored window "
              . (!WinIDS ? "is not found!"
                         : "has already hidden!")
      Return
   }
   If !IsInvisible
      WinHide, % "ahk_id"WinIDS
   Else
      WinShow, % "ahk_id"WinIDS
   Menu, Tray, Rename, % (!IsInvisible ? "&Hide"
                                       : "&Show") . " stored window"
                     , % (!IsInvisible ? "&Show"
                                       : "&Hide") . " stored window"
   IsInvisible:=!IsInvisible
   Return

AOTWindow:
   If !WinIDS
   {
      TrayTip,, stored window is not found!
      Return
   }
   WinSet, AlwaysOnTop, Toggle, % "ahk_id"WinIDS
   WinGet, IsExStyle, ExStyle, % "ahk_id"WinIDS
   TrayTip,, % IsExStyle&8 ? "stored window is" . "`n  always on top"
                           : " stored window is" . "`nnot always on top"
   Menu, Tray, % IsExStyle&8 ? "Check":"Uncheck"
             , &AOT stored window
   Return

ExitScript:
   ExitApp

CtrlMove(X, Y, W, H, Dir, Sign, Val)
{
   global
   If (!WinCtrlS Or IsInvisible)
   {
      TrayTip,, % "stored window "
             . (IsInvisible ? "must be visible":"is not found!")
      Return
   }
   WinActivate, % "ahk_id"WinIDS
   ControlMove, % WinCtrlS, X, Y, W, H, % "ahk_id"WinIDS
   MouseMove, X+W/2, Y+H/2
   TrayTip,, % " control: "WinCtrlS
           . "`nact.: "Sign ", dir.: "Dir ", val.: "Val
   WinSet, Redraw,, % "ahk_id"WinID
}

WinResize(W, H)
{
   global
   If (!WinIDS Or IsInvisible)
   {
      TrayTip,, % "stored window "
             . (IsInvisible ? "must be visible":"is not found!")
      Return
   }
   WinActivate, % "ahk_id"WinIDS
   WinMove, % "ahk_id"WinIDS,, WinXC, WinYC, W, H
   MouseMove, W/2, H/2
   TrayTip,, % "size window: "WinTitleS
           . "`n"W "x"H
   WinSet, Redraw,, % "ahk_id"WinID
}

StoreInfo()
{
   global
   WinTitleS:=WinTitle
   WinCtrlS:=WinCtrl, WinIDS:=WinID
   WinWS:=WinWC:=WinW, WinHS:=WinHC:=WinH
   CtrlXS:=CtrlXC:=CtrlX, CtrlYS:=CtrlYC:=CtrlY
   CtrlWS:=CtrlWC:=CtrlW, CtrlHS:=CtrlHC:=CtrlH
   WinGet, IsExStyle, ExStyle, % "ahk_id"WinIDS
   Menu, Tray, % IsExStyle&8 ? "Check":"Uncheck"
             , &AOT stored window
   If (WinIDSV!=WinIDS)
   {
      WinSet, Trans, % TransValue:=255, % "ahk_id"WinIDSV
      WinIDSV:=""
   }
}

BackInfo()
{
   global
   If ((WinIDT=WinIDS And IsUsed) Or IsInvisible)
   {
      TrayTip,, stored window must be visible
      Return
   }
   CtrlMove(CtrlXS, CtrlYS, CtrlWS, CtrlHS, "", "", "")
   WinResize(WinWS, WinHS), Message("reset", "resize")
   CtrlXC:=CtrlXS, CtrlYC:=CtrlYS
   CtrlWC:=CtrlWS, CtrlHC:=CtrlHS
}

Message(Text1, Text2)
{
   global
   TrayTip,, % Text1 " control: "WinCtrlS
      . "`nx: "CtrlXS ", y: "CtrlYS
      . ", w: "CtrlWS ", h: "CtrlHS
         . "`n"Text2 " window: "WinTitleS
         . "`n"WinWS "x"WinHS
}

CurrentInfo()
{
   global
   ToolTip, % "coords: ax: "XPosA ", ay: "YPosA
          . "`n`trx: "XPosR ", ry: "YPosR
;          . "`nwindow: "WinTitle
;          . "`n`tw: "WinW ", h: "WinH
;          . "`n`tx: "WinX ", y: "WinY
          . "`ncontrol: "WinCtrl
          . "`n`tw: "CtrlW ", h: "CtrlH
          . "`n`tx: "CtrlX ", y: "CtrlY
}

WM_LBUTTONUP(wParam, lParam, Msg, hWnd)
{
   global
   If (Msg=0x401 And lParam=0x202) ; WM_USER & WM_LBUTTONUP
   {
      WinShow, % "ahk_id"WinIDT
      WinActivate, % "ahk_id"WinIDT
      TrayIcon(A_ScriptHwnd, 1, 0x401, 0, "", 2)
      DllCall("DestroyIcon", Int, hIcon)
      WinIDT:=IsUsed:=False
   }
}

TrayIcon(hWnd, uID, uCbMsg=0, hIcon=0, Title="", dwMsg=2)
{
   VarSetCapacity(NID, 68, 0)
   NumPut(VarSetCapacity(NID), NID, 0)
   NumPut(hWnd, NID, 4)
   NumPut(uID, NID, 8)
   NumPut(7, NID, 12)
   NumPut(uCbMsg, NID, 16)
   NumPut(hIcon, NID, 20)
   StrPut(Title, &NID+24, 64, "UTF-16")
   DllCall("Shell32.dll\Shell_NotifyIcon"
                       . (A_IsUnicode ? "W":"A"), Int, dwMsg
                                                , Int, &NID)
}
ypppu пишет:

Было бы здорово организовать GUI-окно с выводом информации об окне, контроле под курсором и т. д., как в AutoIt3 Window Spy.

Я делаю под личные нужды, что-то подобное, позже выложу.