↑  ←  Описание функции


_GUICtrlMenu_MenuItemFromPoint

Определяет, какой пункт меню находится в указанных координатах.

#include <GuiMenu.au3>
_GUICtrlMenu_MenuItemFromPoint($hWnd, $hMenu [, $iX = -1 [, $iY = -1]])

Параметры

$hWnd Дескриптор окна, содержащего меню. Если это значение равно 0 и $hMenu represents a popup menu, the function will find the menu window.
$hMenu Дескриптор меню, содержащего пункты меню для теста нажатия
$iX [необязательный] X-координата. Если -1, то будет использоваться текущая X-координата мыши.
$iY [необязательный] Y-координата. Если -1, то будет использоваться текущая Y-координата мыши.

Возвращаемое значение

Успех:Возвращает позицию пункта меню, отсчёт от 0
Ошибка:Возвращает -1

Примечания

If $hMenu specifies a menu bar the coordinates are window coordinates. Otherwise, they are client coordinates.

См. также

Искать MenuItemFromPoint в библиотеке MSDN

Пример

#include <GuiMenu.au3>

_Main()

Func _Main()
    Local $hWnd, $hMain, $hFile, $tRect, $tPoint, $iX, $iY, $iIndex

    ; Запуск блокнота
    Run("notepad.exe")
    $hWnd = WinWaitActive("[CLASS:Notepad]")
    $hMain = _GUICtrlMenu_GetMenu($hWnd)
    $hFile = _GUICtrlMenu_GetItemSubMenu($hMain, 0)

    ; Открывает меню "Файл"
    ; Send("!f") ; Alt+F
    Send("!Ф") ; Alt+Ф (в русской локализации)
    Sleep(1000)

    ; Перемещает мышь на пункт меню "Открыть"
    $tRect = _GUICtrlMenu_GetItemRectEx($hWnd, $hFile, 1)
    $tPoint = _Lib_PointFromRect($tRect, True)
    _Lib_GetXYFromPoint($tPoint, $iX, $iY)
    MouseMove($iX, $iY, 1)
    Sleep(1000)

    ; Получает пункт меню от текущего положения мыши
    $iIndex = _GUICtrlMenu_MenuItemFromPoint($hWnd, $hFile)
    Send("{ESC 2}")
    Writeln("Пункт меню под курсором: " & $iIndex)

EndFunc   ;==>_Main

; Записывает строку текста в блокнот
Func Writeln($sText)
    ControlSend("[CLASS:Notepad]", "", "Edit1", $sText & @CR)
EndFunc   ;==>Writeln

Func _Lib_PointFromRect(ByRef $tRect, $fCenter = True)
    Local $iX1, $iY1, $iX2, $iY2, $tPoint

    $iX1 = DllStructGetData($tRect, "Left")
    $iY1 = DllStructGetData($tRect, "Top")
    $iX2 = DllStructGetData($tRect, "Right")
    $iY2 = DllStructGetData($tRect, "Bottom")
    If $fCenter Then
        $iX1 = $iX1 + (($iX2 - $iX1) / 2)
        $iY1 = $iY1 + (($iY2 - $iY1) / 2)
    EndIf
    $tPoint = DllStructCreate($tagPOINT)
    DllStructSetData($tPoint, "X", $iX1)
    DllStructSetData($tPoint, "Y", $iY1)
    Return $tPoint
EndFunc   ;==>_Lib_PointFromRect

Func _Lib_GetXYFromPoint(ByRef $tPoint, ByRef $iX, ByRef $iY)
    $iX = DllStructGetData($tPoint, "X")
    $iY = DllStructGetData($tPoint, "Y")
EndFunc   ;==>_Lib_GetXYFromPoint