VBS раскладка клавиатуры
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Программное обеспечение

#1: VBS раскладка клавиатуры Author: _D_V_S_ PostPosted: Thu Apr 04, 2013 23:20
    —
Доброе время суток!

Подскажите, как реализовать в VBS переключение языковой раскладки?

То есть у меня рабочий VBS с выбором запуска двух программ. Для одной нужно писать по-английски, для другой - по-русски. Надо вставить код переключения раскладки языка (или как это правильно называется - ХЗ...)

Думал как корректно это организовать.

1) считываем с реестра необходимые ветки. -> сохраняем их.
2) заносим в реестр такую конструкцию:
- смена раскладки по Контрол+Шифт
- назначение русской раскладки на сочетание клавиш 1
- назначение английской раскладки на сочетание клавиш 2
3) WshShell.SendKeys и выполнение необходимых действий скрипта
4) удаление из реестра внесённых изменений и занесение в реестр сохранённых веток

Вот без ребута винды, "на лету", смена сочетаний клавиш и остальное с реестром - будет работать?

Помогите плиз со скриптом - я в VBS совсем начинающий!

#2:  Author: FlasherLocation: Москва PostPosted: Fri Apr 05, 2013 16:49
    —
_D_V_S_
С подключение сторонних компонент и API сделать, конечно, реально.
Можно также попробовать подключить js через htmlfile или ScriptControl.
Простые игры с реестром ничего не дадут.
Но лучше отказаться от метода и использовать копипаст либо сторонние утилиты типа nircmd/TCFS2.

#3:  Author: _D_V_S_ PostPosted: Sat Apr 06, 2013 07:48
    —
Flasher wrote:
_D_V_S_
Но лучше отказаться от метода и использовать копипаст либо сторонние утилиты типа nircmd/TCFS2.

К сожалению надо именно без сторонних компонент.

#4:  Author: FlasherLocation: Москва PostPosted: Sat Apr 06, 2013 14:26
    —
_D_V_S_ wrote:
К сожалению надо именно без сторонних компонент.
Копипаст без сторонних. Утилиты - это не компоненты. И надо - почему?

#5:  Author: _D_V_S_ PostPosted: Sat Apr 06, 2013 15:41
    —
Я так понимаю, что средствами чистого VBS это невозможно?
Про совместное использование VBS и утилит я-бы тут даже тему не стал создавать Smile

#6:  Author: FlasherLocation: Москва PostPosted: Sat Apr 06, 2013 16:03
    —
Смотря что понимать под "чистым". Я не пойму, зачем вообще набивать посимвольно? Это же долго.
Это нужно для работы на любом Windows/любой машине или достаточно только на своей?

#7:  Author: _D_V_S_ PostPosted: Sun Apr 07, 2013 11:27
    —
На любой, делаю не только для себя.

А метод, описанный мной в титульном сообщении, работать не будет? Почему если в двух словах?

#8:  Author: FlasherLocation: Москва PostPosted: Sun Apr 07, 2013 14:36
    —
Я так ответ на свой первый вопрос не увидел.

Внесение в реестр, может, и будет работать, но я не уверен, что ветки создаются в кусте HKCU\Control Panel\Input Method\Hot Keys\ в одной и той же последовательности при присвоении порядкового номера 000010х.
Будет зависеть от наличия существующих веток, кол-ва языков раскладки и последовательности присвоения. Не факт, что срабатывать хоткей будет с первого раза, поскольку информация о клавишах может считываться из ОЗУ или файла подкачки. Надо тестировать.
Кстати, смена раскладки по Ctrl+Shift ничего не даст, это лишнее.

Но я бы делал через DynamicWrapper без регистрации..
Да нет, я вообще бы SendKeys для буквенных клавиш не использовал..

#9:  Author: _D_V_S_ PostPosted: Mon Apr 08, 2013 01:51
    —
Flasher wrote:
Я так ответ на свой первый вопрос не увидел.
использовал..

На какой? "Почему надо без сторонних утилит"?

Ну так не только для себя-ж хочется сделать Smile
Один скрипт VBS с открытым кодом - это одно.
А скрипт + экзешник это совсем другое...

Да, может я не совсем понятно описал то, что мне надо.

Нужно-то просто включение нужной раскладки языка при выборе пункта мессадж-бокса.
То есть выбрал пункт первый и включается английский язык, выбрал пункт второй - включается русский язык.
И тут встаёт проверка на текущую раскладку.

Вот и ломаю голову сижу, как это сделать...

#10:  Author: FlasherLocation: Москва PostPosted: Mon Apr 08, 2013 02:02
    —
_D_V_S_ wrote:
На какой?
>
Flasher wrote:
зачем вообще набивать посимвольно?

