Что нового

[Мышь, клавиатура] Перемещение мыши в контекстном меню.

kolyan-xerox

Новичок
Сообщения
3
Репутация
1
Версия AutoIt: 3.3.6.1

Описание:Нужно переместить курсор мыши в контекстном меню и кликнуть левой кнопкой

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

VladUs

Скриптер
Сообщения
621
Репутация
181
kolyan-xerox [?]
курсор не должен использовать координаты т к размеры экрана разные

Используйте опцию
Код:
Opt("MouseCoordMode", 2)

Она позволяет позиционировать курсор в зависимости от выбранного режима
У нее есть три режима работы.
0 - относительные координаты активного окна
1 - абсолютные координаты экрана (стандартное значение)
2 - относительные координаты клиентской области активного окна

В Вашем случае необходимо указать
Код:
Opt("MouseCoordMode", 0)

или
Код:
Opt("MouseCoordMode", 2)

Скрипт будет работать на разных мониторах.

Ну а далее как установите курсор на любой пункт меню можно использовать функцию Send() для перемещения по меню
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
kolyan-xerox [?]
Нужно переместить курсор мыши в контекстном меню
меню чего?
кликнуть левой кнопкой
в народе это наз-ся выбрать элемент меню. после получения ответа на вопрос выше можно будет говорить возможно ли сделать это средствами ОС, без привлечения мыши.
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Kaster [?]
А действительно ... меню чего ? :-\
Если контекстное меню рабочего стола то вот например

Код:
sleep(3000)
MouseClick( "right" ) 
Sleep(500)
Send ( "{UP}" )
Sleep(500)
Send ( "{Enter}" )
 
Автор
K

kolyan-xerox

Новичок
Сообщения
3
Репутация
1
Kaster сказал(а):
Во-первых контекстное меню если я не написал какое, значит я подразумевал любое.
Во-вторых клик (заимствованное из англ. click) - щелчок, соответственно если переместить курсор мыши в контекстном меню и щелкнуть правой или левой клавишей мыши - это и будет выбрать элемент меню(не нужно умничать).

VladUs Спасибо
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
kolyan-xerox [?]
Во-первых контекстное меню если я не написал какое, значит я подразумевал любое.
это только у тебя в голове оно любое. для всех остальных оно не понятно какое
Во-вторых клик (заимствованное из англ. click) - щелчок, соответственно если переместить курсор мыши в контекстном меню и щелкнуть правой или левой клавишей мыши - это и будет выбрать элемент меню(не нужно умничать).
колесо круглое, и еще катится.
а вообще, если ты не готов принимать помощь помимо использования кликов мышки и эмуляции нажатия клавиш - твое право. но с тех пор как люди по вылезали из пещер, хотят развиваться. в твоем случае, ты сидишь на верхушке айсберга AutoIt и самодовольно корчишь рожи. мое "умничанье" тут не причем. если когда нибудь пойдешь дальше чем вышеуказанные операции, то вспомни про эту свою тему и перечитай. это будет экспериментом, способен ли ты к развитию и расширению кругозора или нет
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Kaster [?]
если ты не готов принимать помощь помимо использования кликов мышки и эмуляции нажатия клавиш
Kaster я готов.
Просто интересно какие существуют способы взаимодействия с контекстным меню помимо кликанья. Я не говорю о стандартных горячих клавишах вывода контекстного меню , встроенные в Windows (типа SHIFT + F10).
Как программно управлять контекстным меню. Допустим как получить список пунктов контекстного меню того или иного объекта.
На MSDN нашел несколько функций для работы с контекстным меню:
CreatePopupMenu() - Создает контекстное меню
TrackPopupMenu() - Показывает контекстное меню
Я туда копаю ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,714
VladUs сказал(а):

Нет, в другую сторону. Эти функции предназначены для "своих" меню, а не для чужих. Выбрать пункт в чужом меню можно, в некоторых случаях, если меню не создается динамически, так:

Код:
_SendMessage($hWnd, $WM_COMMAND, $ID, 0)


Здесь $ID - идентификатор необходимого пункта меню. Тебе остается только определить этот ID.

:smile:

Например, следующая команда обновляет содержимое окна ($hWnd) проводника Windows, аналогична F5 (точнее тоже самое).

