1

Тема: AHK: Поиск окна и клик по нему

Имеется окно с заголовком например "My Program" с размерами 400x300
По выше имеющимся данным, мне надо найти координаты окна и подвести мышь например в центр и кликнуть
Я новичок в AHK, подскажите как это реализовать
За ранее огромное спасибо

2 (изменено: Mikki, 2013-05-22 11:08:53)

Re: AHK: Поиск окна и клик по нему

WinActivate, My Program
WinGetPos,,, w_W, w_H
Click w_W/2, w_H/2         ; по умолчанию размеры берутся относительно активного окна 

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

3 (изменено: Hydrogenium, 2013-05-23 05:29:52)

Re: AHK: Поиск окна и клик по нему

F11::
  WinActivate, Калькулятор
  WinGetPos, X, Y, Width, Height
  MouseMove 37, 195 
  Click
Return

Вопросы:
1) Строка Click 37, 195 должна была переместить курсор и кликнуть, но чё-то не проканало (мышь не двигалась), пришлось добавлять MouseMove
2) Как и где объявить переменные и константы, примеры пожалуйста в студию ?
3) В Delphi есть функция GetClientRect - Считывает кооpдинаты пользователя окна.
http://platonov-andrei.narod.ru/Delphi/ … ntRect.htm
Есть ли подобная в AHK ? Мне нужно получить размеры клиентской области, независимо от стиля окон



Пример клиентской области окна:

+ открыть спойлер

http://f4.s.qip.ru/n037PnC2.png

4 (изменено: serzh82saratov, 2013-05-23 12:55:59)

Re: AHK: Поиск окна и клик по нему

2) Как и где объявить переменные и константы, примеры пожалуйста в студию ?

непонятный вопрос. Вероятно вы про: w_W, w_H, то они создаются и назначаются в команде WinGetPos.

В Delphi есть функция GetClientRect - Считывает кооpдинаты пользователя окна.


GetClientRect(WinExist("A"), rX, rY, rWidth, rHeight)
MsgBox %  "rX = " rX
        . "`nrY = " rY
        . "`nrWidth = " rWidth
        . "`nrHeight = " rHeight
 
GetClientRect(hwnd, ByRef rX, ByRef rY, ByRef rWidth, ByRef rHeight) {
    WinGetPos, , , , Window_Height, ahk_id %hwnd%
    VarSetCapacity(rcClient, 16, 0) 
    DllCall("user32\GetClientRect","uint", hwnd ,"uint",&rcClient)   
    rcClient_b := NumGet(rcClient, 12) 
    VarSetCapacity(pwi, 68, 0)
    DllCall("GetWindowInfo", "UInt", hwnd, "UInt", &pwi) 
    rX := NumGet(pwi, 48) , by := NumGet(pwi, 52) 
    rY := Window_Height - by - rcClient_b  
    rWidth := NumGet(rcClient, 8)
    rHeight := NumGet(rcClient, 12)
}    

Только размеры:


GetClientSize(WinExist("A"), rcRealWidth, rcRealHeight)
MsgBox % "rWidth = " rcRealWidth
        . "`nrHeight = " rcRealHeight
 
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) {
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","uint", hwnd ,"uint",&rcClient)   
    RealWidth := NumGet(rcClient, 8)
    RealHeight := NumGet(rcClient, 12)
}    

независимо от стиля окон

это не понял.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Поиск окна и клик по нему

Пример скрипта с определением переменных Констант как класса нет

Докумантация (engl) по структуре скрипта

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

6 (изменено: Hydrogenium, 2013-05-28 09:16:21)

Re: AHK: Поиск окна и клик по нему

Задача усложняется

Мне требуется пробежаться по всем окнам и если размеры окна и заголовки совпадают с нужными, то кликаем например в координату 10,10
размеры и координаты для клика нужно искать в клиентской области (типа GetClientRect)

Скорректируйте пожалуйста код:

WinGet, id, list,,, Program Manager
Loop, %id%
{
    hwnd := id%A_Index%
    WinActivate, ahk_id %this_id%    
    WinGetTitle, this_title, ahk_id %this_id%
   
   
   if this_title = "Калькулятор"
   {
     ;GetClientRect(hwnd, ByRef rX, ByRef rY, ByRef rWidth, ByRef rHeight)
     MsgBox, Найден Калькулятор.
     ;break
     MouseMove 10, 10 
     Click
   }   
}

7

Re: AHK: Поиск окна и клик по нему

Мне требуется пробежаться по всем окнам

По всем окнам из какого множества? Всем существующим в системе в данный момент, или только по окнам с заголовком «Program Manager»?

    hwnd := id%A_Index%
    WinActivate, ahk_id %this_id% 

Где в переменную this_id записывается значение? Каков, по-вашему, смысл процитированного фрагмента кода?

8

Re: AHK: Поиск окна и клик по нему


WinGet, id, list, Калькулятор
Loop, %id%
{      
    GetClientSize(id%A_Index%, rcRealWidth, rcRealHeight)
    If (rcRealWidth = 264 && rcRealHeight = 456)
    { 
        WinActivate, % "ahk_id " id%A_Index%
        CoordMode, Mouse, Client     
        Click  10, 10
    }
}
return

 
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) {
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","uint", hwnd ,"uint",&rcClient)   
    RealWidth := NumGet(rcClient, 8), RealHeight := NumGet(rcClient, 12)
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: Hydrogenium, 2013-05-28 17:49:21)

Re: AHK: Поиск окна и клик по нему

Спасиб большое !
Подскажите, где ошибка ?


;--------------------------------------------------------------------------------------------------
; Set
;--------------------------------------------------------------------------------------------------
title := "Калькулятор" 
Width := 212
Height := 264
x := 25
y := 140

myFunc:
myFunc(title,Width,Height,x,y)
return

;--------------------------------------------------------------------------------------------------
; myFunc
;--------------------------------------------------------------------------------------------------
myFunc(title,Width,Height,x,y)
{
    WinGet, id, list, title
    Loop, %id%
    {      
        GetClientSize(id%A_Index%, rcRealWidth, rcRealHeight)
        If (rcRealWidth = Width && rcRealHeight = Height)
        { 
            WinActivate, % "ahk_id " id%A_Index%
            CoordMode, Mouse, Client     
            Click x, y
        }
    }
    return
}

 
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) 
{
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","uint", hwnd ,"uint",&rcClient)   
    RealWidth := NumGet(rcClient, 8), RealHeight := NumGet(rcClient, 12)
} 

10

Re: AHK: Поиск окна и клик по нему

Может - Click %x%, %y%

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Поиск окна и клик по нему

и - WinGet, id, list, %title%

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12 (изменено: Hydrogenium, 2013-05-28 18:15:12)

Re: AHK: Поиск окна и клик по нему

так всё норм работает

+ открыть спойлер
WinGet, id, list, Калькулятор
Loop, %id%
{      
    GetClientSize(id%A_Index%, rcRealWidth, rcRealHeight)
    If (rcRealWidth = 212 && rcRealHeight = 264)
    { 
        WinActivate, % "ahk_id " id%A_Index%
        CoordMode, Mouse, Client     
        Click  25, 140
    }
}
return
 
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) 
{
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","uint", hwnd ,"uint",&rcClient)   
    RealWidth := NumGet(rcClient, 8), RealHeight := NumGet(rcClient, 12)
} 

выпадает тока
MsgBox, 1

+ открыть спойлер

;--------------------------------------------------------------------------------------------------
; Set
;--------------------------------------------------------------------------------------------------
title := "Калькулятор" 
Width := 212
Height := 264
x := 25
y := 140

myFunc:
myFunc(title, Width, Height, x, y)
return

;--------------------------------------------------------------------------------------------------
; myFunc
;--------------------------------------------------------------------------------------------------
myFunc(title, Width, Height, x, y)
{
    WinGet, id, list, %title%
    Loop, %id%
    {  

MsgBox, 1
        GetClientSize(id%A_Index%, rcRealWidth, rcRealHeight)
        If (rcRealWidth = %Width% && rcRealHeight = %Height%)
        { 
MsgBox, 2
            WinActivate, % "ahk_id " id%A_Index%
            CoordMode, Mouse, Client     
            Click %x%, %y%
MsgBox, 3

        }
    }
    return
}
return
 
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) 
{
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","uint", hwnd ,"uint",&rcClient)   
    RealWidth := NumGet(rcClient, 8), RealHeight := NumGet(rcClient, 12)
} 