_D_V_S_ wrote:
А скрипт + экзешник это совсем другое...
Другое - это какое? Smile
_D_V_S_ wrote:
То есть выбрал пункт первый и включается английский язык, выбрал пункт второй - включается русский язык.
И что? Каждый раз дёргать реестр, чтобы что-то набивать в нужном поле? ОВНС.

_D_V_S_ wrote:
И тут встаёт проверка на текущую раскладку.
Зачем проверка? Описывалась принудительная смена.

_D_V_S_ wrote:
Вот и ломаю голову сижу, как это сделать
Стандартными методами никак. Нестандартными, например, так:
Code:
With CreateObject("DynamicWrapper")
  .Register "USER32", "ActivateKeyboardLayout", "i=ll", "f=s", "r=l"
  .Register "USER32", "LoadKeyboardLayout", "i=sl", "f=s", "r=l"
  .ActivateKeyboardLayout .LoadKeyboardLayout("00000419", 0), 0
End With

#11:  Author: _D_V_S_ PostPosted: Mon Apr 08, 2013 03:55
    —
Flasher wrote:
зачем вообще набивать посимвольно?

Да нет )) Просто переключить раскладку языка...
_D_V_S_ wrote:
А скрипт + экзешник это совсем другое...
Flasher wrote:
Другое - это какое? Smile

А объяснишь людям? )) Они видят в каждом .exe вирусную угрозу и кражу паролей)))
_D_V_S_ wrote:
То есть выбрал пункт первый и включается английский язык, выбрал пункт второй - включается русский язык.
Flasher wrote:
И что? Каждый раз дёргать реестр, чтобы что-то набивать в нужном поле?

Один раз... При выборе пункта мессадж-бокса.

А DynamicWrapper - это dll-ку надо какую регистрить стороннюю?
Неужели стандартным VBS никак нельзя поменять язык ввода? Задача вроде тривиальная...

#12:  Author: LonerDLocation: Донецк PostPosted: Mon Apr 08, 2013 05:38
    —
Quote:
Они видят в каждом .exe вирусную угрозу и кражу паролей

При таком уровне паранойи наверняка и выполнение скриптов отключено в системе.

Quote:
Один скрипт VBS с открытым кодом - это одно.
А скрипт + экзешник это совсем другое...

Как вариант - подключить другой скриптовый язык. Скрипт с открытым исходным кодом+исполняемый ехе-шник AutoIt3, на нём это проще организовать.

#13:  Author: _D_V_S_ PostPosted: Mon Apr 08, 2013 07:32
    —
Нет, все варианты с экзешниками в любом виде не рассматриваются.
Только стандартные виндовозные скрипты.
Я-б тогда тему не создавал тут, а всё сам-бы давно сделал.

А уровень паранойи людей, которые называют ENTER интером - заоблачен. И ничем не прошибаем. Ну не мне вам рассказывать Smile


LonerD wrote:
При таком уровне паранойи наверняка и выполнение скриптов отключено в системе.

Чтобы отключить и включить что-то в системе, нужно обладать несколько другими знаниями - при которых уровень паранойи как-бы снижается в геометрической прогрессии Wink

#14:  Author: FlasherLocation: Москва PostPosted: Mon Apr 08, 2013 14:25
    —
_D_V_S_ wrote:
Да нет )) Просто переключить раскладку языка.
Понял. В этом случае VBS точно не подойдёт в исходном виде. Тут желателен AHK с отслеживанием контролов. В крайнем случае можно скомпилить, чтобы сторонних exe не было.
_D_V_S_ wrote:
А объяснишь людям? )) Они видят в каждом .exe вирусную угрозу и кражу паролей)
Я то объясню, если потребуется. Но пока что-то логики не улавливаю. В каждом exe видят, а в каждом скрипте не видят. Question
_D_V_S_ wrote:
Один раз... При выборе пункта мессадж-бокса.
МэссейджБокс не имеет полей. Какой смысл в таком окне менять раскладку? О каких пунктах речь?
_D_V_S_ wrote:
А уровень паранойи людей, которые называют ENTER интером - заоблачен.
Хм. Не ваш клиент? Wink

#15:  Author: _D_V_S_ PostPosted: Mon Apr 08, 2013 17:13
    —
Flasher wrote:

_D_V_S_ wrote:
А объяснишь людям? )) Они видят в каждом .exe вирусную угрозу и кражу паролей)
Я то объясню, если потребуется. Но пока что-то логики не улавливаю. В каждом exe видят, а в каждом скрипте не видят. Question
_D_V_S_ wrote:
Один раз... При выборе пункта мессадж-бокса.
МэссейджБокс не имеет полей. Какой смысл в таком окне менять раскладку? О каких пунктах речь?
_D_V_S_ wrote:
А уровень паранойи людей, которые называют ENTER интером - заоблачен.
Хм. Не ваш клиент? Wink


