Функция WM_SYSCOMMAND

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


WM_SYSCOMMAND

Сообщение выполняется при клике по заголовку, границам окна, нажатии на системные кнопки свернуть, развернуть, восстановить, закрыть.

Параметры

Указанные параметры передаются системой.
$wParam Код события
    младшее слово = код события
    старшее слово = 0
$lParam Двойное слово содержит координаты мыши:
    младшее слово = X - координата мыши относительно экрана
    старшее слово = Y - координата мыши относительно экрана

Примечания

Смотрите функцию GUIRegisterMsg.

Пример

; http://www.autoitscript.com/forum/topic/29735-wm-syscommand/page__hl__0xf180__fromsearch__1
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $k = 0

Global $assot[30][2] = [ _
[0xF000, 'Размер'], _ ; в системном меню
[0xF001, 'Левая грань'], _
[0xF002, 'Правая грань'], _
[0xF003, 'Верхняя грань'], _
[0xF004, 'Левый верхний угол'], _
[0xF005, 'Правый верхний угол'], _
[0xF006, 'Нижняя грань'], _
[0xF007, 'Левый нижний угол'], _
[0xF008, 'Правый нижний угол'], _
[0xF010, 'Переместить'], _ ; в системном меню
[0xF012, 'Клик по заголовку'], _
[0xF020, 'Кнопка Свернуть'], _
[0xF030, 'Кнопка Развернуть'], _
[0xF032, 'Развернуть на весь экран двойным кликом по заголовку'], _
[0xF040, '$SC_NEXTWINDOW'], _
[0xF050, '$SC_PREVWINDOW'], _
[0xF060, 'Кнопка Закрыть'], _
[0xF070, '$SC_VSCROLL'], _
[0xF090, '$SC_MOUSEMENU'], _
[0xF093, 'Системное меню'], _
[0xF095, 'Главное меню'], _
[0xF100, 'Горячая клавиша с Alt'], _
[0xF120, 'Кнопка восстановить'], _
[0xF122, 'Восстановление двойным кликом по заголовку'], _
[0xF130, '$SC_TASKLIST'], _
[0xF140, '$SC_SCREENSAVE'], _
[0xF150, '$SC_HOTKEY'], _
[0xF160, '$SC_DEFAULT'], _
[0xF170, '$SC_MONITORPOWER'], _
[0xF180, 'Кнопка Вопрос']]

; Global Const $SC_CLOSE = 0xF060 ; константы WM_SYSCOMMAND
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
$Gui = GUICreate("WM_SYSCOMMAND", 440, 170, -1, -1, $WS_OVERLAPPEDWINDOW)
$iFileMenu = GUICtrlCreateMenu("&Файл")
$iFileItem = GUICtrlCreateMenuItem("Открыть", $iFileMenu)

GUICtrlCreateLabel('Функция WM_SYSCOMMAND выполняется при клике по заголовку, границам окна, нажатии на системные кнопки свернуть, развернуть, восстановить, закрыть.', 5, 5, 430, 51)
$data = GUICtrlCreateLabel('.' & @CRLF & @CRLF & '', 5, 65, 430, 100)
GUISetState()

While 1
    Sleep(100000)
WEnd

Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID, $MouseX, $MouseY, $info_ID, $Hex_ID

    ; Координаты мыши относительно экрана монитора.
    $MouseX = BitAND($lParam, 0x0000FFFF) ; _WinAPI_LoWord
    $MouseY = BitShift($lParam, 16) ; _WinAPI_HiWord
   
    $iID = BitAND($wParam, 0xFFFF)

    $k += 1
    For $i = 0 To 29
        If $iID = $assot[$i][0] Then
            $info_ID = $assot[$i][1]
            ExitLoop
        EndIf
    Next
    $Hex_ID = Hex(Int($iID), 4)
    If Not $info_ID Then $info_ID = $Hex_ID
    WinSetTitle($Gui, '', 'Вызов ' & $k & ' раз, ' & $info_ID)
   
    GUICtrlSetData($data, 'Событие - ' & $info_ID & @CRLF & _
        'ID - ' & $Hex_ID & @CRLF & _
        'X -координата мыши = ' & $MouseX & @CRLF & _
        'Y -координата мыши = ' & $MouseY)
   
    ; условие разрешает изменять размер только по горизонтали.
    Switch $iID
        ;если добавить 0xF001 и 0xF002, то запрещает по горизонтали
        Case 0xF003, 0xF004, 0xF005, 0xF006, 0xF007, 0xF008
            Return 0
    EndSwitch
   
    If $iID = 0xF150 Then MsgBox(0, 'Сообщение', '$SC_HOTKEY')
    If $iID = 0xF060 Then Exit
    Return $GUI_RUNDEFMSG
EndFunc