Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Контекстное меню (http://forum.oszone.net/showthread.php?t=150875)

Dreadfulangel 18-09-2009 17:29 1221936

Контекстное меню
 
Подскажите как работать с контекстным меню?
Как можно вызвать определенный пукт контекстного меню в любой программе, без эмуляцией нажатий клавиш клавиатуры.

Creat0R 18-09-2009 18:04 1221959

Цитата:

Цитата Dreadfulangel
Как можно вызвать определенный пукт контекстного меню в любой программе »

Что не устраивает в этом примере?

Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <GuiMenu.au3>
;

Run("TaskMgr.exe")

WinWait("[CLASS:#32770;REGEXPTITLE:.*Windows.*]", "", 5)
$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")
If Not WinExists($hTskMgr) Then Exit 1

$nCurrentTab = ControlCommand($hTskMgr, "", "SysTabControl321", "CurrentTab")

$nSubMenu_Item = 4 ;Change to 3th submenu (zero-based), now it will only show the "About" window.
If $nCurrentTab = 1 Then $nSubMenu_Item += 1

$hMenu = _GUICtrlMenu_GetMenu($hTskMgr)

;Theese two is to activate the menu, strange bug, but GetItemSubMenu fails if the menu was not used (clicked)
ControlSend($hTskMgr, "", $hMenu, "!_")
ControlClick($hTskMgr, "", "SysTabControl321")

$hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, $nSubMenu_Item)

;2 = Shutdown, 3 = Restart (2 and 3 it's zero-based item from the top of menu)
$iItemID = _GUICtrlMenu_GetItemID($hSubMenu, 2)

$sItemText = _GUICtrlMenu_GetItemText($hSubMenu, $iItemID, 0)

If MsgBox(262144+36, "GetItemText", StringFormat("Item text: %s\nExecute?", $sItemText)) = 6 Then _
    _SendMessage($hTskMgr, $WM_COMMAND, $iItemID, 0)

И темы нужно называть более конкретно.

Dreadfulangel 20-09-2009 18:19 1223388

В этом примере работаем с обычным меню, а необходимо с контекстным, которое появляется при нажатии правой кнопкой мыши.

Creat0R 20-09-2009 18:38 1223405

Цитата:

Цитата Dreadfulangel
В этом примере работаем с обычным меню, а необходимо с контекстным »

Тогда вот пример на редакторе реестра, где используются заранее известные ID-элементов (посмотреть можно с Reshacker):

Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>
;

If Not ProcessExists("Regedit.exe") Then
    Run("Regedit.exe")
    WinWait("[CLASS:RegEdit_RegEdit]")
EndIf

$hRegEdit = WinGetHandle("[CLASS:RegEdit_RegEdit]")
WinActivate($hRegEdit)

_SendMessage($hRegEdit, $WM_COMMAND, 659, 0) ;Пункт "Экспортировать"
;_SendMessage($hRegEdit, $WM_COMMAND, 675, 0) ;Пункт "Копировать имя раздела"


Dreadfulangel 20-09-2009 22:50 1223562

Большое спасибо за помощь. Теперь всё понятно.

semiono 02-01-2010 22:38 1309348

В моём случае несколько особый тип меню наверное...
http://i.imagehost.org/0477/Snap6.png
Меню отображает плагины к программе, которые она как хост загружает динамически.
То-есть прога сканирует папку и загружает все возможные anyfilename.dll модули которые там находит.
Это я о том, что ResHacker здесь безполезен. Не знаю на сколько это обычная ситуация, но думаю
здесь подходит только нажатие по текст-содержимому паттерна. Знать бы как!
Первый пример довольно сложноватый я не осилил разобраться, тем боелее с TaskMgr.exe я уже как-то
сталкивался, одно из самых трудных окон! :) Может что попроще б?
Можно ли зделать Select на определённое слово в меню? (Кстати, я не вижу тут особой разницы простое или контекстное)


Время: 08:05.

Время: 08:05.
© OSzone.net 2001-