1 (изменено: jackfrost, 2012-02-24 13:58:13)

Тема: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

вопрос в переключении раскладки клавиатуры, не работает очевидное

 SendInput, ^{Shift}

хотя вполне себе работает такой вариант:

 SendInput {RCtrl Down}{RShift}{RCtrl Up}

я вообще в курсе, что раскладку нужно переключать так:

PostMessage, 0x50, 2, 0,, A ; 0x50 is WM_INPUTLANGCHANGEREQUEST

но очень интересно понять в теории, почему не работает прямой способ  SendInput, ^{Shift}
(вообще PostMessage устраивал пока не пересел c WinXP на Win7, тут это работает почему-то не всегда и не везде)
(вариант с  SendInput {RCtrl Down}{RShift}{RCtrl Up} работает еще хуже практически каждый 10 раз не срабатывает)
в скрипте стоит #InstallKeybdHook...

вообще задача простая - переключить раскладку таким способом, будто это сделал юзер нажав  ctrl+shift.

2

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

jackfrost, Вам сюда: Обязательно прочитать перед созданием темы! для начала.

3

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

поправил.

4 (изменено: Malcev, 2012-02-24 14:41:45)

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Переключение расскладок срабатывает на отжатие Ctrl или Shift после их одновременного нажатия
Поэтому правильно будет так

Send {ctrl down}{shift down}{shift up}{ctrl up}

5 (изменено: jackfrost, 2012-02-24 17:03:27)

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Чем это отличается от того что я выше описал?
Если я не ошибаюсь {shift down}{shift up} == {shift}
и в свою очередь  {Ctrl Down}{Shift}{Ctrl Up} ==  ^{Shift}
В чем разница? Почему последнее работает кое как,  а  ^{shift} вообще не работает.?

У кого есть еще идеи по существу:
Задача простая: переключить раскладку таким способом, будто это сделал юзер нажав  ctrl+shift.  (т.е. чтобы страбатывало всегда и везде)

6

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

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

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

7

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

А где именно не срабатывает-то? Думаю, в 7 везде срабатывать и не будет, т.к. заморочки с уровнями привилегий у процессов, или как там это правильно называется.

8 (изменено: creature.ws, 2012-02-24 17:24:16)

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

OFF: «Заморочки» по причине того, что Autohotkey.exe не подписан, но это скорее «особенность» Autohotkey.
Если решение SendInput, ^{Shift} «очевидно» отправляет в активное окно нажатие ctrl+shift, то, вероятно, SendInput, +{Shift} отправит Shift при нажатом Shift?

9

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Попробуй отключить UAC

10

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Совсем не в том ключе обсуждение пошло
Специалисты — пролейте свет истины на то как AHK эмулирует нажатия и почему ^{Shift} не равнозначно последовательному нажатию ctrl и shift.

11

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

А по-моему так всё равнозначно
^{Shift} = при зажатом контроле нажали шифт
А так как смена языка происходит не при нажатии, а при отжатии, поэтому этот код и не срабатывает.
У меня на вин7 смена языка всегда срабатывает, так как UAC я отключил.

12

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Сейчас проверил по KeyHistory — при ^{Shift} посылается только Shift, шут его знает почему. Я если и знал, то давно забыл. Я пользуюсь PostMessage, в 7 не работает в некоторых диалоговых окнах, что бывает бесит при запарке, но в целом жить можно. Подпись вроде нужна, чтобы SendPlay работал, но вообще-то я в это глубоко не вникал, так что, может, и правда. Авось creature.ws каких-нибудь специалистов накличет и они объяснят, в чём тут фикус-пикус. Ждём-с.

13

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Похоже нельзя применять модификаторы к модификаторам .

YMP пишет:

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

Я тоже не вникал, но уверен, что подпись никак не влияет на поведение программы, только на запуск.

YMP пишет:

Я пользуюсь PostMessage, в 7 не работает в некоторых диалоговых окнах, что бывает бесит при запарке, но в целом жить можно.

Malcev пишет:

У меня на вин7 смена языка всегда срабатывает, так как UAC я отключил.

