Что нового

Локализация оконных событий только для дочернего окна

lacoil

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

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

Код:
#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
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Добавляйте в названия окон какие-нибудь уникальные невидимые символы, например #160, и фильтруте по ним.
 
Автор
L

lacoil

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

musicstashall

Знающий
Сообщения
322
Репутация
7
Тоже столкнулся с необходимостью получить событие дочернего окна. Имею событие открытия окна и получаю имя его процесса, как в диспетчере задач:
Код:
Func hookproc($hwnd, $msg, $wparam, $lparam)
	Switch $wparam
		Case $hshell_windowcreated			
			MsgBox()
		Case $hshell_windowactivated
	EndSwitch
EndFunc


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

Alofa

Гость
Это можно все реализовать и при помощи штатного обработчика.
Код:
#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
 
Верх