1) Скрипт с непонятными для них кракозябрами в большинстве не вызывает такого отторжения, нежели исполняемый файл - который в их представлении напичкан червями, вирусами и другими бэк-доорами с кей-логгерами Smile Хоть они слов-то таких и в страшном сне не слышали ))))

2) Мессадж бокс имеет кнопки: Да Нет и Отмена.
Да - включается русский язык и запускается программа1, в которой в текстовые поля юзер набивает текст на русском языке
Нет - включается общепринятый буржуйский язык и запускается программа2, в которой в текстовые поля юзер набивает текст на аглицкой мове
Отмена - выполняются некоторые действия, к сабжу не имеющие отношения.


3) Гляну тред попозже Smile

#16:  Author: MVVLocation: Ростов-Дон PostPosted: Mon Apr 08, 2013 17:54
    —
В виндовсах по Windows 7 включительно любая вновь запущенная программа имеет раскладку по умолчанию. Её можно узнать в реестре. Далее, если она русская, то надо переключать язык только для буржуйской, если она английская - только для русской. Разумеется, уже после запуска программы, когда та получит фокус (раскладка переключается для приложения, окно которого активно). Комбинация для переключения узнаётся из того же реестра, нет необходимости туда ничего писать.

#17:  Author: FlasherLocation: Москва PostPosted: Mon Apr 08, 2013 18:07
    —
_D_V_S_
1) Видимо, их ещё не пугали скриптами. Дайте мне жертву! Twisted Evil Мнения начнут быстро меняться.
2) А, теперь ясно. Нужно менять после нажатия, а не до ввода, как я думал.

MVV
Состояние языка ввода отследить реестром нельзя. Какая раскладка является дефолтной - значения не имеет.

#18:  Author: MVVLocation: Ростов-Дон PostPosted: Mon Apr 08, 2013 18:15
    —
Настройка языка ввода по умолчанию определяет, какая раскладка будет включена при запуске новой программы. В Win8 это вековое поведение изменено, там (если правильно помню) программа наследует язык ввода от предка.

Раздел HKEY_CURRENT_USER\Keyboard Layout\Preload, значение 1: если оно равно 0x409, язык ввода по умолчанию английский, если оно равно 0x419 - русский.

Из раздела HKEY_CURRENT_USER\Keyboard Layout\Toggle можно узнать комбинацию для переключения, значения подбираются элементарно (сменить комбинацию, применить, посмотреть значение в разделе, и так для каждого варианта, а их всего-то 4).

#19:  Author: FlasherLocation: Москва PostPosted: Mon Apr 08, 2013 19:27
    —
Есть нюансы.
Может не быть новой программы, переключение может понадобиться в активном окне.
Toggle не годится, когда языков больше двух.

Если у клиентов XP, то можно KB16 RU /E и KB16 EN /E использовать.
На 7-ке какие-то косяки с командой.

#20:  Author: _D_V_S_ PostPosted: Mon Apr 08, 2013 19:42
    —
А можно принудительно включать нужную раскладку стандартными виндузятными встроенными средствами (ну которая меняет сочетания клавиш ввода с альт+шифт на контрол+шифт и т.д.)?

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

При переключении язык меняется на другой. А тут включаем русский например - если русский в системе активен, он не меняется; если английский - меняется на русский.

Есть такое в Винде, или нет?

Нельзя как-нибудь к этому подобраться средствами VBS ?

ЗЫ Сумбурно как-то объясняю, но вроде донёс мысль Smile

#21:  Author: FlasherLocation: Москва PostPosted: Mon Apr 08, 2013 20:11
    —
_D_V_S_
Стандартные средства - это назначенные клавиши.
Я предложил kb16. Системы какие у клиентов?

Про назначение на каждый язык в отдельности я уже писал.

#22:  Author: _D_V_S_ PostPosted: Tue Apr 09, 2013 09:33
    —
Flasher wrote:
_D_V_S_
Системы какие у клиентов?


Win7 (32-64) и некоторые с ХР сидят

#23:  Author: FlasherLocation: Москва PostPosted: Tue Apr 09, 2013 13:39
    —
Ясно, не годится.

MVV wrote:
Раздел HKEY_CURRENT_USER\Keyboard Layout\Preload, значение 1: если оно равно 0x409, язык ввода по умолчанию английский, если оно равно 0x419 - русский.
Попробовал на XP. Ничего не даёт. Раскладка не меняется.