Если не секрет, то в каких приложениях смена языка не работает? Я почему-то уверен, что эти приложения просто не передают сообщение WM_INPUTLANGCHANGEREQUEST в DefWindowProc. Если же UAC действительно блокирует отправку сообщения, то мы должны получить ошибку ERROR_ACCESS_DENIED.

14

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Про подпись вот тема на оф. форуме: Enable interaction with administrative programs.
В каких окошках язык не меняется, я не запомнил, к сожалению.

15

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

YMP пишет:

Про подпись вот тема на оф. форуме: Enable interaction with administrative programs.

Ну дык а откуда тогда:

YMP пишет:

Подпись вроде нужна, чтобы SendPlay работал

?:) Там подпись упоминается только как способ запуска программы без контроля со стороны UAC. После запуска подписанная программа ничем не отличается от других.

16

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Я почему-то уверен, что эти приложения просто не передают сообщение WM_INPUTLANGCHANGEREQUEST в DefWindowProc.

А как такое может быть?

17 (изменено: Александр_, 2012-02-25 20:40:37)

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Malcev пишет:

Я почему-то уверен, что эти приложения просто не передают сообщение WM_INPUTLANGCHANGEREQUEST в DefWindowProc.

А как такое может быть?

Мне всегда нравились вопросы из разряда "как мне этого не сделать?":). Вот пример:

Gui, Add, Radio, glChange, менять
Gui, Add, Radio, glNotChange Checked, не менять 
gui, show
Change := 0
onmessage(0x50, "f")
return

lChange:
   Change := 1
return

lNotChange:
   Change := 0
return

1::PostMessage, 0x50, 2, 0,, A

f(wParam, lParam, msg, hwnd)
{
   global Change
   if(Change)
      return DllCall("DefWindowProc", "ptr", hwnd, "uint", msg, "ptr", wParam, "ptr", lParam)
   else
      return 0
}

Esc::
GuiClose:
   ExitApp

Создаём окно и обрабатываем сообщение WM_INPUTLANGCHANGEREQUEST. При нажатии единицы посылаем сообщение WM_INPUTLANGCHANGEREQUEST активному окну. Поведение нашего окна задаётся через gui.

18

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Ну так тут понятно, вы специально return поставили.
С таким же успехом можно всё, что угодно заставить не работать.

19

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Malcev пишет:

Ну так тут понятно, вы специально return поставили.
С таким же успехом можно всё, что угодно заставить не работать.

В чём же тогда состоял вопрос в посте #16?

20 (изменено: Malcev, 2012-02-25 20:58:18)

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Ну а без создания искусственной ситуации, как они могут не передавать сообщения?
На ум приходит разве что какой-нибудь конфликт с другим AHK скриптом.
Тогда непонятно, почему это возникает только на седьмой винде.

21

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Malcev пишет:

Ну а без создания искусственной ситуации, как они могут не передавать сообщения?
На ум приходит разве что какой-нибудь конфликт с другим AHK скриптом.

Нет никакой "искусственной ситуации", если нужно переключать раскладку при получении этого сообщения, то обрабатывай это сообщение и передавай его в процедуру по-умолчанию, а если не нужно, то просто ничего не делай. Само по себе приложение не будет ничего делать.

22

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Александр_ пишет:

Ну дык а откуда тогда:

YMP пишет:

Подпись вроде нужна, чтобы SendPlay работал

?:) .

Ну дык как раз оттуда

Interact with windows of administrative programs without running the script as administrator.

Use SendPlay.

23

Re: AHK: Почему не переключается раскладка пo SendInput, ^{Shift} ?

Исходя из всего вышесказанного, я понимаю только то, что переключать раскладку сообщением postmessage не всегда верно, ибо некоторые шибкоумные приложения могут вести себя не корректно.
Именно поэтому я думаю, что имеет смысл переключать раскладку просто посылом  Ctrl + Shift.
Осталось разобраться как грамотно это сделать. (сейчас пока пробую метод предложенный Malcevым во 2ом посте)
Всем спасибо!