Что нового

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

glorycpsu

Новичок
Сообщения
7
Репутация
0
Возьмем пример для Блокнота.
Используя Reshacker, видим названия пунктов меню:

POPUP "&Файл"
{
MENUITEM "Созд&ать\tCtrl+N", 1
MENUITEM "&Открыть...\tCtrl+O", 2
MENUITEM "&Сохранить\tCtrl+S", 3
MENUITEM "Сохранить &как...", 4
...
Каким образом можно использовать ф-цию WinMenuSelectItem, чтобы выбрать пункт меню "&Открыть...\tCtrl+O"? Я так понимаю проблема с символом табуляции.

вот пример
Код:
#include <WindowsConstants.au3>

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

$hWnd = WinGetHandle("[CLASS:Notepad]")
WinActivate($hWnd)
WinMenuSelectItem("Безымянный - Блокнот", "", "&Файл", "&Открыть...\tCtrl+O" )


Не могу таким образом открыть нужный мне файл в блокноте
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Почему не сделаешь так ?
Код:
Run('notepad.exe')
WinWaitActive('[CLASS:Notepad]')
Send('^o')

или так:
Код:
Run('notepad.exe ' & FileGetShortName(@ScriptDir & '\test.txt'))
 
Автор
G

glorycpsu

Новичок
Сообщения
7
Репутация
0
Пример с блокнотом, я привел для удобства понимания "проблемы".
Сценарий я пишу для другой задачи.
На практике я использовал команду, которую описывали в вопросе "Как выбирать пункты русифицированого меню?":
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", $WM_COMMAND, "int", 2, "int", 0) ;Открыть...
Но мне все таки интересно как использовать команду - WinMenuSelectItem с определенным пунктом меню, где нет полного совпадения визуального вида меню и прописаного в Reshacker
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
glorycpsu,
Попробуйте так:
Код:
Run('Notepad.exe')
$hWnd = WinWaitActive('[CLASS:Notepad]')
WinMenuSelectItem($hWnd, '', '&Файл', '&Печать' )

Или так.
Код:
#include <GuiMenu.au3>
#include <SendMessage.au3>
#include <WindowsConstants.au3>

$sSearch = 'Параметры страницы'
$wParam = -1
Run('Notepad.exe')
$hWnd = WinWaitActive('[CLASS:Notepad]')
$hMain = _GUICtrlMenu_GetMenu($hWnd)
$hFile = _GUICtrlMenu_GetItemSubMenu($hMain, 0)
$iCount = _GUICtrlMenu_GetItemCount($hFile)
_Write('File menu item count: ' & $iCount)
For $i = 0 To $iCount - 1
	$sTemp = _GUICtrlMenu_GetItemText($hFile, $i)
	_Write($i + 1 & '. ' & $sTemp)
	If StringInStr(StringReplace($sTemp, '&', ''), $sSearch) Then $wParam = $i
Next
If $wParam > -1 Then
	_SendMessage($hWnd, $WM_COMMAND, $wParam)
EndIf

Func _Write($s_Text)
	ControlSend('[CLASS:Notepad]', '', 'Edit1', $s_Text & @CR)
EndFunc   ;==>_Write

У меня оба варианта работают.
 
Автор
G

glorycpsu

Новичок
Сообщения
7
Репутация
0
Спасибо за помощощь.
Сделал вывод, что в наименовании меню можно использовать сокращенный вариант:
"&Открыть... CtrlO" = "&Открыть", если использовать команду WinMenuSelectItem.
 
Верх