Как я могу сделать окно дочернего процесса для появления модальным в моем процессе?

Вы должны использовать ключевое слово new при инициализации анимированных значений. Также ключевое слово const используется, когда назначенные значения никогда не меняются в течение его жизненного цикла. Пожалуйста, используйте переменную состояния для хранения анимируемых значений.

this.state = {
   demoData: [
    {
        number: new Animated.Value(60),
        color: '#0d2f51'
    },
    {
        number: new Animated.Value(20),
        color: '#28BD8B'
    },
    {
        number: new Animated.Value(20),
        color: '#F66A6A'
    }
  ];
}
8
задан kagali-san 8 November 2012 в 02:43
поделиться

5 ответов

EnableWindow корректен, это обычно, как окна сообщения и другие "модальные" окна делают это. Что касается изменения zorder, можно прервать сообщение WM_WINDOWPOSCHANGING и установить флаг SWP_NOZORDER для предотвращения изменения zorder. Удостоверьтесь, что Вы только делаете это, в то время как Вы - установка EnableWindow (ложь).

2
ответ дан 5 December 2019 в 15:26
поделиться

Давайте смотреть на Ваш подход № 3, который является очень близко к тому, что Вы хотите. Я подозреваю, что проблема состоит в том, что, когда вторичное приложение закрывается, Windows решает, что это не хочет восстанавливать фокус к отключенному окну. Вы могли попытаться повторно включить свое окно, прежде чем это произойдет, но это, вероятно, будет хитро (и не стоить усилия).

Вместо того, чтобы отключить окно непосредственно, попытайтесь отключить его, просто игнорируя ввод данных пользователем. Так вместо того, чтобы назвать EnableWindow, измените свой цикл сообщения для отфильтровывания входных сигналов. В частности, если

msg >= WM_KEYFIRST || msg <= WM_KEYLAST || msg >= WM_MOUSEFIRST || msg <= WM_MOUSELAST

затем отбросьте сообщение; иначе передайте его на нормальный цикл отправки. То, что Вы делаете, создает Ваше собственное отключенное окно, но Windows не знает это.

0
ответ дан 5 December 2019 в 15:26
поделиться

У Вас есть две вещи моделировать: владение и модальность.

Моделировать владение: необходимо установить владельца нового окна дочернего процесса к окну. Это должно облегчить любой z заказывающие проблемы. Хотя я не знаю, работает ли это от другого процесса. Если не затем Вам, возможно, придется присоединить Ваши входные очереди потока и затем назвать его. Или используйте некоторый другой метод инжекции кода.

SetWindowLong <target window handle>, GWL_HWNDPARENT, <new owner handle>

Для моделирования модальности я думаю, что Вы на правильном пути с EnableWindow и WaitForSingleObjectEx.

4
ответ дан 5 December 2019 в 15:26
поделиться

Просто логическое предложение,
Возможно, можно создать невидимую модальную форму, и от него используют метод № 1.

2
ответ дан 5 December 2019 в 15:26
поделиться

Короткий ответ - то, что нет никакого способа беспрепятственно сделать окно в потоке B модальным для окна в потоке A, даже если потоки находятся в том же процессе. При владении кодом для обоих окон Вы можете приближаться, но в этом случае Вы достигнете намного лучших результатов для усилия путем помещения всего UI в одном потоке.

При попытке намекнуть пользователю, что окно B потока модально для потока A, существует большой тонкий Z-порядок и поведения активации, в которых необходимо разобраться (как Вы заметили), чтобы Вы не переносите своего рода эффекта странной долины, где пользователю ясно, что окно B потока пытается быть чем-то, что это не и поэтому кажется поврежденным.

Чтобы избежать, чтобы, я проявил бы этот подход:

  1. Пользователь нажимает на "FDA Inspection" в главном окне canner.exe. canner.exe показывает модальное диалоговое окно, указывающее, что оно открывает внешнюю программу ("Открывающий Настройки Ботулизма..."). Это отключает главное окно, и т.д. так, чтобы пользователь знал, что модальное взаимодействие происходит.
  2. canner.exe называет ShellExecuteEx () для запуска botulism.exe.
  3. canner.exe называет WaitForInputIdle () на дескрипторе возвращенным из ShellExecuteEx (). WaitForInputIdle () возвратится (приблизительно, но обычно достаточно близко), когда botulsim.exe будет готов к взаимодействию с пользователем. Если botulism.exe обычно занимает пять или больше секунд для показа его UI, я могу использовать короткий тайм-аут с WaitforInputIdle () в цикле и иногда обрабатывать любые незаконченные сообщения с PeekMessage ()/ProcessMessage ().
  4. canner.exe изменяет его диалоговый текст, чтобы отразить, что он ожидает пользователя для закрытия botulism.exe ("Близкие Настройки Ботулизма для продолжения...").
  5. canner.exe называет MsgWaitForMultipleObjects () в цикле для ожидания до завершений botulsim.exe. MsgWaitForMultipleObjects () возвратится, когда дескрипторы передали, сообщены или когда существуют сообщения, ожидающие в очереди потока.
  6. Если пользователь нажимает рамку для закрытия в модальном диалоговом окне canner.exe, в то время как canner.exe ожидает, canner.exe предлагает пользователю, которого все еще выполняет botulism.exe ("Настройки ботулизма, все еще открыто, продолжите так или иначе?", "да, Я знаю" или "нет, я не сделан"). Если подтверждено, canner.exe закрывает диалоговое окно и отменяет исходный контроль FDA, запущенный на шаге 1, и возвращается к циклу сообщения главного окна.
  7. Когда MsgWaitForMultipleObjects () указывает, что botulism.exe закончен, canner.exe закрывает диалоговое окно и обычно продолжается контролем FDA, запущенным на шаге 1.

Таким образом, если все продолжается обычно и быстро, взаимодействие, может быть бесшовным, но если что-то пойдет не так, как надо с дочерним процессом, или Z-порядок изменяется, то и т.д. будет ясно, почему родительский процесс ожидает и что пользователь должен сделать, чтобы или отменить или продолжать задачу, которую он запустил.

3
ответ дан 5 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: