1 (изменено: ppvladis, 2012-01-27 14:28:05)

Тема: AHK: Отправка текста в неактивное окно.

Столкнулся с необходимостью, отправки строки текста в не активное окно.
В основе лежит скрипт следующего вида.

id := 0 
id1 := 0 
id2 := 0 
SendToWindow(code, windowId) 
{ 
;global id 
;activeId := WinExist("A") 
;if activeId = %Id% 
;{ 
SendMessage, 0x100, %code%, 0, , ahk_id %windowId% 
SendMessage, 0x101, %code%, 0, , ahk_id %windowId% 
;} 
;return 
} 
#InstallKeybdHook
#UseHook ON
#MaxThreadsPerHotkey 1
#MaxThreadsBuffer On


^Numpad0:: 
id := WinExist("A") ;Присваевает переменной id последнего окна(Верхнего)
MsgBox Main window assigned 
return 
^Numpad1:: 
id1 := WinExist("A") ;Присваевает переменной id последнего окна(Верхнего)
MsgBox Support 1 assigned 
return 
^Numpad2:: 
id2 := WinExist("A") ;Присваевает переменной id последнего окна(Верхнего)
MsgBox Support 2 assigned 
return 

!1::SendToWindow(0x70, id1) 
!2::SendToWindow(0x71, id1) 
!3::SendToWindow(0x72, id1) 
!4::SendToWindow(0x73, id1) 
!5::SendToWindow(0x74, id1) 
!6::SendToWindow(0x75, id1) 
!7::SendToWindow(0x76, id1) 
!8::SendToWindow(0x77, id1) 
!9::SendToWindow(0x78, id1) 
!0::SendToWindow(0x79, id1) 
!-::SendToWindow(0x7A, id1) 
!=::SendToWindow(0x7B, id1) 

^1::SendToWindow(0x70, id2) 
^2::SendToWindow(0x71, id2) 
^3::SendToWindow(0x72, id2) 
^4::SendToWindow(0x73, id2) 
^5::SendToWindow(0x74, id2) 
^6::SendToWindow(0x75, id2) 
^7::SendToWindow(0x76, id2) 
^8::SendToWindow(0x77, id2) 
^9::SendToWindow(0x78, id2) 
^0::SendToWindow(0x79, id2) 
^-::SendToWindow(0x7A, id2) 
^=::SendToWindow(0x7B, id2)

Написание текста нажатием клавиш указанным выше способом весьма громоздко.
Уверен, есть и другой способ, наподобие следующего.

Run Notepad
WinWait Безымянный - Блокнот
SendMessage, 0xC, 0, "Новый заголовок окна" ; 0XC означает сообщение WM_SETTEXT

Возможно, нужен подходящий код  оконных сообщений.
Кто знает, подскажите, код, либо другой способ!
Второй день ищу, и не как не найду.
Видимо нужно сменит точку зрения.
Надеюсь, мне в этом помогут.
Эвелину как вариант не рассматриваю.
Заранее благодарен всем откликнувшимся!

2 (изменено: creature.ws, 2012-01-27 14:30:17)

Re: AHK: Отправка текста в неактивное окно.

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

Run Notepad
WinWait ahk_class Notepad
ControlSend,, Новый заголовок окна, ahk_class Notepad

3

Re: AHK: Отправка текста в неактивное окно.

Исправьте заголовок..
WinSetTitle.

4

Re: AHK: Отправка текста в неактивное окно.

Александр_
Извиняюсь за заголовок,  Переписывал заголовок и видимо затер, AHK не заметив!
WinSetTitle меняет имя окна, а мне надо послать в окно текстовую строку.

creature.ws
Работает, но вместо русского текста посылает только пробелы из него.

5

Re: AHK: Отправка текста в неактивное окно.

ppvladis пишет:

creature.ws
Работает, но вместо русского текста посылает только пробелы из него.

Сохраните скрипт в кодировке UTF-8.

6

Re: AHK: Отправка текста в неактивное окно.

…и используйте AHK-L

7

Re: AHK: Отправка текста в неактивное окно.

Написал смешанный текст (Русский  Английский), получилось следующие.
При русской раскладке, нормально вписывает русский текст и теряет английский.
А при английской раскладке, нормально вписывает английский текст и теряет русский.
Я знаю, что у AHK есть какие-то трудности с раскладками, но сталкиваюсь впервые.
Большое спасибо за оказанную помощь!
Надеюсь и с этим, мне подскажите.
Заранее благодарен!

8

Re: AHK: Отправка текста в неактивное окно.

Не удаётся повторить проблему.

9

Re: AHK: Отправка текста в неактивное окно.

Александр_

Сохранение в кодировке UTF-8, не помогло.
Или я неверно действовал!