Last edited by Flasher on Tue Apr 09, 2013 15:12; edited 1 time in total

#24:  Author: MVVLocation: Ростов-Дон PostPosted: Tue Apr 09, 2013 14:49
    —
Я не предлагаю менять значение ключа. Разумеется, оболочка держит эти значения в памяти до закрытия.
Я предлагаю читать эти значения, чтобы понять, какой язык будет у программы при запуске, и при необходимости переключать его.

#25:  Author: FlasherLocation: Москва PostPosted: Tue Apr 09, 2013 15:16
    —
MVV wrote:
Я предлагаю читать эти значения, чтобы понять, какой язык будет у программы при запуске, и при необходимости переключать его.
Главное - это само переключение. Читать значение или не читать - не важно. Даже если делать это каждый раз, сути это не изменит. Сейчас задача переключаться на конкретный язык ввода.

#26:  Author: MVVLocation: Ростов-Дон PostPosted: Tue Apr 09, 2013 15:32
    —
Ну разве это сложно? Посмотрел в реестре, Ctrl+Shift или Alt+Shift, и послал окну, если надо поменять язык.

#27:  Author: FlasherLocation: Москва PostPosted: Tue Apr 09, 2013 15:44
    —
Не то, чтобы сложно, но муторно. Ctrl+Shift или Alt+Shift не переключает на конкретный язык...

#28:  Author: MVVLocation: Ростов-Дон PostPosted: Tue Apr 09, 2013 16:46
    —
Если это будет запускаться на однотипных машинах, можно настроить скрипт так, чтобы переключало. Раз уж VBS не может вызвать функцию ActivateKeyboardLayout.

#29:  Author: FlasherLocation: Москва PostPosted: Tue Apr 09, 2013 17:17
    —
Выше писалось про разные машины.
Кто сказал, что не может? Компонент внешний просто..

#30:  Author: _D_V_S_ PostPosted: Tue Apr 09, 2013 18:03
    —
Flasher wrote:
Ctrl+Shift или Alt+Shift не переключает на конкретный язык...

Проверить текущую раскладку.

Если нужна другая, то СендКейз.

И перед переключением (СендКейз) - если в реестр записать конкретное сочетание клавиш (Ctrl+Shift например), чтобы сработало у кого установлено Alt+Shift ?

Правда после СендКейз в скрипте придётся его откатывать обратно...

Так разве нельзя?

ЗЫ Установил аватарку Smile

#31:  Author: FlasherLocation: Москва PostPosted: Tue Apr 09, 2013 19:04
    —
_D_V_S_
Мы уже это обсудили. Всё утыкается в три и более языка ввода.

#32:  Author: MVVLocation: Ростов-Дон PostPosted: Tue Apr 09, 2013 19:18
    —
_D_V_S_,
Я же говорил, так нельзя. Но можно посмотреть в реестре, какая комбинация выбрана, и послать её. Здесь есть проблема, о которой написал Flasher - если языков ввода более 1.

Flasher,
Кстати, проблема решаема. В упомянутом мной ключе реестра указан порядок переключения раскладок (значение с именем 1 - раскладка по умолчанию, с именем 2 - следующая за ней, и т.д.). Можно найти номер нужной из них и послать комбинацию для переключения нужное число раз.

#33:  Author: FlasherLocation: Москва PostPosted: Tue Apr 09, 2013 19:32
    —
MVV
Да, так можно, только немоментальная скорость будет.

#34:  Author: FlasherLocation: Москва PostPosted: Wed Apr 10, 2013 09:02
    —
_D_V_S_, как-то так:
Code:
' Запуск редакторов с переключением языка ввода на нужный

Set Dict = CreateObject("Scripting.Dictionary")
Dim WSH : Set WSH = CreateObject("WScript.Shell")

' Читаем значение ключа смены языка ввода:
Language = WSH.RegRead("HKCU\Keyboard Layout\Toggle\Hotkey")

