Что нового

Определение нажатия на разделитель в меню

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Есть ли возможность определить, был ли нажат пункт меню разделителя?
Понятно что меню не закроется после этого, но мне нужно как то отследить это событие и самостоятельно закрыть меню, чтобы что то потом сделать с выбранным элементом.

Пример:

Код:
#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <WinAPIError.au3>
#include <WindowsConstants.au3>

Global Enum $e_idOpen = 1000, $e_idSeparator, $e_idInfo

Example()

Func Example()
    ; Create GUI
    GUICreate("Menu", 400, 300)
    GUISetState(@SW_SHOW)
	
    ; Register message handlers
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUIRegisterMsg($WM_MENUSELECT, "WM_MENUSELECT")
	GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
    
    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>Example

; Handle WM_COMMAND messages
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Switch $wParam
        Case $e_idOpen
            _WinAPI_ShowMsg("Open")
		Case $e_idSeparator
			_WinAPI_ShowMsg("Separator")
		Case $e_idInfo
			_WinAPI_ShowMsg("Info")
    EndSwitch
EndFunc   ;==>WM_COMMAND

; Handle WM_MENUSELECT messages
Func WM_MENUSELECT($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    $iHi = BitShift($wParam, 16)
    $iLow = BitAND($wParam, 0xFFFF)
	
	If $iHi <> -1 And BitAND($iHi, $MF_GRAYED) Then
		ToolTip('Separator hovered, ID: ' & $iLow)
	Else
		ToolTip('')
	EndIf
EndFunc   ;==>WM_COMMAND

; Handle WM_CONTEXTMENU messages
Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Local $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Open", $e_idOpen)
	_GUICtrlMenu_AppendMenu($hMenu, $MF_SEPARATOR, $e_idSeparator, '')
   ; _GUICtrlMenu_InsertMenuItem($hMenu, 1, "", $e_idSeparator)
    _GUICtrlMenu_InsertMenuItem($hMenu, 2, "Info", $e_idInfo)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
    _GUICtrlMenu_DestroyMenu($hMenu)
    Return True
EndFunc   ;==>WM_CONTEXTMENU


Тут при наведении курсора над разделителем в контекстном меню, отображается его ID, но вот как бы сделать тоже самое, но при нажатий?
Можно конечно отлавливать последний ID разделителя где был наведён курсор, затем давать пользователю инструктаж о том что нужно навести и нажать Enter, но это костыль, причём из стружки.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Сам же спросил, и сам же отвечаю (часто такое бывает, когда посмотришь со стороны, и сразу виднее :laugh:smile:...

Код:
#include <GUIConstantsEx.au3>
#include <Timers.au3>
#include <GuiMenu.au3>
#include <WinAPIError.au3>
#include <WindowsConstants.au3>

Global Enum $e_idOpen = 1000, $e_idSeparator, $e_idInfo
Global $LAST_SEL_GRAYED = 0

Example()

Func Example()
    ; Create GUI
    Local $hGUI = GUICreate("Menu", 400, 300)
    GUISetState(@SW_SHOW)
	
	_Timer_SetTimer($hGUI, 10, '_Check_Clicked')
	
    ; Register message handlers
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUIRegisterMsg($WM_MENUSELECT, "WM_MENUSELECT")
	GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
    
    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>Example

Func _Check_Clicked($hWnd, $iMsg, $wParam, $lParam)
	If Not $LAST_SEL_GRAYED Then
		Return
	EndIf
	
	Local $aRet = DllCall("user32.dll", "short", "GetAsyncKeyState", "int", "0x1")
	
	If Not @error And BitAND($aRet[0], 0x8000) <> 0 Then
		DllCall("user32.dll", "int", "PostMessageW", "hwnd", $hWnd, "uint", $WM_COMMAND, 'wparam', $LAST_SEL_GRAYED, 'lparam', 0)
		$LAST_SEL_GRAYED = 0
	EndIf
EndFunc

; Handle WM_COMMAND messages
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Switch $wParam
        Case $e_idOpen
            _WinAPI_ShowMsg("Open")
		Case $e_idSeparator
			_WinAPI_ShowMsg("Separator")
		Case $e_idInfo
			_WinAPI_ShowMsg("Info")
    EndSwitch
EndFunc   ;==>WM_COMMAND

; Handle WM_MENUSELECT messages
Func WM_MENUSELECT($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    $iHi = BitShift($wParam, 16)
    $iLow = BitAND($wParam, 0xFFFF)
	
	If $iHi <> -1 And BitAND($iHi, $MF_GRAYED) Then
		$LAST_SEL_GRAYED = $iLow
		ToolTip('Separator hovered, ID: ' & $iLow)
	Else
		$LAST_SEL_GRAYED = 0
		ToolTip('')
	EndIf
EndFunc   ;==>WM_COMMAND

; Handle WM_CONTEXTMENU messages
Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Local $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Open", $e_idOpen)
	_GUICtrlMenu_AppendMenu($hMenu, $MF_SEPARATOR, $e_idSeparator, '')
   ; _GUICtrlMenu_InsertMenuItem($hMenu, 1, "", $e_idSeparator)
    _GUICtrlMenu_InsertMenuItem($hMenu, 2, "Info", $e_idInfo)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
    _GUICtrlMenu_DestroyMenu($hMenu)
    Return True
EndFunc   ;==>WM_CONTEXTMENU


Но это вроде тоже своего рода костыль.
 
Верх