Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] работа с контекстым меню

Ответить
Настройки темы
[решено] работа с контекстым меню

Новый участник


Сообщения: 25
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем привет! кто-нибудь знает, как с помощью AutoIt можно управлять контекстным меню (обычно это окна типа: [Class: #32768]). в частности интересует возможность управлять менюшками, которые появляютя, если кликнуть правой кнопкой мыши по какой-нить иконке в трее.

Отправлено: 16:49, 25-05-2010

 

Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


alexey_a,
Попробуйте так. Вместо "AdMunch.exe" поставьте нужную Вам Программу. Если раскомментировать последние строки в функции, то у меня закрывает Ad Muncher.
Код: Выделить весь код
#NoTrayIcon
#include <SysTray_UDF.au3>

$Pid = ProcessExists("AdMunch.exe")

If Not $Pid Then
    Exit
EndIf
Local $Old_Mouse_Pos = MouseGetPos()
MouseMove(@DesktopWidth / 2, @DesktopHeight, 0)
$Index = _SysTrayIconIndex($Pid)
If @error Then
    Exit
EndIf

_SysTrayIconClick($Index, "Right")

Func _SysTrayIconClick($iIndex, $sButton = "Main")
    Local $TrayIcon_Pos = _SysTrayIconPos($iIndex)
    If Not IsArray($TrayIcon_Pos) Then Return SetError(1, 0, 0)
    MouseClick($sButton, $TrayIcon_Pos[0], $TrayIcon_Pos[1], 1, 0)
    ;MouseClick("left", $TrayIcon_Pos[0] - 15, $TrayIcon_Pos[1] - 15, 1, 0)
    ;MouseMove($Old_Mouse_Pos[0], $Old_Mouse_Pos[1], 0)
EndFunc   ;==>_SysTrayIconClick
SysTray_UDF
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:49, 25-05-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 25
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо, madmasles!
я тут написал немного другую функцию. она мне больше подходит, так как менюшки, с которыми я работаю, периодически меняются (количество пунктов меню, очередность). поэтому после каждого изменения для каждого пункта в меню измерять его положение относительно окошка, мне не очень хочется. вот код функции:

Код: Выделить весь код
; #Функция# -----------------------------------------------------------------------------------------------------------------------------
; Имя....................: SelectItemFromMonitorMenu
; Описание ..............: Выбирает пункт контекстного меню для иконки вашего приложения в трее 
; Параметры .............: $item - текст пункта меню (например: "Exit")
; Возвращаемые значения .: Успешно      - 1
;                          Ошибка       - 0
; Заметки ...............: $your_applications_window_title - title окошка вашего приложения, которое отображается в трее. 
;                                Вы можете его увидеть в секции ToolsBar в AutoIt Window Info, если наведете на курсор на иконку в трее.
; -----------------------------------------------------------------------------------------------------------------------------------------
#Include <GuiToolBar.au3>
#include <GuiMenu.au3>

Func SelectItemFromMonitorMenu($item)
	Opt("MouseCoordMode", 1)
	$ind = 0
	$hWnd = ControlGetHandle("[CLASS:Shell_TrayWnd]","","[CLASS:ToolbarWindow32; TEXT:Notification Area]")
	if $hWnd = "" Then
		ConsoleWrite("Can't get hwnd of bottom toolbar.")
		Return 0
	EndIf
	
	$tray_icon_count = _GUICtrlToolbar_ButtonCount($hWnd)
	
	For $i = 0 to $tray_icon_count
		$command_id = _GUICtrlToolbar_IndexToCommand($hWnd, $i)
		$text = _GUICtrlToolbar_GetButtonText($hWnd, $command_id)
		if StringInStr($text,$your_applications_window_title) = 0 Then
			ContinueLoop
		Else
			$index = $i
			ExitLoop
		EndIf
	Next
	
	_GUICtrlToolbar_ClickIndex($hWnd, $index, "right") 
	Sleep(100)
	
	$cur_pos = MouseGetPos()
	if IsArray($cur_pos) = 0 Then
		ConsoleWrite("Can't get position of current mouse coordinate")
		Return 0
	EndIf

	if WinExists("[Class:#32768]") = 0 Then
		ConsoleWrite("Context menu is not appeared for tray icon.")
		Return 0
	Else
		$h_win = WinGetHandle("[Class:#32768]")
		if $h_win = "" Then
			ConsoleWrite("Can't get hwnd for application's context menu window.")
			Return 0
		EndIf
	
		$hMenu = _SendMessage($h_win, $MN_GETHMENU,0,0)
		
		$it_index = _GUICtrlMenu_FindItem($hMenu, $item,True)
		if $it_index = -1 Then
			ConsoleWrite("Can't find item " & $item & " in the application's context menu window.", $fail)
			Return 0
		EndIf
		
		$it_pos = _GUICtrlMenu_GetItemRect($h_win, $hMenu, $it_index)
		if IsArray($it_pos) = 0 Then
			ConsoleWrite("Can't get position of item " & $item & " in the application's context menu window.", $fail)
			Return 0
		EndIf
		
		MouseClick("left", $it_pos[0] + ($it_pos[2]-$it_pos[0])/2, $it_pos[1] + ($it_pos[3]-$it_pos[1])/2)
	EndIf
	
    MouseMove($cur_pos[0], $cur_pos[1])
	Return 1
EndFunc

Отправлено: 10:42, 26-05-2010 | #3


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


alexey_a,
У меня не работает, ругается на необъявленную переменную $your_applications_window_title, и не понял, откуда $MN_GETHMENU и $fail.

Отправлено: 16:55, 26-05-2010 | #4


Новый участник


Сообщения: 25
Благодарности: 0

Профиль | Отправить PM | Цитировать


там же вверху написано, что:
$your_applications_window_title - title окошка вашего приложения, которое отображается в трее. Вы можете его увидеть в секции ToolsBar в AutoIt Window Info.
$MN_GETHMENU - это стандартная константа, объявленная в ...\AutoIt3\include\WindowsConstants.au3
$fail надо удалить и запятую, которая стоит перед ним. то есть заменить
ConsoleWrite("Can't find item " & $item & " in the application's context menu window.", $fail)
на
ConsoleWrite("Can't find item " & $item & " in the application's context menu window.").

Это моя ошибка. просто у меня в скриптах я использую свою функцию для логирования, а не ConsoleWrite. и так получилось,что переделывая скрипт для того, чтобы разместить на форуме, я заменял мою функцию на ConsoleWrite. и для одно замены сделал это неправильно, забыл удалить второй параметр $fail.

Отправлено: 14:52, 28-05-2010 | #5


Забанен


Сообщения: 91
Благодарности: 0

Профиль | Цитировать


Цитата alexey_a:
вот код функции: »
не понял как ей пользоваться ?
не находит приложение
в строчке :
Цитата alexey_a:
ControlGetHandle("[CLASS:Shell_TrayWnd]","","[CLASS:ToolbarWindow32; TEXT:Notification Area]") »
менял "TEXT:Notification Area" на что попало и включал мозг,а потом снова отключал входил в нирвану но никак.

Отправлено: 19:11, 18-07-2012 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] работа с контекстым меню

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] История переходов в меню Пуск (все вопросы) kortez Microsoft Windows 7 35 02-05-2011 10:09
Установка - Удаление меню "Програмы" из меню "Пуск" fragnat Microsoft Windows 2000/XP 2 07-02-2010 23:54
Работа с меню в системном трее sashadeg AutoIt 4 20-05-2009 14:57
Разное - [решено] Доп-ое меню в св-вах "Мой компьютер" и Меню восстановление forcik Microsoft Windows 2000/XP 3 24-12-2008 02:42
Разное - Отсутствует меню "Свойства папки" в меню "сервис" папки. __sa__nya Microsoft Windows 2000/XP 1 12-08-2008 16:12




 
Переход