' Проходимся по списку языков ввода, запоминая значения в коллекции:
On Error Resume Next
For i = 1 to 10
  Key = WSH.RegRead("HKCU\Keyboard Layout\Preload\" & i)
  If Err.Number > 0 Then Exit For
  Dict.Add Key, i
Next : On Error GoTo 0

' Устанавливаем, под какими номерами идут требуемые языки:
ENG = Dict.Item("00000409") : RUS = Dict.Item("00000419")

' Устанавливаем вызываемую впоследствии комбинацию клавиш:
Select Case Language
  Case 1 HK = "%+" : Case 2 HK = "^+" : Case 4 HK = "`"
End Select

' Настраиваем кнопки диалога сообщения:
Msg = MsgBox("Нажмите Да для перехода в блокнот," & vbnewLine & _
"Нет - для перехода в WordPad" & vbnewLine & "Отмена - для других действий", 4099)
If Msg = 6 Then
  Run "notepad", RUS, HK
ElseIf Msg = 7 Then Run "%WinDir%\write.exe", ENG, HK
ElseIf Msg = 2 Then WScript.Echo "Другие действия!"
End If

' Выгружаем скрипт:
Set Dict = Nothing : Set WSH = Nothing : WScript.Quit

' Процедура вызова программ
Sub Run(Program, Lang, HKey)
  ' Вычисляем требуемое кол-во нажатий хоткея переключения раскладки:
  If Lang = 1 Then Count = 0 Else Count = Lang - 1
  ' Запускаем редактор и активируем его окно:
  Set ApExec = WSH.Exec(Program) : PID = ApExec.ProcessID
  Do : A = WSH.AppActivate(PID) : Loop Until A : WScript.Sleep 40
  ' Нажимаем хоткей смены языка нужное число раз:
  If Count Then : For n = 1 To Count : WSH.SendKeys HKey : Next : End If
End Sub


Last edited by Flasher on Wed Apr 10, 2013 10:21; edited 1 time in total

#35:  Author: _D_V_S_ PostPosted: Wed Apr 10, 2013 09:23
    —
Flasher wrote:
_D_V_S_, как-то так:

Спасибо!

Запустил попробовать.

программа1 = блокнот
программа2 = вордпад
Так?

На обоих русский язык....

А мне надо, чтобы на программа1 был русский, а на программа2 - английский. Автоматом выставлялся...
В этом и смысл VBS - одна программа требует ввода текста на русском языке, вторая - на английском.

#36:  Author: FlasherLocation: Москва PostPosted: Wed Apr 10, 2013 09:45
    —
_D_V_S_
Пардон, не тот символ поставил. Сейчас как надо.

#37:  Author: _D_V_S_ PostPosted: Wed Apr 10, 2013 10:51
    —
Flasher wrote:
_D_V_S_
Пардон, не тот символ поставил. Сейчас как надо.

К сожалению - в обоих случаях опять русский.

Мало того, процессы wscript.exe остаются висеть после закрытия блокнота и вордпада и почему-то очень сильно подтормаживают систему. Пришлось убивать их руками.

Я как делаю:
1) Запускаю Ваш VBS и выбираю ДА. Открывается блокнот. Печатаю. Русская раскладка. Альт+F4 на блокноте.
2) Запускаю Ваш VBS и выбираю НЕТ. Открывается вордпад. Печатаю. Русская раскладка. Альт+F4 на вордпаде.

И после нескольких таких запусков - система дико тормозит - потому что процессы wscript.exe не завершаются и мало того - начинаются дикие тормоза из-за них. Пока их руками не убьёшь...

#38:  Author: FlasherLocation: Москва PostPosted: Wed Apr 10, 2013 15:43
    —
_D_V_S_
Причины точной пока понять не могу. На XP всё работает как надо. На 7-ке процесс wscript действительно висит, но переключение происходит на нужный язык ввода. Проблема в 4 строке снизу. Вечером посмотрю.

#39:  Author: _D_V_S_ PostPosted: Wed Apr 10, 2013 16:02
    —
Flasher wrote:
_D_V_S_
переключение происходит на нужный язык ввода.

У меня не происходит почему-то...
Панто-Свитчер может быть камнем преткновения?
Пробовал и без него (закрывал его) - всё одно только русский включается...
Да, у меня на Контрол+Шифт переключение языка. Может в этом дело?

ЗЫ Win7x64

#40:  Author: FlasherLocation: Москва PostPosted: Wed Apr 10, 2013 16:32
    —
_D_V_S_ wrote:
Панто-Свитчер может быть камнем преткновения?
Он может сыграть роль только при наборе текста, первые символы всё равно должны соответствовать требованиям.
_D_V_S_ wrote:
Может в этом дело?
Так всё предусмотрено. И кол-во языков и клавиши. Я для чего комментарии-то в скрипте написал? К тому же я тестировал с установкой всех возможных комбинаций.

У кого ещё x64, протестируйте, пож-та!

#41:  Author: LonerDLocation: Донецк PostPosted: Wed Apr 10, 2013 18:56
    —
Quote:
У кого ещё x64, протестируйте, пож-та!

Работает, но не переключение на определённый язык, а просто циклическое переключение раскладок при вызове блокнота.
У меня Win8x64, раскладки En-Ru-Uk.
При запуске блокнота - раскладка переключается на следующую, при запуске WordPadа - остаётся текущей. Например, если раскладка выставленная русская, то после запуска блокнота переключается на украинскую, после запуска ворда - так и остаётся русской.
После запуска WordPadа - wscript висит в памяти и действительно нехило нагружает процессор фактически на 100%

