Что нового

[Окна, Диалоги] Отследить выбор любого пукта меню

damien2008

Осваивающий
Сообщения
178
Репутация
34
Всем добрый день. Прошу помочь...
Есть пример создания дополнительного меню.
Когда создается новое меню полностью, то выбор пункта отслеживается; попробовал добавить пункт "1212". Он не отслеживается.
Как отловить нажатие на добавляемом пункте; или вообще любое выбранное?
Код:
#cs ------------------------------------------------------------------------
    Версия AutoIt:  3.3.12.0
    Автор:          myName
    Описание:       Шаблон программы на языке AutoIt
#ce ------------------------------------------------------------------------

; Код программы

#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
HotKeySet('{ESC}', '_OnExit')

Global $hWnd, $hMenu, $sCurrent_Item  = ""
;Global $idNew = 0x5000
Global $mnu = '1212'
Global $sub
; Set menu text and CmdIds
Global $aCmdID[4][2] = [ _
    ["Item &1", 0x2000], _
    ["Item &2", 0x2100], _
    ["Item &3", 0x2200], _
    ["Item &4", 0x2300]]
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
; Insert menu into Notepad
_InsertMenu()

; Open DLL for IsPressed
$dll = DllOpen("user32.dll")

While 1

    ; Check status of Notepad menubar
    $aInfo = _GUICtrlMenu_GetMenuBarInfo($hWnd)

    ; If menu is active
    If $aInfo[6] = True Then
        ; Run through our added items to see if they are active
        $sCurrent_Item = ""
        For $i = 0 To 3
            If _GUICtrlMenu_GetItemHighlighted($hMenu, $aCmdID[$i][1], False) Then
                ; If active, get text
                If $aCmdID[$i][0] <> $sCurrent_Item Then $sCurrent_Item = $aCmdID[$i][0]
            EndIf
        Next

		If _GUICtrlMenu_GetItemHighlighted($hMenu, $mnu, False) Then $sCurrent_Item = '1212 Нажат?'
    EndIf

    ; If one of our menu items was selected
    If $sCurrent_Item <> "" Then
        ; If mouse clicked or Enter pressed
        If _IsPressed("01", $dll) Or _IsPressed("0D", $dll) Then
            ; This is where you do what the selection is there for!!!!!!!!!
            ConsoleWrite("You selected " & $sCurrent_Item & @CRLF)
            ; Prevent "double tap"
            $sCurrent_Item = ""
            ; Wait until mouse/Enter released
            While _IsPressed("0D", $dll) Or _IsPressed("01", $dll)
                Sleep(10)
            WEnd
        EndIf
    EndIf

    Sleep(10)

    ; Exit if Notepad is closed
    If Not WinExists("[CLASS:Notepad]") Then _OnExit()

WEnd

Func _InsertMenu()

    Local $hItem1, $hItem2

    ; Open Notepad
    Run("Notepad.exe")
    WinWaitActive("[CLASS:Notepad]")
    $hWnd = WinGetHandle("[CLASS:Notepad]")
    $hMenu = _GUICtrlMenu_GetMenu($hWnd)

    ; Create menu
    $hItem2 = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hItem2, 0, $aCmdID[0][0], $aCmdID[0][1])
    _GUICtrlMenu_InsertMenuItem($hItem2, 1, $aCmdID[1][0], $aCmdID[1][1])
    _GUICtrlMenu_InsertMenuItem($hItem2, 2, "", 0)
    _GUICtrlMenu_InsertMenuItem($hItem2, 3, $aCmdID[2][0], $aCmdID[2][1])
    _GUICtrlMenu_InsertMenuItem($hItem2, 4, $aCmdID[3][0], $aCmdID[3][1])

    ; Insert new menu into Notepad
    _GUICtrlMenu_InsertMenuItem($hMenu, 6, "&AutoIt", 0, $hItem2)
	;_GUICtrlMenu_AppendMenu ($hHelp, $MF_STRING, $idAbout, 'О программе')
	;_GUICtrlMenu_AppendMenu('Файл', $MF_STRING, 'Файл1', 'О программе5')
	$sub = _GUICtrlMenu_GetItemSubMenu($hMenu, 0)
	_GUICtrlMenu_AddMenuItem($sub, $mnu, 0)
	;_GUICtrlMenu_InsertMenuItem($hMenu, 0, "123", 0, $hItem2)
    _GUICtrlMenu_DrawMenuBar($hWnd)

EndFunc   ;==>_Insertmenu

Func _OnExit()

    DllClose($dll)
    Exit
EndFunc


Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
	#forceref $hWnd, $iMsg, $ilParam
	Switch _WinAPI_LoWord ($iwParam)
		Case $sub
			ConsoleWrite("Новый" & @CRLF)
;~ 		Case $idOpen
;~ 			MemoWrite("Открыть")
;~ 		Case $idSave
;~ 			MemoWrite("Сохранить")
;~ 		Case $idExit
;~ 			Exit
;~ 		Case $idCut
;~ 			MemoWrite("Вырезать")
;~ 		Case $idCopy
;~ 			MemoWrite("Копировать")
;~ 		Case $idPaste
;~ 			MemoWrite("Вставить")
;~ 		Case $idAbout
;~ 			MemoWrite("О программе")
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Посмотрите в новой английской справке (или в справке по WinAPIEx) пример к функции
Код:
_WinAPI_SetWinEventHook()
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
damien2008,

При создании пункта, Вам необходимо указать его id (например 1111).

Код:
_GUICtrlMenu_AddMenuItem($sub, $mnu, 1111)


А потом проверять не название пункта, а его id

Код:
If _GUICtrlMenu_GetItemHighlighted($hMenu, 1111, False) Then $sCurrent_Item = '1212 Нажат?'
 
Верх