Что нового

[Окна, Диалоги] Как выбирать пункты русифицированого меню?

System Error

Новичок
Сообщения
4
Репутация
0
Добрый день!

Только начинаю изучать autoit. Решил потренироваться на Блокноте:

Код:
Run("notepad.exe")
WinWaitActive("[CLASS:Notepad]")
send("^P")
Блокнот запускается, диалог для печати выходит. Всё нормально.
А если пытаюсь добраться до этого же диалога через меню("alt-ф" и затем "п"),
то получаю просто "фп" в окне для текста.

Код:
Run("notepad.exe")
WinWaitActive("[CLASS:Notepad]")

; здесь переключаю на русский с помощью _SetKeyboardLayout("00000419", $hWnd)...

send("!ф") 
send("п")
Почему это не работает? Как добраться до пунктов русифицированого меню
клавиатурными командами типа alt-Ф, alt-П ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 242
Репутация
2 344
Лучше через ID-элемента (посмотреть можно используя Reshacker):

Код:
#include <WindowsConstants.au3>

If Not ProcessExists("notepad.exe") Then
    Run(@WindowsDir & "\notepad.exe")
    WinWait("[CLASS:Notepad]")
EndIf

$hWnd = WinGetHandle("[CLASS:Notepad]")
WinActivate($hWnd)

;SendMessage будет ожидать завершения запроса, PostMessage не будет.
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", $WM_COMMAND, "int", 6, "int", 0) ;Печать...
DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", $WM_COMMAND, "int", 65, "int", 0) ;О программе
 
Автор
S

System Error

Новичок
Сообщения
4
Репутация
0
CreatoR сказал(а):
Лучше через ID-элемента (посмотреть можно используя Reshacker):
Все-таки хотелось бы разобраться с работой в меню. В каждой строке меню есть подчеркнутая буква. Если я буду путешествовать по меню в Блокноте без языка скриптов, то, нажав "alt-ф"(в русской раскладке), я открою меню "Файл", затем я нажимаю кнопку "п" и открываю окно печати, если я нажму "ы", то сработает строка меню "Выход", и я выйду из Блокнота. Как правильно использовать команду send() для передачи в приложение тех же самых клавиш: "alt-ф", "п", "ы", чтобы выполнить те же самые действия из скрипта? Или такие команды выполняются с использованием других функций?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 242
Репутация
2 344
System Error [?]
Как правильно использовать команду send() для передачи в приложение тех же самых клавиш: "alt-ф", "п", "ы", чтобы выполнить те же самые действия из скрипта?
Так например:

Код:
If Not ProcessExists("notepad.exe") Then
    Run(@WindowsDir & "\notepad.exe")
    WinWait("[CLASS:Notepad]")
EndIf

$hWnd = WinGetHandle("[CLASS:Notepad]")

SendKeepActive($hWnd)
Opt("SendKeyDelay", 1)

If @KBLayout <> 0x0419 Then _WinAPI_SetKeyboardLayout($hWnd, 0x0419)
Send("{ALTDOWN}aП{ALTUP}")

Func _WinAPI_SetKeyboardLayout($hWnd, $iLanguage)
	Local $Ret = DllCall('user32.dll', 'long', 'LoadKeyboardLayout', 'str', '0000' & Hex($iLanguage, 4), 'int', 0)
	If @error Or $Ret[0] = 0 Then Return SetError(1, 0, 0)
	DllCall('user32.dll', 'ptr', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0050, 'int', 1, 'int', $Ret[0])
	Return SetError(0, 0, 1)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
OffTopic:
Ооо... Сколько не читал справку, а о @KBLayout только что узнал.

:smile:
 
Автор
S

System Error

Новичок
Сообщения
4
Репутация
0
CreatoR сказал(а):
System Error [?]
Как правильно использовать команду send() для передачи в приложение тех же самых клавиш: "alt-ф", "п", "ы", чтобы выполнить те же самые действия из скрипта?
Так например:
Спасибо огромное за пример! Работает.

Но остался еще один вопрос. Почему мы посылаем после переключения раскладки на кириллицу alt-a, а не alt-ф?

Код:
send("{ALTDOWN}aп{ALTUP}")


Я вижу, что они находятся на одной кнопке, но не ясна логика.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
281
В Блокноте можно еще функцией WinMenuSelectItem.
Пример:

Run("notepad.exe")
WinWaitActive("Безымянный - Блокнот")
WinMenuSelectItem("Безымянный - Блокнот", "", "&Справка", "&О программе" )
Exit
 
Автор
S

System Error

Новичок
Сообщения
4
Репутация
0
Yuri сказал(а):
В Блокноте можно еще функцией WinMenuSelectItem.
Пример:

Run("notepad.exe")
WinWaitActive("Безымянный - Блокнот")
WinMenuSelectItem("Безымянный - Блокнот", "", "&Справка", "&О программе" )
Exit
Спасибо!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 242
Репутация
2 344
System Error [?]
Почему мы посылаем после переключения раскладки на кириллицу alt-a, а не alt-ф?
Не знаю, у меня с «Ф» не работает :-X
 
Верх