Что нового

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

CreatoR

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

Пример:

Код:
#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 470
Репутация
2 401
Сам же спросил, и сам же отвечаю (часто такое бывает, когда посмотришь со стороны, и сразу виднее :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


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