1 (изменено: Military, 2019-03-24 23:41:51)

Тема: AHK: Проверка в буфере обмена наличия определенного слова

Есть скрипт:

#IfWinActive ,ahk_exe chrome.exe,
{
ctrl & LButton::
clipboard =
Send {LButton Down}
Sleep, 100
Send {LButton Up}
ClipWait 
WinActivate, ahk_exe notepad.exe
WinWaitActive, ahk_exe notepad.exe
SendInput, {enter}
sleep 100
Send ^v
sleep 100
SendInput, {enter}
return
}

Работает он довольно не плохо. но задача в том чтобы в месте "ClipWait" он продолжал работу когда в буфере обмена будет определенное слово.
Копируются при нажатии на определенную кнопку сообщения такого вида:

@Arthas Hi, I'd *like* *to* *buy* *your" 500 Jeweller's Orb for my 61 Chaos Orb in Synthesis.
(В звездочки я взял статические слова которые в любом случае повторяются)

Задача как-то пропарсить буфер обмена на наличие одного из слов и только в этом случае продолжить работу.
Кто сталкивался с подобными задачами и может помочь прошу указать правильный путь каким образом это лучше осуществить.

2 (изменено: belyankin12, 2019-03-24 23:59:22)

Re: AHK: Проверка в буфере обмена наличия определенного слова

Я правильно понял задачу: вам нужно дождаться пока в буфере обмена появится определенное слово верно? Запускаете цикл и с помощью instr, regexmatch или contains (что лучше умеете так сказать) проверяете переменную clipboard.

Arr := ["Some words", "text"]
i := 1
Loop {
    if (Clipboard = Arr[i]) {
        MsgBox, % "Буфер обмена полностью состоит из искомого текста: " Arr[i] ""
        break
    }
    
    if (RegExMatch(Clipboard, "(.*)" . Arr[i] . "(.*)")) {
        msgbox, % "В буфере обмена находится искомый текст: " Arr[i] ""
        break
    }
    
    i := i = Arr.MaxIndex() ? 1 : i + 1
}

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

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

3

Re: AHK: Проверка в буфере обмена наличия определенного слова

OnClipboardChange

4

Re: AHK: Проверка в буфере обмена наличия определенного слова

belyankin12 пишет:
RegExMatch(Clipboard, "(.*)" . Arr[i] . "(.*)")

Плохо понимаете RegexMatch. Все "(.*)" лишние.

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

5

Re: AHK: Проверка в буфере обмена наличия определенного слова

teadrinker, согласен, таким приемом я получаю все, кроме искомого слова, привычка что-ли просто.

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

6

Re: AHK: Проверка в буфере обмена наличия определенного слова

C Вашей помощью получился такой скрипт:

#IfWinActive ,ahk_exe chrome.exe,

ctrl & LButton:: 
{
	clipboard =
	Send {LButton Down}
	Sleep, 100
	Send {LButton Up}
	Sleep, 100
	Send ^c
	ClipWait, 1
	CopyString  := clipboard
	CheckWord := "like"

If InStr(CopyString, CheckWord){
	WinActivate, ahk_exe notepad.exe
	WinWaitActive, ahk_exe notepad.exe
	sleep 100
	SendInput, {enter}
	sleep 100
	Send ^v
	sleep 100
	SendInput, {enter}
	}
}

Работает замечательно, но есть одно но, на сайте есть русская версия и английская.
Например:
@*** Hi, I'd like to buy your Chaos Orb for my  Exalted Orb in Synthesis.
или
@*** Здравствуйте, хочу купить у вас Сфера хаоса за Сфера возвышения в лиге Synthesis.
Возникает задача искать в буфере не только "like", но и "хочу".

Каким образом можно указать в функции InStr() два искомых слова?

7 (изменено: belyankin12, 2019-03-25 20:40:22)

Re: AHK: Проверка в буфере обмена наличия определенного слова

Так вы посмотрите мой пример с циклом. Там вы заносите в массив список всех слов которые хотите найти, а цикл будет проверять есть ли в буфере обмена одно из указанных в массиве слово. Если не хотите с массивом возиться можно воспользоваться RegExMatch - в шаблоне так же можно указать несколько вариантов:

var := "@*** Hi, I'd like to buy your Chaos Orb for my  Exalted Orb in Synthesis."
var2 := "@*** Здравствуйте, хочу купить у вас Сфера хаоса за Сфера возвышения в лиге Synthesis."
msgbox, % RegExMatch(var, "(хочу|like)")
msgbox, % RegExMatch(var2, "(хочу|like)")

InStr вам в этом деле не поможет, только дублировать.

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

8

Re: AHK: Проверка в буфере обмена наличия определенного слова

belyankin12  Попробовал работает.

#IfWinActive ,ahk_exe chrome.exe,

ctrl & LButton:: 
{
	clipboard =
	Send {LButton Down}
	Sleep, 100
	Send {LButton Up}
	Sleep, 100
	Send ^c
	ClipWait, 1
	CopyString  := clipboard

If RegExMatch(CopyString, "(купить|like)"){
	WinActivate, ahk_exe notepad.exe
	WinWaitActive, ahk_exe notepad.exe
	sleep 100
	SendInput, {enter}
	sleep 100
	Send ^v
	sleep 100
	SendInput, {enter}
	}
}
	

но почему-то не хочет искать русские символы. Например когда я указываю  "(хочу|like)" русские сообщения не обрабатывает, а вот так "(Synthesis|like)"работает, но проблема в том что слово "Synthesis" не статическое, оно меняется и за него цепляться нельзя.
Возможно проблема с кодировкой, Windows 7 EN

9 (изменено: belyankin12, 2019-03-25 23:42:23)

Re: AHK: Проверка в буфере обмена наличия определенного слова

Проверьте состояние переменной clipboard, я полагаю у вас там иероглифы одни вместо русских символов. Когда-то сталкивался с этим но все само-собой прошло. В те времена я пользовался этим.

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

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

10 (изменено: Military, 2019-03-27 19:16:47)

Re: AHK: Проверка в буфере обмена наличия определенного слова

belyankin12 Нашел проблему. Странным образом скрипты которые создаются правой кнопкой с контекстного меню работают, а вот те которые я сохранил с помощью Notepad++ перестают работать. Наверное  Notepad сохраняет скрипт в неверной кодировке.
Большое вам спасибо.

11

Re: AHK: Проверка в буфере обмена наличия определенного слова

В notepad есть меню которое отвечает за кодировку файла. Ещё использовать редактор Scite4 но придется его докачать отдельно.

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

12

Re: AHK: Проверка в буфере обмена наличия определенного слова

Notepad++ может сохранять в UTF-8 без BOM. AHK не понимает этой кодировки, должна быть UTF-8 c BOM.

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