Что нового

Обход проблемы с GUICtrlSendToDummy в скрытое GUI

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,484
Как известно, GUICtrlSendToDummy не работает для скрытого GUI, вот пример показывающий это:

Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate('')
$iDummy = GUICtrlCreateDummy()
;~ GUISetState()

GUICtrlSendToDummy($iDummy)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iDummy
			MsgBox(64, 'Title', 'Dummy')
	EndSwitch
WEnd


А вот так можно это обойти:

Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate('')

$iDummy = _GUICtrlCreateDummyEx($hGUI)
GUICtrlSendToDummy($iDummy)

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iDummy
			MsgBox(64, 'Title', 'Dummy')
	EndSwitch
WEnd

Func _GUICtrlCreateDummyEx($hGUI)
	Local $hDummy_GUI, $iDummy
	
	$hDummy_GUI = GUICreate('', 5, 5, -10, -10)
	GUISetState(@SW_SHOWNOACTIVATE, $hDummy_GUI)
	WinSetState($hDummy_GUI, '', @SW_HIDE)
	$iDummy = GUICtrlCreateDummy()
	GUISwitch($hGUI)
	
	Return $iDummy
EndFunc


Идея в том, чтобы создать Dummy в другом GUI, которое скрывается используя WinSetState вместо GUISetState.

P.S
Данное поведение намеренное, об этом есть комментарии в старом исходном коде AutoIt:

Код:
// If the GUI is hidden then we don't want to trigger any messages because we may be modifiying things
 // via the script when hidden

Странно что это не упоминается в справке (AZJIO? :whistle:smile:.
Открыл тикет по теме.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
CreatoR
Можно и так но окно появляется на какое то время
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$GUI = GUICreate("", 615, 437)
$Dumm = GUICtrlCreateDummy()
GUISetState(@SW_SHOW);если закоментировать эту строку то Dummy ничего не отсылается
WinSetState($GUI,'',@SW_HIDE)
GUICtrlSendToDummy($Dumm)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Dumm
			MsgBox(0,'','',0,$GUI)
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,484

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
CreatoR [?]
Странно что это не упоминается в справке
Так я исходники не читаю. Хотя на сколько полезна идея, ведь придётся и пример добавлять в справку.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Или можно не скрывать окно,а делать полностью прозрачным.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,484
AZJIO [?]
Так я исходники не читаю
Я тоже их особо то и не читал, но столкнувшись с проблемой, начал искать решение на оф. форуме (у нас это вроде не поднималось), и кроме решения, нашёл и причину.

на сколько полезна идея, ведь придётся и пример добавлять в справку
Я имел в виду что в справке должно быть упоминание этого ограничения.
А идея полезная, Dummy часто требуется вызывать из трея, например для предотвращения повторного кода (хотя можно обойтись польз. функциями, но это лишь один пример).
 
Верх