#42:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Apr 10, 2013 19:33
    —
LonerD,
Я писал выше, что способ применим вплоть до Win7 включительно, т.к. в Win8 новое приложение имеет не язык ввода по умолчанию, а язык ввода, выбранный в родительском приложении.

#43:  Author: FlasherLocation: Москва PostPosted: Wed Apr 10, 2013 20:15
    —
LonerD wrote:
После запуска WordPadа - wscript висит в памяти и действительно нехило нагружает процессор фактически на 100%
Ясно. Значит, в нём дело. Собственно, запрос конкретно на него не был, так что не так страшно. Пишите путь к нужному редактору.

MVV wrote:
а язык ввода, выбранный в родительском приложении
А где он там выбирается?

#44:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Apr 10, 2013 21:38
    —
Flasher,
Ну, например, язык ввода по умолчанию у тебя английский, ты запустил тотал и переключился в нём на русский. Теперь у программ, запускаемых из тотала (командная строка, например), начальный язык ввода будет русский.

#45:  Author: FlasherLocation: Москва PostPosted: Wed Apr 10, 2013 23:36
    —
MVV
Понял, тут только ActivateKeyboardLayout..

_D_V_S_, LonerD
Кстати, если поменять "%WinDir%\write.exe" на
"%PROGRAMFILES%\Windows NT\Accessories\wordpad.exe", то WScript висеть не будет.

#46:  Author: _D_V_S_ PostPosted: Thu Apr 11, 2013 01:30
    —
А после выполнения скрипта раскладка возвращается на прежнее место?
То есть: если до выполнения скрипта была русская например.
Выбираем ВордПад (смену на английскую) - и после закрытия вордпада она снова становится обратно русской?