13

Re: AHK: Поиск окна и клик по нему

А кто говорил про знаки процента в выражении?

If (rcRealWidth = %Width% && rcRealHeight = %Height%)
If (rcRealWidth = Width && rcRealHeight = Height)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Поиск окна и клик по нему

serzh82saratov пишет:

А кто говорил про знаки процента в выражении?

If (rcRealWidth = %Width% && rcRealHeight = %Height%)
If (rcRealWidth = Width && rcRealHeight = Height)

спасиб, ещё раз :DDD

15 (изменено: Hydrogenium, 2013-05-28 18:27:03)

Re: AHK: Поиск окна и клик по нему

а почему у меня не получается развернуть окно (WinRestore), когда оно свёрнуто ?


WinRestore, % "ahk_id " id%A_Index%
WinActivate, % "ahk_id " id%A_Index%
CoordMode, Mouse, Client     
Click %x%, %y%

16

Re: AHK: Поиск окна и клик по нему

Я не знаю.
А зачем? WinActivate ведь показывает окно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: Hydrogenium, 2013-05-28 18:39:34)

Re: AHK: Поиск окна и клик по нему

serzh82saratov пишет:

Я не знаю.
А зачем? WinActivate ведь показывает окно.

если я сверну окно,

+ открыть спойлер

http://f3.s.qip.ru/n037PnLD.png

то всё ппц, WinActivate не развёрнёт его, он же тока меняет z-посл.

18

Re: AHK: Поиск окна и клик по нему

Попробуйте:

Если какое-то окно не реагирует на WinRestore должным образом, попробуйте использовать следующий пример:
PostMessage, 0x112, 0xF120,,, WinTitle, WinText ; 0x112 = WM_SYSCOMMAND, 0xF120 = SC_RESTORE

WinActivate не развёрнёт его

У меня разворачивает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19 (изменено: Hydrogenium, 2013-05-29 04:31:42)

Re: AHK: Поиск окна и клик по нему

понял я прикол
у свёрнутого окна другие Width и Height

20

Re: AHK: Поиск окна и клик по нему

какой-то бред стал
работало же всё норм
щас ваще какие-то бредовые клиентские размеры показывает

+ открыть спойлер
WinGet, id, list, Калькулятор
Loop, %id%
{      
    GetClientSize(id%A_Index%, rcRealWidth, rcRealHeight)
    
     MsgBox, rcRealWidth = %rcRealWidth%
     MsgBox, rcRealHeight = %rcRealHeight%
    
    
    If (rcRealWidth = 212 && rcRealHeight = 264)
    { 
        WinActivate, % "ahk_id " id%A_Index%
        CoordMode, Mouse, Client     
        Click  25, 140
    }
}
return
 
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) 
{
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","uint", hwnd ,"uint",&rcClient)   
    RealWidth := NumGet(rcClient, 8), RealHeight := NumGet(rcClient, 12)
}

http://f4.s.qip.ru/AUIOPNUr.png
http://f4.s.qip.ru/AUIOPNUs.png


чё случилось с GetClientSize ???

21

Re: AHK: Поиск окна и клик по нему

У свёрнутого окна? У меня нулевые показывает.

22 (изменено: Hydrogenium, 2013-06-02 14:44:53)

Re: AHK: Поиск окна и клик по нему

YMP пишет:

У свёрнутого окна? У меня нулевые показывает.

окно не свёрнуто

ппц, как мог сломаться GetClientSize ?

23

Re: AHK: Поиск окна и клик по нему

Никак не мог. Видимо, запускаете на АНК х64, а код написан под 32-битный. Попробуйте этот вариант:


WinGet, id, list, Калькулятор
Loop, %id%
{      
    GetClientSize(id%A_Index%, rcRealWidth, rcRealHeight)
    
     MsgBox, rcRealWidth = %rcRealWidth%
     MsgBox, rcRealHeight = %rcRealHeight%
    
    
    If (rcRealWidth = 212 && rcRealHeight = 264)
    { 
        WinActivate, % "ahk_id " id%A_Index%
        CoordMode, Mouse, Client     
        Click  25, 140
    }
}
return
 
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) 
{
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","ptr", hwnd ,"ptr",&rcClient)   
    RealWidth := NumGet(rcClient, 8, "int"), RealHeight := NumGet(rcClient, 12, "int")
}

24 (изменено: Hydrogenium, 2013-06-02 16:58:37)

Re: AHK: Поиск окна и клик по нему

YMP, спасиб помогло

и что даёт эта строчка ?

DllCall("user32\GetClientRect","ptr", hwnd ,"ptr",&rcClient) 

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

25

Re: AHK: Поиск окна и клик по нему

Запускаться будет на том, который у вас установлен. Эти изменения (ещё в NumGet 3-й параметр) делают код универсальным, т.е. пригодным для 32 и 64 бит.

Дело в том, что некоторые типы данных имеют разный размер в зависимости от битности процесса. Это нужно учитывать, чтобы код работал правильно при обеих.

26

Re: AHK: Поиск окна и клик по нему

YMP
А немогли-бы вы сделать универсальной и эту функцию?:


GetClientPos(hwnd, ByRef x, ByRef y) {
    WinGetPos, , , , Window_Height, ahk_id %hwnd%
    VarSetCapacity(rcClient, 16, 0)
    DllCall("user32\GetClientRect","uint", hwnd ,"uint",&rcClient)
    rcClient_b := NumGet(rcClient, 12)
    VarSetCapacity(pwi, 68, 0)
    DllCall("GetWindowInfo", "UInt", hwnd, "UInt", &pwi)
    x := NumGet(pwi, 48)
    by := NumGet(pwi, 52)
    y := Window_Height - by - rcClient_b
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

27

Re: AHK: Поиск окна и клик по нему

YMP
Ничего непонимая, попытался сделать по аналогии:


GetClientPos(hwnd, ByRef x, ByRef y) {
    WinGetPos, , , , Window_Height, ahk_id %hwnd%
    VarSetCapacity(rcClient, 16, 0)
    DllCall("user32\GetClientRect","ptr", hwnd ,"ptr",&rcClient)  
    rcClient_b := NumGet(rcClient, 12, "int")
    VarSetCapacity(pwi, 68, 0)
    DllCall("GetWindowInfo", "ptr", hwnd, "ptr", &pwi)
    x := NumGet(pwi, 48, "int")
    by := NumGet(pwi, 52, "int")
    y := Window_Height - by - rcClient_b
} 

Вроде работает... Ошибки есть?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Поиск окна и клик по нему

serzh82saratov
Всё правильно. Только размер у структуры WINDOWINFO 60 байт, а не 68, и полагается этот размер писать в её первый элемент как UInt.

Размер типа HWND зависит от битности, поэтому его нужно передавать как Ptr. То же относится к адресам (оператор &). NumGet, если тип не указан, считывает либо UInt, либо Int64. Но элементы структуры RECT при любой битности — 32-битные целые. Поэтому их нужно читать, явно задав 32-битный тип.

Ещё размер структур может быть разным, но те, что здесь используются, не меняются.

Если имя типа начинается с H, то это какой-то хэндл и его размер меняется. Есть исключения — HRESULT, HFILE, это не хэндлы и всегда 32-битные. HALF_PTR тоже не хэндл, либо 16, либо 32 бита.

29

Re: AHK: Поиск окна и клик по нему

Когда я хоть что-то пойму в винапи...

Только размер у структуры WINDOWINFO 60 байт, а не 68

?=  VarSetCapacity(pwi, 60, 0)
Но что за цифры 60. И 68 тоже.

и полагается этот размер писать в её первый элемент как UInt

Это не понял совсем.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Поиск окна и клик по нему

? так:


GetClientPos(hwnd, ByRef x, ByRef y) {
    WinGetPos, , , , Window_Height, ahk_id %hwnd%
    VarSetCapacity(rcClient, 16, 0)
    DllCall("user32\GetClientRect","ptr", hwnd ,"ptr",&rcClient)  
    rcClient_b := NumGet(rcClient, 12, "int")
    VarSetCapacity(pwi, 60, 0)
    DllCall("GetWindowInfo", "ptr", hwnd, "Uint", &pwi)
    x := NumGet(pwi, 48, "int")
    by := NumGet(pwi, 52, "int")
    y := Window_Height - by - rcClient_b
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31

Re: AHK: Поиск окна и клик по нему

serzh82saratov пишет:

?=  VarSetCapacity(pwi, 60, 0)
Но что за цифры 60. И 68 тоже.

Размер структуры. Вот её определение:

typedef struct {
    DWORD cbSize;
    RECT rcWindow;
    RECT rcClient;
    DWORD dwStyle;
    DWORD dwExStyle;
    DWORD dwWindowStatus;
    UINT cxWindowBorders;
    UINT cyWindowBorders;
    ATOM atomWindowType;
    WORD wCreatorVersion;
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;

DWORD = UINT = 4 байта. RECT = 4  LONG'a = 16 байт. ATOM = WORD = 2 байта.

serzh82saratov пишет:

Это не понял совсем.

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


NumPut(60, pwi, 0, "UInt")

32

Re: AHK: Поиск окна и клик по нему

Что-то я совсем запутался. Количество новых вопросов равно квадрату от получаемых ответов...
Дилетанту непереварить.

NumPut(60, pwi, 0, "UInt") - даже непонял куда писать.

Код из №30 поста можно назвать рабочим?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33

Re: AHK: Поиск окна и клик по нему

serzh82saratov пишет:

NumPut(60, pwi, 0, "UInt") - даже непонял куда писать.

Ну как куда, сразу после создания структуры, т.е. VarSetCapacity(pwi, 60, 0).

serzh82saratov пишет:

Код из №30 поста можно назвать рабочим?

Если работает, то можно.

34

Re: AHK: Поиск окна и клик по нему

Если работает, то можно.

А как правильно?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

35

Re: AHK: Поиск окна и клик по нему

Ищу окно калькулятор и когда доходит прогон до окна редактора, то выпадает ошибка
чё-то не догоняю в чём дело

+ открыть спойлер

#Persistent
SetTimer, myFunc, 1000
return

myFunc: 
{
    SetTimer, myFunc, Off ; здесь таймер выключает себя сам.
    
    WinGet, id, list
    Loop, %id%
    {
        this_id := id%A_Index%
        ;WinActivate, ahk_id %this_id%
        WinGetClass, this_class, ahk_id %this_id%
        WinGetTitle, this_title, ahk_id %this_id%
        MsgBox, Обход всех окон`n`n %a_index% из %id% `n ahk_id %this_id% `n ahk_class %this_class% `n %this_title%        
        
        CheckTitle(%this_title%)  
    }
    
    SetTimer, myFunc, On ; здесь таймер включает себя сам.    
}
return

CheckTitle(title)
{
    
}
return
+ открыть спойлер

http://f3.s.qip.ru/AUIOPNUO.png
http://f3.s.qip.ru/AUIOPNUP.png

36

Re: AHK: Поиск окна и клик по нему

serzh82saratov пишет:

Если работает, то можно.

А как правильно?

Ну вот добавить запись размера структуры, и будет правильно.

Ekklesiast
При вызове функций переменные пишутся без процентов.

CheckTitle(this_title)

37 (изменено: Hydrogenium, 2013-06-03 16:03:39)

Re: AHK: Поиск окна и клик по нему

YMP, спасиб

38 (изменено: Hydrogenium, 2013-06-05 10:03:12)

Re: AHK: Поиск окна и клик по нему

Почему мышь не позиционируется относительно клиентского окна ?
т.е. мышь не движется к цели

+ открыть спойлер

WT := 472
HT := 359 
x1 := 325
y2 := 335

F9::   
    MouseGetPos, xpos, ypos
    
    WinGet, active_id, ID, A 

    GetClientSize(active_id, rcRealWidth, rcRealHeight)
    
    w := rcRealWidth - WT
    x := x1 + Round(w / 1.2)
    
    h := rcRealHeight - HT
    y := y2 + Round(h / 1.4)

    ;~ активируем окно
    ;~ WinActivate, ahk_id %active_id%
    
    ;~ позиционируем относительно клиентской области и кликаем
    CoordMode, Mouse, Client
    ; MouseMove x, y     
    Click x, y 
    
    CoordMode, Mouse    
    MouseMove xpos, ypos        
Return


;--------------------------------------------------------------------------------------------------
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) 
{
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","ptr", hwnd ,"ptr",&rcClient)   
    RealWidth := NumGet(rcClient, 8, "int"), RealHeight := NumGet(rcClient, 12, "int")
}

39

Re: AHK: Поиск окна и клик по нему

А где её цель? У меня ваш код двигает мышь влево.

40 (изменено: Hydrogenium, 2013-06-05 10:36:06)

Re: AHK: Поиск окна и клик по нему

YMP пишет:

А где её цель

x1 := 325
y2 := 335

YMP пишет:

У меня ваш код двигает мышь влево.

а почему в влево ?

x1 := 325
y2 := 335

x := x1 + Round(w / 1.2) 
y := y2 + Round(h / 1.4)

наверное мышь слишком правее



p.s.

если

  
MouseMove x, y     
Click x, y 

то двигает и кликает

41

Re: AHK: Поиск окна и клик по нему

так?

Click %x%, %y%

и

MouseMove %xpos%, %ypos% 
Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

42 (изменено: Hydrogenium, 2013-06-05 11:11:19)

Re: AHK: Поиск окна и клик по нему

Mikki пишет:

так?

Click %x%, %y%

и

MouseMove %xpos%, %ypos% 

ага, спасиб
ведь пропустил, что они переменные

43

Re: AHK: Поиск окна и клик по нему

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

44

Re: AHK: Поиск окна и клик по нему

не догоняю, почему мышь не возвращается на исходное место после клика ?

+ открыть спойлер
WT := 400
HT := 300 
x1 := 40
y2 := 40

F9::   
    MouseGetPos, xpos, ypos
    
    WinGet, active_id, ID, A 

    GetClientSize(active_id, rcRealWidth, rcRealHeight)
    
    w := rcRealWidth - WT
    x := x1 + 10
    
    h := rcRealHeight - HT
    y := y2 + 10   
    
    ;~ позиционируем относительно клиентской области и кликаем
    CoordMode, Mouse, Client        
    Click %x%, %y% 
    
    CoordMode, Mouse    
    MouseMove %xpos%, %ypos%        
Return


;--------------------------------------------------------------------------------------------------
GetClientSize(hwnd, ByRef RealWidth, ByRef RealHeight) 
{
    VarSetCapacity(rcClient, 16, 0)      
    DllCall("user32\GetClientRect","ptr", hwnd ,"ptr",&rcClient)   
    RealWidth := NumGet(rcClient, 8, "int"), RealHeight := NumGet(rcClient, 12, "int")
}

45

Re: AHK: Поиск окна и клик по нему

CoordMode поменялся.

46

Re: AHK: Поиск окна и клик по нему

YMP пишет:

CoordMode поменялся.

при

CoordMode, Mouse 

восстанавливается в норму же

47

Re: AHK: Поиск окна и клик по нему

Нет, устанавливается режим Screen, а изначально Window.

48 (изменено: Hydrogenium, 2013-06-05 14:08:32)

Re: AHK: Поиск окна и клик по нему

YMP пишет:

Нет, устанавливается режим Screen, а изначально Window.

вроде так

CoordMode, Mouse, Relative 

а обязательно тут ставить проценты

MouseMove %xpos%, %ypos%  

без них тоже работает ?

49

Re: AHK: Поиск окна и клик по нему

Для MouseMove не обязательно. А вообще надо смотреть в описании команды. Если там сказано, что параметр может быть выражением, то проценты необязательны.
http://www.script-coding.com/AutoHotkey/MouseMove.html

50 (изменено: Hydrogenium, 2013-06-24 02:32:04)

Re: AHK: Поиск окна и клик по нему

Пробегаюсь по окнам таким кодом

+ открыть спойлер

WinGet, id, list
Loop, %id%
{
    this_id := id%A_Index%
    ;~ WinActivate, ahk_id %this_id%
    WinGetClass, this_class, ahk_id %this_id%
    WinGetTitle, this_title, ahk_id %this_id%
     MsgBox, 4,
    , Обход всех окон`n`n%a_index% из %id%`nahk_id =  %this_id%`nahk_class = %this_class%`n%this_title%`n`nПродолжить?
    IfMsgBox, NO, break
}

и попадаются всякие системные и.т.п. окна

+ открыть спойлер

http://f4.s.qip.ru/AUIOPOhN.png
http://f3.s.qip.ru/AUIOPOhO.png

Что нужно добавить, чтобы их проигнорировать, т.е. мне нужен перебор тока видимых рабочих окон, которые на панели задач ?
Забивать массив ahk_class и игнорить по ним ?

51

Re: AHK: Поиск окна и клик по нему

serzh82saratov пишет:

YMP
Ничего непонимая, попытался сделать по аналогии:


GetClientPos(hwnd, ByRef x, ByRef y) {
    WinGetPos, , , , Window_Height, ahk_id %hwnd%
    VarSetCapacity(rcClient, 16, 0)
    DllCall("user32\GetClientRect","ptr", hwnd ,"ptr",&rcClient)  
    rcClient_b := NumGet(rcClient, 12, "int")
    VarSetCapacity(pwi, 68, 0)
    DllCall("GetWindowInfo", "ptr", hwnd, "ptr", &pwi)
    x := NumGet(pwi, 48, "int")
    by := NumGet(pwi, 52, "int")
    y := Window_Height - by - rcClient_b
} 

Вроде работает... Ошибки есть?


Видимо какая то бредовая функция. Зачем GetClientRect, если в GetWindowInfo есть все данные?


1::
GetClientPos(WinExist("A"), top, left, w, h) 
ToolTip % " top " top
        . "`n left " left
        . "`n w " w
        . "`n h " h
        
GetClientPos(hwnd, ByRef top, ByRef left, ByRef w, ByRef h)   { 
    VarSetCapacity(pwi, 60, 0), NumPut(60, pwi, 0, "UInt")
    DllCall("GetWindowInfo", "ptr", hwnd, "Uint", &pwi) 
    top:=NumGet(pwi,24,"int")-NumGet(pwi,8,"int")
    left:=NumGet(pwi,52,"int")
    w:=NumGet(pwi,28,"int")-NumGet(pwi,20,"int") 
    h:=NumGet(pwi,32,"int")-NumGet(pwi,24,"int")
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

52 (изменено: seriousstas, 2016-09-12 15:25:00)

Re: AHK: Поиск окна и клик по нему

Мне нужно найти и кликнуть без движения мыши .
Пробую так :

ControlClick, uie_jscript_panel_class1, ahk_class {E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}

Работает если окно в верхней левой части монитора, если смещать вправо вниз перестает кликать.
Подскажите, начинающий ..
Спасибо!

53 (изменено: seriousstas, 2016-09-26 17:55:03)

Re: AHK: Поиск окна и клик по нему

Подниму вопрос , так это выглядит (попытка постом выше) :
https://youtu.be/n6eGEr0Wefw
Кликнуть нужно в это окно :

>>>> Window <<<<
Title: Soul Time - foobar2000
Class: {E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}
Position: 438, 139
Size: 1055, 675
Style: 0x160B0000
ExStyle: 0x00000000
Handle: 0x0000000000E7104C

>>>> Control <<<<
Class: uie_jscript_panel_class
Instance: 1
ClassnameNN: uie_jscript_panel_class1
Name:
Advanced (Class): [CLASS:uie_jscript_panel_class; INSTANCE:1]
ID:
Text:
Position: 528, 3
Size: 528, 549
ControlClick Coords: 240, 276
Style: 0x56000000
ExStyle: 0x00000000
Handle: 0x0000000000BA101C

>>>> Mouse <<<<
Position: 1206, 418
Cursor ID: 0
Color: 0x1C1C21

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
Mega Panel Splitter


>>>> Hidden Text <<<<
Analog VU Meter
PeakmeterSpectrum

Надеюсь кто-то подскажет как сюда правильно кликнуть скрытым курсором ?
СПАСИБО!

54

Re: AHK: Поиск окна и клик по нему

По этому значку нужно щёлкать?

Post's attachments

but.PNG
but.PNG 21.64 kb, 1 downloads since 2016-09-26 

You don't have the permssions to download the attachments of this post.

55 (изменено: seriousstas, 2016-09-26 22:28:02)

Re: AHK: Поиск окна и клик по нему

ypppu пишет:

По этому значку нужно щёлкать?

Нет-нет  это WSH кнопка которая запускает AHK скрипт(отсюда: \4Icar_13_7_MPS_UNI\foobar2000\Emul\click.exe) . Её основная задача показать  играющий трек в плейлисте (последующие нажатия масштабируют окна - уже своими силами),
но тк фокус на кнопках в  момент нажатия - нужен "помощник" .
Кликнуть нужно по плейлисту (списку треков)
Закинул сборку письмом   - при запуске сборки  - это окно справа . Уменьшить ширину строк (ctrl+колесо) списка

56

Re: AHK: Поиск окна и клик по нему

seriousstas, не понятно, что требуется. Название темы "AHK: Поиск окна и клик по нему". Вы пишете

Мне нужно найти и кликнуть без движения мыши

По окну или по элементу управления или по координатам или по пиктограмме?

57 (изменено: seriousstas, 2016-09-26 22:53:13)

Re: AHK: Поиск окна и клик по нему

Пока Вы писали - я уже подредактировал пост выше и сделал скрин (по окну справа - если нажимать прицел окно разворачивается,
но его основные параметры :http://forum.script-coding.com/viewtopi … 17#p108017 не меняются) :
http://jpegshare.net/thumbs/d5/46/d546972c7d70295804b7968c5b4ae1a0.jpg
Кнопка , что на Вашем скрине  - запускает  скрипт AHK .
Его задача верно - найти окно НЕ в фокусе и кликнуть (те сделать активным, но по ClassnameNN  - или по Handle-у как-то ) .
Advanced (Class) у окон общий ..
Задача вроде-бы простая - а не выходит корректно .
.....
Забыл сказать  - сам Фубар меняет свой размер и положение на экране ..

58

Re: AHK: Поиск окна и клик по нему

Ясно, что дело тёмное. Я не знаю Фубар, Вы не можете объяснить задачу.

59 (изменено: seriousstas, 2016-09-26 23:51:16)

Re: AHK: Поиск окна и клик по нему

Попробую ещё-раз.
Если я WSH кнопкой вызываю показ трека  - команда не работает так-как нет фокуса на плейлисте .
Это ОКНО справа на скрине .
Задача простая  :
Навести фокус на определённое окно - всё  (в нашем случае плейлист).
Знаний плеера не нужно . 
Как это сделать по ClassnameNN или хендлу ? .
Я недавно знакомый  с AHK  нашел решение через клик , но кликает , как на видео  (только в части экрана)
У WinActivate ( "title" [, "text" ] ) нет вызова окна  по ClassNN ..

60

Re: AHK: Поиск окна и клик по нему

Тогда всё просто.

YMP пишет:
ControlFocus

Помещает фокус ввода на указанный контрол (элемент управления) окна.
ControlFocus [, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

SetTitleMatchMode, 2 ;находит окна, содержащие значение, заданное в WinTitle
ControlFocus, uie_jscript_panel_class1, foobar2000 ;указываем элемент управления по ClassNN

61 (изменено: seriousstas, 2016-09-27 00:21:54)

Re: AHK: Поиск окна и клик по нему

Оно, спс ! "Секрет" в первой строке  ..
Весь скрипт :

#NoTrayIcon
#SingleInstance ignore
SetTitleMatchMode, 2 ;находит окна, содержащие значение, заданное в WinTitle
ControlFocus, uie_jscript_panel_class1, foobar2000 ;указываем элемент управления по ClassNN
Sleep 50
Send ^{Numpad3};вызываю трек глобальным хоткеем .
ExitApp