Что нового

Получить правильный ID пункта контекстного меню в WM_MENUSELECT

Webarion

Осваивающий
Сообщения
143
Репутация
24
Помогите получить соответствующий ID пункта меню в WM_MENUSELECT. Что-то не возьму в толк, вложенные меню определяются с нулевым индексом, не тем, который определён в переменной. Нужно, чтобы $ID совпадал с тем, который ранее определён в переменных пунктов меню.
Код:
#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
 
A

Alofa

Гость
Вариант 1:
Код:
#include <GUIConstantsEx.au3>

$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()

While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
		Case $menu1 To $item2
			ConsoleWrite('+Кликнут $ID=' & $iMsg & @CRLF)
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Вариант 2:
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$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)

GUIRegisterMsg($WM_MENUSELECT, "WM_MENUSELECT")

GUISetState()

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

Func WM_MENUSELECT($hWnd, $Msg, $wParam, $lParam)
	Local Static $IDprev
    Local $ID = BitAND($wParam, 0xFFFF)
    ConsoleWrite('-Выбран $ID=' & $ID & @CRLF)
	 ; Костыли :)
	If Not $lParam And Not $ID Then ConsoleWrite('+Кликнут $ID=' & $IDprev & @CRLF)
	If $ID Then $IDprev = $ID
EndFunc
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Спасибо за ответ, к сожалению не подходят варианты. Первый не соответствует задаче, поймать правую мышь как на меню так и на его пункте. Второй вариант чуть ближе, но тоже не ловит клик по меню и правой кнопкой. Смотрю пока в сторону двух обработчиков WM_MENUSELECT WM_CONTEXTMENU, первый ловит ID на любом пункте, второй выполняет действие по правой кнопке. Но к сожалению, пока этот ларчик мне не открылся, основная проблема сводится только к определению правильного пункта(в том числе любого подменю) в WM_MENUSELECT.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Vanguger [?]
поймать правую мышь как на меню так и на его пункте
Код:
#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
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
InnI, благоДарю почтеннейше! Как я только этот _GUICtrlMenu_GetItemID не крутил, одни нули прилетали. Ну, а рабочий пример уже можно дальше крутить.

OffTopic:
Alofa, чтож, пусть так, «грабли» оказались очень полезны, в любом случае, спасибо за ответ :smile:
 
Верх