Автор Тема: Обход проблемы с GUICtrlSendToDummy в скрытое GUI  (Прочитано 3227 раз)

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Как известно, GUICtrlSendToDummy не работает для скрытого GUI, вот пример показывающий это:

Код: AutoIt [Выделить]
#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


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

Код: AutoIt [Выделить]
#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:

Код: (C++) [Выделить]
  1. // If the GUI is hidden then we don't want to trigger any messages because we may be modifiying things
  2.  // via the script when hidden

Странно что это не упоминается в справке (AZJIO? :whistle:).
Открыл тикет по теме.
« Последнее редактирование: Октябрь 08, 2013, 00:13:08 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

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

Обход проблемы с GUICtrlSendToDummy в скрытое GUI
« Отправлен: Октябрь 07, 2013, 23:50:45 »

Оффлайн MnM [?]

  • SoSerious
  • Продвинутый
  • ***
  • Сообщений: 679
  • Репутация: 90
  • Пол: Мужской
  • Post-Hardcore
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Обход проблемы с GUICtrlSendToDummy в скрытое GUI
« Ответ #1, Отправлен: Октябрь 08, 2013, 05:55:42 »
CreatoR
Можно и так но окно появляется на какое то время
Код: AutoIt [Выделить]
#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 [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Обход проблемы с GUICtrlSendToDummy в скрытое GUI
« Ответ #2, Отправлен: Октябрь 08, 2013, 10:24:20 »
MnM  [?]
Цитировать
Можно и так
Нельзя.
Будут проблемы с другими функциями (из за скрытия используя WinSetState вместо GUISetState).

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2725
  • Репутация: 1140
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: Обход проблемы с GUICtrlSendToDummy в скрытое GUI
« Ответ #3, Отправлен: Октябрь 08, 2013, 12:19:28 »
CreatoR  [?]
Цитировать
Странно что это не упоминается в справке
Так я исходники не читаю. Хотя на сколько полезна идея, ведь придётся и пример добавлять в справку.

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

Re: Обход проблемы с GUICtrlSendToDummy в скрытое GUI
« Ответ #3 Отправлен: Октябрь 08, 2013, 12:19:28 »

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Обход проблемы с GUICtrlSendToDummy в скрытое GUI
« Ответ #4, Отправлен: Октябрь 08, 2013, 15:25:00 »
Или можно не скрывать окно,а делать полностью прозрачным.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Обход проблемы с GUICtrlSendToDummy в скрытое GUI
« Ответ #5, Отправлен: Октябрь 08, 2013, 15:41:07 »
AZJIO  [?]
Цитировать
Так я исходники не читаю
Я тоже их особо то и не читал, но столкнувшись с проблемой, начал искать решение на оф. форуме (у нас это вроде не поднималось), и кроме решения, нашёл и причину.

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

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

Re: Обход проблемы с GUICtrlSendToDummy в скрытое GUI
« Ответ #5 Отправлен: Октябрь 08, 2013, 15:41:07 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
18 Ответов
21569 Просмотров
Последний ответ Ноябрь 20, 2014, 14:29:02
от Crusaderman
8 Ответов
5594 Просмотров
Последний ответ Июнь 20, 2010, 01:29:55
от Garrett
1 Ответов
5465 Просмотров
Последний ответ Май 04, 2011, 01:00:19
от CreatoR
19 Ответов
23229 Просмотров
Последний ответ Ноябрь 03, 2015, 02:23:08
от Skif_off
12 Ответов
7583 Просмотров
Последний ответ Сентябрь 19, 2011, 12:13:28
от Trans
30 Ответов
8044 Просмотров
Последний ответ Май 22, 2013, 02:21:06
от AZJIO
2 Ответов
1832 Просмотров
Последний ответ Октябрь 21, 2013, 15:28:57
от hfnter
6 Ответов
1686 Просмотров
Последний ответ Май 25, 2015, 23:32:33
от Авдей
2 Ответов
802 Просмотров
Последний ответ Сентябрь 30, 2016, 22:40:01
от Skif_off
12 Ответов
1887 Просмотров
Последний ответ Декабрь 27, 2016, 14:36:28
от joiner