Код:
_SendMessage($hWnd, $WM_COMMAND, 28931, 0)
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Yashied [?]
Тебе остается только определить этот ID
Yashied поделитесь секретом как определить дескриптор (если я Вас правельно понял) пункта контекстного меню
 

Kolyan_xerox

Новичок
Сообщения
3
Репутация
0
Yashied сказал(а):
мое "умничанье" тут не причем
Ладно, я извиняюсь. Погорячился... Я тут новенький и мне показалось что вы придираетесь.
Код: AutoIt [Выделить]
_SendMessage($hWnd, $WM_COMMAND, $ID, 0)

Здесь $ID - идентификатор необходимого пункта меню. Тебе остается только определить этот ID.

Как его определить? Допустим контекстное меню рабочего стола.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Kolyan_xerox
было бы вернее, если бы ты все же указал какая именно программа. может случиться так, что решение будет варьироваться от случая к случаю. Некоторые приложения вовсе не предоставляют доступа к своим элементам в контексте Windows, т.к. написаны с использованием других графических движков.
все таки это раздел "Стол заказов" - конкретные решения на конкретные вопросы, как правило практические. я не думаю что тебя интересует пункт меню именно проводника. опиши подробнее, в чем заключается конечный результат.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,714
Kolyan_xerox сказал(а):
Как его определить? Допустим контекстное меню рабочего стола.

Это ID пункта меню, а не самого контекстного меню. Если программа создает меню во время создания GUI, а не в тот момент, когда было вызвано это меню, то по ID можно выбрать соответствующий пункт. Это обычно справедливо для программ, написанных на C#. Если в ресурсах присутствует MENU, то ID можно взять от туда. Но опять же все зависит от самого приложения.
 

Kolyan_xerox

Новичок
Сообщения
3
Репутация
0
Вот код который нужно поправить.
Код:
ProgressOn("Выполнение операции", "Обработка процессов", "0 процентов")
ProgressSet( 1, "1" & " процентов")
sleep(700)
#NoTrayIcon
#include <SysTray_UDF.au3>
$Pid = ProcessExists("everest.exe")
If Not $Pid Then
    MsgBox(16, "Ошибка", "Этот процесс не существует")
    Exit
EndIf
ProgressSet( 25, "25" & " проентов")
$Index = _SysTrayIconIndex($Pid)
If @error Then
    MsgBox(16, "Ошибка", "Этот процесс не имеет иконки в трее")
    Exit
EndIf
ProgressSet( 50, "50" & " процентов")

_SysTrayIconClick($Index, "Right")

If @error Then
    MsgBox(16, "Ошибка", "Невозможно нажать на иконку")
    Exit
EndIf
ProgressSet( 75, "75" & " percent")
Func _SysTrayIconClick($iIndex, $sButton="Main")
    Local $TrayIcon_Pos = _SysTrayIconPos($iIndex)
    If Not IsArray($TrayIcon_Pos) Then Return SetError(1, 0, 0)
    Local $Old_Mouse_Pos = MouseGetPos()
    MouseClick($sButton, $TrayIcon_Pos[0], $TrayIcon_Pos[1], 1, 0)
    MouseMove($Old_Mouse_Pos[0], $Old_Mouse_Pos[1], 0)
EndFunc
ProgressSet(100 , "Завершено", "Обработка")
sleep(500)
ProgressOff()


После нажатия нужно выбрать элемент меню Мастер отчетов...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,714
Код:
#Include <GUIMenu.au3>
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>

$hWnd = WinGetHandle('[TITLE:EVEREST Ultimate Edition;CLASS:TEVEREST]')
$hMenu = _GUICtrlMenu_GetMenu($hWnd) ; Основное меню программы
$hMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, 2) ; 2 - "Отчет"
$ID = _GUICtrlMenu_GetItemID($hMenu, 0) ; 0 - "Мастер отчетов..."
_WinAPI_PostMessage($hWnd, $WM_COMMAND, $ID, 0)


Или так:

Код:
_WinAPI_PostMessage(WinGetHandle('[TITLE:EVEREST Ultimate Edition;CLASS:TEVEREST]'), $WM_COMMAND, 57, 0)
 

VladUs

Скриптер
Сообщения
621
Репутация
181
OffTopic:
VladUs [?]
Просто интересно какие существуют способы взаимодействия с контекстным меню помимо кликанья
Вот я балбес - упустить из вида такую библиотеку по работе с менюшкой и при том из справки ! Остается только :suicide:
 
Верх