Что нового

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

kolyan-xerox

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

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

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

VladUs

Скриптер
Сообщения
621
Репутация
180
kolyan-xerox [?]
курсор не должен использовать координаты т к размеры экрана разные
Используйте опцию
Код:
Opt("MouseCoordMode", 2)

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

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

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

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

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

kaster

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

VladUs

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
VladUs сказал(а):
Нет, в другую сторону. Эти функции предназначены для "своих" меню, а не для чужих. Выбрать пункт в чужом меню можно, в некоторых случаях, если меню не создается динамически, так:

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


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

:smile:

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

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

VladUs

Скриптер
Сообщения
621
Репутация
180
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 711
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 711
Код:
#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
Репутация
180
OffTopic:
VladUs [?]
Просто интересно какие существуют способы взаимодействия с контекстным меню помимо кликанья
Вот я балбес - упустить из вида такую библиотеку по работе с менюшкой и при том из справки ! Остается только :suicide:
 
Верх