Автор Тема: Получить правильный ID пункта контекстного меню в WM_MENUSELECT  (Прочитано 176 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн Vanguger [?]

  • Новичок
  • *
  • Сообщений: 13
  • Репутация: 0
  • Пол: Мужской
    • Webarion
    • Награды
  • Версия AutoIt: 3.3.14.0
Помогите получить соответствующий ID пункта меню в WM_MENUSELECT. Что-то не возьму в толк, вложенные меню определяются с нулевым индексом, не тем, который определён в переменной. Нужно, чтобы $ID совпадал с тем, который ранее определён в переменных пунктов меню.
Код: AutoIt [Выделить]
#include <WindowsConstants.au3>
#include <MenuConstants.au3>
#include <GUIConstantsEx.au3>
#Include <Array.au3>
#include <GuiMenu.au3>

$Gui = GUICreate("WM_MENUSELECT", 333, 333)

$ContMenu = GUICtrlCreateContextMenu()
$menu1 = GUICtrlCreateMenu('menu1', $ContMenu)
$subm1 = GUICtrlCreateMenu('subm1', $menu1)
$subi1 = GUICtrlCreateMenu('subi1', $menu1)
$menu2 = GUICtrlCreateMenu('menu2', $ContMenu)
$menu3 = GUICtrlCreateMenu('menu3', $ContMenu)
$item1 = GUICtrlCreateMenu('item1', $ContMenu)
$item2 = GUICtrlCreateMenu('item2', $ContMenu)

GUIRegisterMsg($WM_MENUSELECT, "WM_MENUSELECT")

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func WM_MENUSELECT($hWnd, $Msg, $wParam, $lParam)
    Local $ID = BitAND($wParam, 0xFFFF)
    ConsoleWrite('$menu3=' & $menu3 & ' $ID=' & $ID & @CRLF)
EndFunc

« Последнее редактирование: Июль 14, 2018, 06:29:00 от Vanguger »

Русское сообщество AutoIt


Онлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1420
  • Репутация: 207
  • Пол: Мужской
  • Windows 7 /10 [x64]
    • Награды
  • Версия AutoIt: 3.3.12.0
Вариант 1:
(нажмите для показа/скрытия)

Вариант 2:
(нажмите для показа/скрытия)

Оффлайн Vanguger [?]

  • Новичок
  • *
  • Сообщений: 13

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Webarion
    • Награды
  • Версия AutoIt: 3.3.14.0
Спасибо за ответ, к сожалению не подходят варианты. Первый не соответствует задаче, поймать правую мышь как на меню так и на его пункте. Второй вариант чуть ближе, но тоже не ловит клик по меню и правой кнопкой. Смотрю пока в сторону двух обработчиков WM_MENUSELECT WM_CONTEXTMENU, первый ловит ID на любом пункте, второй выполняет действие по правой кнопке. Но к сожалению, пока этот ларчик мне не открылся, основная проблема сводится только к определению правильного пункта(в том числе любого подменю) в WM_MENUSELECT.

Помечен как лучший ответ пользователем Vanguger Отправлен Июль 15, 2018, 18:50:28

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3813
  • Репутация: 1006
    • Награды
  • Версия AutoIt: 3.3.14.0
Vanguger  [?]
Цитировать
поймать правую мышь как на меню так и на его пункте
Код: AutoIt [Выделить]
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <WinAPI.au3>

GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")

$Gui = GUICreate("", 333, 333)
$ContMenu = GUICtrlCreateContextMenu()
$menu1 = GUICtrlCreateMenu('menu1', $ContMenu)
$subm1 = GUICtrlCreateMenuItem('subm1', $menu1)
$subi1 = GUICtrlCreateMenuItem('subi1', $menu1)
$menu2 = GUICtrlCreateMenuItem('menu2', $ContMenu)
$menu3 = GUICtrlCreateMenu('menu3', $ContMenu)
$item1 = GUICtrlCreateMenuItem('item1', $menu3)
$item2 = GUICtrlCreateMenuItem('item2', $menu3)
GUISetState()

Do
Until GUIGetMsg() = -3

Func WM_CONTEXTMENU()
  Local $tPoint, $hWnd, $hMenu, $iItem, $iID
  $tPoint = _WinAPI_GetMousePos()
  $hWnd = _WinAPI_WindowFromPoint($tPoint)
  If _WinAPI_GetClassName($hWnd) = "#32768" Then
    $hMenu = _SendMessage($hWnd, 0x01E1) ; MN_GETHMENU
    $iItem = _GUICtrlMenu_MenuItemFromPoint($hWnd, $hMenu)
    $iID = _GUICtrlMenu_GetItemID($hMenu, $iItem)
    ConsoleWrite($iID & @CRLF)
  EndIf
  Return "GUI_RUNDEFMSG"
EndFunc


Русское сообщество AutoIt


Онлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1420
  • Репутация: 207
  • Пол: Мужской
  • Windows 7 /10 [x64]
    • Награды
  • Версия AutoIt: 3.3.12.0
OffTopic
...клик по меню и правой кнопкой...
Опять грабли  :laser:

Оффлайн Vanguger [?]

  • Новичок
  • *
  • Сообщений: 13

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Webarion
    • Награды
  • Версия AutoIt: 3.3.14.0
InnI, благоДарю почтеннейше! Как я только этот _GUICtrlMenu_GetItemID не крутил, одни нули прилетали. Ну, а рабочий пример уже можно дальше крутить.

OffTopicAlofa, чтож, пусть так, «грабли» оказались очень полезны, в любом случае, спасибо за ответ :)

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
4971 Просмотров
Последний ответ Январь 26, 2010, 03:38:33
от Alexey
5 Ответов
2796 Просмотров
Последний ответ Декабрь 08, 2013, 12:11:31
от WSWR
27 Ответов
15172 Просмотров
Последний ответ Февраль 19, 2014, 00:33:34
от erlik
0 Ответов
722 Просмотров
Последний ответ Ноябрь 18, 2015, 17:17:50
от The_Immortal
2 Ответов
1085 Просмотров
Последний ответ Апрель 16, 2016, 12:47:40
от alex33
6 Ответов
1258 Просмотров
Последний ответ Декабрь 20, 2016, 17:47:06
от Cusium
2 Ответов
872 Просмотров
Последний ответ Февраль 18, 2017, 18:50:59
от IvanChai
8 Ответов
1103 Просмотров
Последний ответ Март 19, 2017, 15:56:58
от Alofa
0 Ответов
288 Просмотров
Последний ответ Сентябрь 24, 2017, 12:41:57
от roma351234567890
1 Ответов
134 Просмотров
Последний ответ Май 03, 2018, 14:43:25
от joiner