Как я могу создать проект ahk, который щелкает по определенной точке в определенном c окне, а также работает в фоновом режиме? - PullRequest
0 голосов
/ 25 мая 2020

Я объясню, что я хочу, чтобы мой код делал: 1. Я открою окно 2. Я перейду к этому окну и нажмите control + q 3. Я получу координаты с помощью функции Google и отправлю их в поле ввода 4 . Код должен щелкнуть эту точку в этом окне столько раз, сколько я выбрал (я хотел бы запустить код в фоновом режиме, потому что я хочу одновременно выполнить другую задачу)

Я написал код, но он не работает должным образом

#SingleInstance force
#persistent
$^q::
WinGetTitle, Title, A
MsgBox, The active window is "%Title%".
Inputbox, c1, , Coordinate of button you want to click on(x)
Inputbox, c2, , Coordinate of button you want to click on(y)
MsgBox %c1% , %c2%
Inputbox,times, ,How many times would you like to click?
While(times>0)
{
WinGet,b,,Title                 ;I think here is the problem
ControlClick, X%c1% Y%c2%,%b%    ;or here
Sleep, 10500
times--
}
MsgBox End
return

1 Ответ

0 голосов
/ 26 мая 2020

Действительно, есть несколько проблем, которые нужно исправить, хотя их исправление еще не гарантирует, что ваш код будет работать. ControlClick ing всегда будет попаданием или промахом.

Итак, ваша самая большая проблема здесь
WinGet,b,,Title
Даже не знаю, что эта строка должна делать.
Конечно, вы пытаетесь ссылаться на переменную Title, которую вы определили выше, и чтобы сделать это в устаревшем синтаксисе, вы должны заключить ее в %%. Может быть, вы просто забыли.
Но даже с этим исправлением, я не знаю, почему используется эта команда.
Вы даже не указываете, какую подкоманду использовать, поэтому по умолчанию получается получить hwnd совпавшего window.
Если это действительно то, к чему мы стремимся, тогда вам нужно будет исправить параметр WinTitle ControlClick, чтобы указать, что вы сопоставляете окно на основе его hwnd, например:
ControlClick, X%c1% Y%c2%, ahk_id %b%

Сопоставление windows на основе их hwnd на самом деле является лучшей практикой для сопоставления windows, но ваша реализация здесь сомнительна. Я думаю, это было даже случайно.
Тем не менее, позвольте мне исправить код для более разумной реализации сопоставления hwnd.
Я также избавлюсь от устаревшего синтаксиса и переключусь на более новый и лучший синтаксис выражений .

#SingleInstance, Force
#Persistent

$^q::
    ;ditched the legacy WinGetTitle command, and switched over to
    ;the WinActive function, its return value is the HWND of the
    ;matched window (active window)
    ActiveWindowHWND := WinActive("A")

    ;getting the title as well, in case you really want to see it
    ;this part can be removed though
    WinGetTitle, ActiveWindowTitle, % "ahk_id " ActiveWindowHWND

    ;concatenating strings and values by just separting them with a space
    ;and double quotes to escape a quote in an expression
    ;outer most quotes always just specify that we're writing a string
    MsgBox, % "The active window's HWND is " ActiveWindowHWND " and its title is """ ActiveWindowTitle """"

    ;explicitly specifying that these long strings are actually strings
    Inputbox, c1, , % "Coordinate of button you want to click on(x)"
    Inputbox, c2, , % "Coordinate of button you want to click on(y)"
    MsgBox, % c1 " , " c2 
    Inputbox, times, , % "How many times would you like to click?"
    While (times > 0)
    {
        ;specifying the NA option
        ;it's documented to improve reliablility, read more about it
        ;from the documentation
        ControlClick, % "x" c1 " y" c2, % "ahk_id " ActiveWindowHWND, , , , NA
        Sleep, 10500
        times--
    }
    MsgBox, % "End"
return

Если вы совершенно не знакомы с новым и улучшенным синтаксисом выражений, вы можете вернуться к устаревшему синтаксису, он также будет работать.
Просто не забудьте добавить NA вариант для элемента управления, хотя я бы рекомендовал, конечно, более новый синтаксис выражений.
Вот хорошая страница документации, чтобы начать работу:
https://www.autohotkey.com/docs/Language.htm

...