Автор Тема: Локализация оконных событий только для дочернего окна  (Прочитано 2837 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн lacoil [?]

  • Новичок
  • *
  • Сообщений: 9
  • Репутация: 1
    • Награды
В приложении есть два окна (второе окно - дочернее к первому).
В основном теле скрипта зарегистрировал реакцию для события GUIRegisterMsg($WM_LBUTTONDOWN, "FN_CUSTOM")
При отработке скрипта событие WM_LBUTTONDOWN обрабатывается как для дочернего, так и для родительского окна

Нужно сделать реакцию на событие только для дочернего окна. Как это можно сделать?
Фильтровать по хендлу окон (как в примере ниже) не вариант - в моей программе окна создаются динамически и сравнить хендлы достаточно неудобно и не красиво.

Код: AutoIt [Выделить]
#include <WindowsConstants.au3>

Global $GUI_NAME = "test"

$hDlg = GUICreate($GUI_NAME, 400, 400, -1, -1, -1)
$hcDlg = GUICreate('Accept', 200, 200, -1, - 1, -1, -1, $hDlg)
GUIRegisterMsg($WM_LBUTTONDOWN, "FN_CUSTOM")

GUISetState(@SW_SHOW, $hDlg)
GUISetState(@SW_SHOW, $hcDlg)

while 1
    Sleep(50)
WEnd

    Func FN_CUSTOM($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    $fFuncName = '! '
    ConsoleWrite($fFuncName & " $hWnd = " & $hWnd & @CRLF)
    Switch $hWnd
        case $hDlg
                ConsoleWrite($fFuncName & " MAIN" & @CRLF)

        Case $hcDlg
                ConsoleWrite($fFuncName & " Child" & @CRLF)
    EndSwitch
EndFunc
 


Русское сообщество AutoIt


Помечен как лучший ответ пользователем lacoil Отправлен Февраль 12, 2016, 14:42:48

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Добавляйте в названия окон какие-нибудь уникальные невидимые символы, например #160, и фильтруте по ним.


Думай, прежде чем говорить.

Оффлайн lacoil [?]

  • Новичок
  • *
  • Сообщений: 9

  • Автор темы
  • Репутация: 1
    • Награды
Добавляйте в названия окон какие-нибудь уникальные невидимые символы, например #160, и фильтруте по ним.
Все гениальное просто :)
Для меня решение вполне приемлемое, спасибо :beer:

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 99
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Тоже столкнулся с необходимостью получить событие дочернего окна. Имею событие открытия окна и получаю имя его процесса, как в диспетчере задач:
Код: AutoIt [Выделить]
Func hookproc($hwnd, $msg, $wparam, $lparam)
    Switch $wparam
        Case $hshell_windowcreated         
            MsgBox()
        Case $hshell_windowactivated
    EndSwitch
EndFunc
 


Но мне так же необходимо получать и дочерние окна, если открываются. Окажите помощь, плиз)

Русское сообщество AutoIt

Re: Локализация оконных событий только для дочернего окна
« Ответ #3 Отправлен: Апрель 18, 2017, 15:56:04 »

Оффлайн Alofa [?]

  • Скриптер
  • ****
  • Сообщений: 1076
  • Репутация: 146
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Это можно все реализовать и при помощи штатного обработчика.
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>

Local $hGUI, $iBatton, $aMsg, $k, $aGUIChild[0][8]
$hGUI = GUICreate('Основное Окно', 400, 300)
$iBatton = GUICtrlCreateButton('Создать Дочернее окно', 100, 125, 200, 50)
GUISetState()

While 1
    $aMsg = GUIGetMsg(1)
    Switch $aMsg[1]
        Case $hGUI
            Switch $aMsg[0]
                Case $GUI_EVENT_CLOSE
                    ExitLoop
                Case $iBatton
                    _NewGUICreate($hGUI)
            EndSwitch
        Case Else
            For $i = 0 To UBound($aGUIChild) - 1
                If $aMsg[1] = $aGUIChild[$i][0] Then
                    Switch $aMsg[0]
                        Case $GUI_EVENT_CLOSE
                            GUIDelete($aMsg[1])
                        Case Else
                            For $j = 1 To 7
                                If $aMsg[0] = $aGUIChild[$i][$j] Then _
                                MsgBox(262144+64, Default, 'Нажата кнопка ' & GUICtrlRead($aMsg[0]) & @LF & '(' & WinGetTitle($aMsg[1]) & ')')
                            Next
                    EndSwitch
                EndIf
            Next
    EndSwitch
WEnd

Func _NewGUICreate($hWnd)
    $k += 1
    Local $iUb = UBound($aGUIChild)
    ReDim $aGUIChild[$iUb + 1][8]
    Local $iElements = Random(1, 7, 1)
    $aGUIChild[$iUb][0] = GUICreate('Дочернее Окно ' & $k, 300, 250, -1, -1, -1, -1, $hWnd)
    GUISetBkColor(Random(0x7863FF, 0xD45F5F, 1))
    For $i = 1 To $iElements
        $aGUIChild[$iUb][$i] = GUICtrlCreateButton('Кнопка ' & $i, 5 + ($i * 25), 10 + ($i * 28))
    Next
    GUISetState()
EndFunc   ;==>_NewGUICreate


Русское сообщество AutoIt

Re: Локализация оконных событий только для дочернего окна
« Ответ #4 Отправлен: Апрель 19, 2017, 02:39:34 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
15 Ответов
8257 Просмотров
Последний ответ Февраль 24, 2010, 19:27:11
от snoitaleR
4 Ответов
4826 Просмотров
Последний ответ Июль 11, 2010, 14:12:32
от Garrett
4 Ответов
4711 Просмотров
Последний ответ Август 16, 2010, 16:24:37
от XpycT
8 Ответов
3173 Просмотров
Последний ответ Апрель 28, 2012, 00:49:45
от running-frag
41 Ответов
10376 Просмотров
Последний ответ Июль 31, 2012, 03:09:32
от CreatoR
8 Ответов
3421 Просмотров
Последний ответ Апрель 16, 2013, 17:40:26
от McLotos
14 Ответов
9650 Просмотров
Последний ответ Июль 29, 2013, 01:29:10
от AZJIO
14 Ответов
5058 Просмотров
Последний ответ Март 25, 2014, 20:22:15
от madmasles
1 Ответов
1322 Просмотров
Последний ответ Июнь 11, 2014, 15:01:14
от madmasles
2 Ответов
843 Просмотров
Последний ответ Август 02, 2016, 12:49:08
от wasd