Просто работает этот скрипт только с блокнотом и вордпадом.
А с теми программами, которые мне нужны - не хочет((
Одна русская раскладка в обоих.

Сижу голову ломаю - почему...

Да, моя прога запускается через "родительский", что-ли, экзешник (и он выводит консоль кстати): сначала он запускается, и после запускает второй - главный (этот - чистый Гуй...).

Да и вообще запускаться стал после того, как я закомментил:
Code:
Do : A = WSH.AppActivate(PID) : Loop Until A : WScript.Sleep 40


Вообще - тёмный лес...

Crying or Very sad

#47:  Author: FlasherLocation: Москва PostPosted: Thu Apr 11, 2013 08:47
    —
_D_V_S_ wrote:
А с теми программами, которые мне нужны - не хочет((
Названия прог в студию.

_D_V_S_ wrote:
Да и вообще запускаться стал после того, как я закомментил:
Без этой стоки не будет ожидания появления окна, соответственно, клавиши нажмутся раньше времени, и язык ввода останется исходным.
Что покажет, если написать в этом месте WScript.Sleep 100 : MsgBox PID ?

#48:  Author: _D_V_S_ PostPosted: Thu Apr 11, 2013 09:18
    —
Flasher wrote:
Названия прог в студию.

xvm-stat.exe - родительская консольная
WorldOfTanks.exe - главная

Flasher wrote:

Что покажет, если написать в этом месте WScript.Sleep 100 : MsgBox PID ?

Тоже самое.

Flasher wrote:

Без этой стоки не будет ожидания появления окна, соответственно, клавиши нажмутся раньше времени, и язык ввода останется исходным.

Вот это вообще для меня - загадка.
Почему так? Скрипт меняет язык только для той программы, которая в нём прописана?
А нельзя сменять язык раскладки для всей системы без ожидания окна программы? То есть сменить для всех окошек?
Как если просто в системе нажать Контрол+Шифт?

#49:  Author: MVVLocation: Ростов-Дон PostPosted: Thu Apr 11, 2013 09:37
    —
_D_V_S_,
Язык ввода по нажатию комбинации изменяется только для окна, имеющего фокус ввода. Если активен вордпад, изменится только для него, блокнот - только для блокнота, калькулятор - только для калькулятора. Не бывает такого, чтобы активного окна не было, винда вся на окнах, рабочий стол и панель задач - тоже окна, поэтому фраза "просто в системе нажать" некорректна в корне.

#50:  Author: FlasherLocation: Москва PostPosted: Thu Apr 11, 2013 10:15
    —
_D_V_S_ wrote:
xvm-stat.exe - родительская консольная
WorldOfTanks.exe - главная
Мда.. Люди, о которых шла речь, - геймеры? Это они-то exe-шников боятся? Laughing
К сожалению, метод AppActivate не возвращает True c консольных окон.
Тут придётся пользоваться банальной задержкой.
А вот с танками я экспериментировать не имею желания. Полагаю, что поле ввода в его окне появляется ой как не сразу. Отсюда и проблемы. Вычислить, когда оно появится, с помощью стандартных методов не представляется возможным. Расчёт же данного скрипта идёт на окна, где фокус ввода возникает сразу или почти сразу при запуске окна приложения.

#51:  Author: _D_V_S_ PostPosted: Thu Apr 11, 2013 12:09
    —
Flasher wrote:
Мда.. Люди, о которых шла речь, - геймеры? Это они-то exe-шников боятся? Laughing

Боятся пуще остальных Smile
Ибо вкладывают постоянно реальные деньги в игру, и трясутся кражи аккаунтов. В каждом экзешнике видят по меньшей мере трояна )))

Добавлено спустя 2 минуты:

Ну что-ж, если нет желания - то ничего не попишешь...

Всё равно огромное спасибо за уделённое мне время!

#52:  Author: FlasherLocation: Москва PostPosted: Thu Apr 11, 2013 13:23
    —
_D_V_S_ wrote:
если нет желания - то ничего не попишешь
Установкой абы каких игр не балуюсь. В мои личные интересы (да и не только мои) подобные операции не входят по ряду "религиозных" причин. Мотивация хоть какая-то должна быть.
WSH для таких нужд не годится. Рекомендую пользоваться средствами для этого более подходящими (AHK, AutoIt), дать на них ссылки с офф. сайта людям, чтобы не пужались и почитали, что в этих exe-шниках нет ничего страшного. Задача на форумах с обсуждением этих языков решится куда быстрее. Мутить воду в ступе с чужой паранойей - недальновидное занятие. Не та это жертва, чтобы возыметь описанные удобства.

#53:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Sun Apr 30, 2017 18:01
    —
Flasher wrote:
как-то так
У меня просьба помочь с адаптацией скрипта под следующую задачу.
Нужна принудительная установка английской раскладки в командной строке TC, для дальнейшей вставки команд (напр. CD) с помощью SendKeys.
Попробовал приспособить скрипт для этой цели, сократив нижнюю часть скрипта (после Select Case Language ... End Select) так:
Code:
' Установка фокуса на TC cmdline:
  WSH.SendKeys "{Right}{Home}"
  ' Вычисляем требуемое кол-во нажатий хоткея переключения раскладки:
'  If RUS = 1 Then Count = 0 Else Count = Lang - 1
  If ENG = 1 Then Count = 0 Else Count = Lang - 1
  ' Нажимаем хоткей смены языка нужное число раз:
  If Count Then : For n = 1 To Count : WSH.SendKeys HK : Next : End If
' Выгружаем скрипт:
Set Dict = Nothing : Set WSH = Nothing : WScript.Quit

Но в таком виде скрипт не меняет раскладку, т.к. похоже не получает текущую раскладку окна TC.


Last edited by DrShark on Sun Apr 30, 2017 22:46; edited 1 time in total

#54:  Author: FlasherLocation: Москва PostPosted: Sun Apr 30, 2017 19:40
    —
DrShark wrote:
Нужна принудительная установка английской раскладки в командной строке TC
При обновлённой версии vbscript.dll (поставляемой с IE 11) она вроде бы всегда английская.
DrShark wrote:
для дальнейшей вставки команд (напр. CD) с помощью SendKeys.
Зачем? Чем cd из кнопки/юзеркоманды не устраивает?

#55:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Sun Apr 30, 2017 22:40
    —
Flasher wrote:
DrShark wrote:
для дальнейшей вставки команд (напр. CD) с помощью SendKeys.
Зачем? Чем cd из кнопки/юзеркоманды не устраивает?
У каждого метода есть свои преимущества и недостактки, в том числе и у командой строки, которая активируется по клавише "Стрелка вправо" и имеет разные виды автодополнения. Кнопка вызова скрипта внизу вертикалной панели кнопок, который вставляет команду CD с последующим пробелом в начало ком. строки, для меня сделает этот инстумент комфортнее и эффективнее в использовании.
Flasher wrote:
При обновлённой версии vbscript.dll (поставляемой с IE 11) она вроде бы всегда английская.
У меня Vista с IE 9, и вообще хотелось бы иметь максимально универсальное и совместимое решение.

#56:  Author: FlasherLocation: Москва PostPosted: Sun Apr 30, 2017 23:49
    —
DrShark wrote:
которая активируется по клавише "Стрелка вправо"
Это только в режимах "Подробный" и "Комментарии", иначе по Shift + Влево/Вправо, если включён режим быстрого поиска без модификаторов, отключающий активацию комстроки при наборе текста. Поэтому универсальностью тут не пахнет.
DrShark wrote:
для меня сделает этот инстумент комфортнее и эффективнее в использовании.
В каком отношении? Набирать путь можно сразу в строке заголовка панели (2912/$B60/cm_EditPath), переходить к нужному объекту проще из меню избранных каталогов.
Если подразумевается Alt+F8, то мне не видится этот способ навигации более удобным.

Что касается более грамотного способа вставки, то советую сюда обратиться.

#57:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Sun Apr 30, 2017 23:57
    —
2Flasher
Я попросил помочь с адаптацией скрипта, а вы навязываете дискуссию об удобстве тех или иных инструментов TC. У каждого здесь личные предпочтения. Если нет желания адаптировать скрипт, напишите прямо, и на том спасибо.

#58:  Author: FlasherLocation: Москва PostPosted: Mon May 01, 2017 00:33
    —
DrShark
А VBScript в данном случае - это не инструмент ТС? Я всегда предлагаю тот инструмент, который с позиции моего опыта лучше для этого подходит. Если так сильно брезгуете 20 Кб-ой утилитой, то так и напишите.
А чтобы мне адаптировать данный скрипт (без подключения стороннего компонента) под все потенциальные системы, мне придётся проверить кучу комбинаций из версии ОС, библиотеки и интерпретатора, на что у меня сейчас нет ни ресурсов ни времени.

#59:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Mon May 01, 2017 01:15
    —
Flasher wrote:
А VBScript в данном случае - это не инструмент ТС?
Важно то, что это встроенный инструмент Windows.
Flasher wrote:
адаптировать данный скрипт ... у меня сейчас нет ни ресурсов ни времени.
OK. Если кратко, почему не работает моя адаптация кода? Чего не хватает? Дальше я сам.

#60:  Author: FlasherLocation: Москва PostPosted: Mon May 01, 2017 01:35
    —
DrShark wrote:
Важно то, что это встроенный инструмент Windows.
Не понимаю, что это меняет? ТС вообще пустой? Без плагинов, утилит и т.п.?
DrShark wrote:
OK. Если кратко, почему не работает моя адаптация кода?
Так ответ уже есть:
DrShark wrote:
похоже не получает текущую раскладку окна TC
Именно так и есть. А тут разбирался вариант смены языка ввода при первом обращении к окну приложения.
Название скрипта: "Запуск редакторов с переключением языка ввода на нужный".

#61:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Mon May 01, 2017 02:04
    —
Flasher wrote:
ТС вообще пустой? Без плагинов, утилит и т.п.?
Нет, но скрипт должен работать в таких условиях.
Flasher wrote:
А тут разбирался вариант смены языка ввода при первом обращении к окну приложения.
Название скрипта: "Запуск редакторов с переключением языка ввода на нужный".
По-этому и речь об адаптации. Если я верно понял логику оригинального скрипта, раскладка запущеного приложения читается после активации его окна (WSH.AppActivate), у меня же для активации окна TC используется WSH.SendKeys "{Right}". Я неверно понимаю логику оригинального скрипта?

#62:  Author: FlasherLocation: Москва PostPosted: Mon May 01, 2017 02:14
    —
DrShark wrote:
Нет, но скрипт должен работать в таких условиях.
Если нет, то почему речь зашла о таких условиях? Одно другому противоречит.
DrShark wrote:
Я неверно понимаю логику оригинального скрипта?
Именно. >>>
Flasher wrote:
при первом обращении к окну приложения
Активация же может быть после любого по счёту обращения.

#63:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Mon May 01, 2017 03:07
    —
Flasher wrote:
А тут разбирался вариант смены языка ввода при первом обращении к окну приложения.
Сейчас я посмотрел код внимательнее и похоже, скрипт вообще не читает раскладку запущеного приложения через его активное окно. Раскладка задаётся в скрипте явно с помощью ENG (для приложения №1) и RUS (для приложения №2), потом идет её смена. Ладно, тогда вопрос: можно ли в VBScript получить раскладку клавиатуры активного окна?

#64:  Author: FlasherLocation: Москва PostPosted: Mon May 01, 2017 10:46
    —
С помощью доп. ActiveX можно, но в таком случае это и не понадобится, т.к. есть вставка.

#65:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Mon May 01, 2017 12:29
    —
Flasher wrote:
С помощью доп. ActiveX можно, но в таком случае это и не понадобится, т.к. есть вставка.
Можно уточнить, о какой вставке речь? Из буфера обмена?

#66:  Author: FlasherLocation: Москва PostPosted: Mon May 01, 2017 14:00
    —
Нет. Без буфера.



Total Commander -> Программное обеспечение


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group