creature.ws

В блокнот пишет нормально, а вот в чат нет!
А с обновлением AHK по ссылке.
Вообще чудеса начались!
При инстале в UTF-8 наглухо преподает английский.
А в ANSI почти как и было, ток вместо ("Новый заголовок okna")
Вставляет (Новый" заголовок okna") или, (2Новый заголовокokna2).
В зависимости от раскладки!

Скрипт прилагаю.
Чат в L2.

id := 0 
id1 := 0 
id2 := 0 
SendToWindow(code, windowId) 
{ 
;global id 
;activeId := WinExist("A") 
;if activeId = %Id% 
;{ 
SendMessage, 0x100, %code%, 0, , ahk_id %windowId% 
SendMessage, 0x101, %code%, 0, , ahk_id %windowId% 
;} 
;return 
} 
#InstallKeybdHook
#UseHook ON
#MaxThreadsPerHotkey 1
#MaxThreadsBuffer On


^Numpad0:: 
id := WinExist("A") ;Присваевает переменной id последнего окна(Верхнего)
MsgBox Main window assigned 
return 
^Numpad1:: 
id1 := WinExist("A") ;Присваевает переменной id последнего окна(Верхнего)
MsgBox Support 1 assigned 
return 
^Numpad2:: 
id2 := WinExist("A") ;Присваевает переменной id последнего окна(Верхнего)
MsgBox Support 2 assigned 
return 

1::ControlSend,, "Новый заголовок okna"{Enter}, ahk_id %Id1%

10 (изменено: creature.ws, 2012-01-27 17:21:46)

Re: AHK: Отправка текста в неактивное окно.

Видимо дело в механизме при помощи которого AHK отправляет символы не содержащиеся в текущей раскладке. Видимо «чат» сей механизм не поддерживает.
Попробуйте отправлять комбинацию смены раскладки.
Приложенный скрипт избыточен.

По поводу:

А с обновлением AHK по ссылке.
Вообще чудеса начались!

— Недостаточно информации для понимания.

UTF-8 в качестве кодировки скриптов следует использовать в AHK-L.
Для AHK-Basic скрипты следует сохранять в win 1251.

11

Re: AHK: Отправка текста в неактивное окно.

Чтобы в чат прописать (/target Ступор) и нажатие  Enter.
Пришлось написать следующие.

1::
ControlSend,, {NumpadDiv}, ahk_id %Id1%
Sleep, 300
ControlSend,, target{Space}, ahk_id %Id1%
Sleep, 300
ControlSend,, Ступор, ahk_id %Id1%
Sleep, 300
;ControlSend,, {Enter}, ahk_id %Id1%
return

Написание /target Ступор {Enter} в одной строке, вызывало следующие проблемы.
При английской раскладке, в чат летел /target {Enter} Ступор.
При русской раскладке, в чат летел target\ {Enter} Ступор.
Или target\Ступор{Enter}.

Конкретный случай обходными путями решить удалось.
Но хотелось бы найти более универсальное решение!
А то получается при каждой смене языка нужно ставить паузу и начинать новую строку.

К вопросу о кодировках. Я использую либо блокнот, либо Notepad++.
В блокноте я не знаю, как менять кодировку.
А в Notepad++ либо ANSI  либо UTF-8.
win 1251 я полагаю это ANSI.

12

Re: AHK: Отправка текста в неактивное окно.

Скорее всего это на стороне "чата" проблемы- одни символы обрабатываются дольше, чем другие. Искажение символов говорит о том, что скрипт(или "чат" или оба) не использует юникод. Попробуй отправлять кириллические символы отдельно и ставить после этого задержку.

ppvladis пишет:

К вопросу о кодировках. Я использую либо блокнот, либо Notepad++.
В блокноте я не знаю, как менять кодировку.
А в Notepad++ либо ANSI  либо UTF-8.
win 1251 я полагаю это ANSI.

Под ANSI тут понимается тип кодовых страниц, одной из которых является CP1251(CP- это сокращение от Code Page). В notepad++ пункт "кодировать/преобразовать в ANSI", отвечает за манипуляции с текущей кодовой страницей. Сейчас почти все придерживаются стандарта Unicode, в котором нет геморроя с кодовыми страницами. В Windows юникод-символы представляются кодировкой UTF-16, однако можно использовать любую кодировку, название которой начинается на "UTF-", поскольку в начале файла будет помещена специальная метка(BOM), которая укажет на используемую кодировку.

13

Re: AHK: Отправка текста в неактивное окно.

ppvladis
И как удалось это решить?
У меня таже проблема - печатает как хочет, уже даже на части разбивал текст, и время нажатия кнопок увелиЧивал