Вы должны использовать ключевое слово 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'
}
];
}
EnableWindow корректен, это обычно, как окна сообщения и другие "модальные" окна делают это. Что касается изменения zorder, можно прервать сообщение WM_WINDOWPOSCHANGING и установить флаг SWP_NOZORDER для предотвращения изменения zorder. Удостоверьтесь, что Вы только делаете это, в то время как Вы - установка EnableWindow (ложь).
Давайте смотреть на Ваш подход № 3, который является очень близко к тому, что Вы хотите. Я подозреваю, что проблема состоит в том, что, когда вторичное приложение закрывается, Windows решает, что это не хочет восстанавливать фокус к отключенному окну. Вы могли попытаться повторно включить свое окно, прежде чем это произойдет, но это, вероятно, будет хитро (и не стоить усилия).
Вместо того, чтобы отключить окно непосредственно, попытайтесь отключить его, просто игнорируя ввод данных пользователем. Так вместо того, чтобы назвать EnableWindow, измените свой цикл сообщения для отфильтровывания входных сигналов. В частности, если
msg >= WM_KEYFIRST || msg <= WM_KEYLAST || msg >= WM_MOUSEFIRST || msg <= WM_MOUSELAST
затем отбросьте сообщение; иначе передайте его на нормальный цикл отправки. То, что Вы делаете, создает Ваше собственное отключенное окно, но Windows не знает это.
У Вас есть две вещи моделировать: владение и модальность.
Моделировать владение: необходимо установить владельца нового окна дочернего процесса к окну. Это должно облегчить любой z заказывающие проблемы. Хотя я не знаю, работает ли это от другого процесса. Если не затем Вам, возможно, придется присоединить Ваши входные очереди потока и затем назвать его. Или используйте некоторый другой метод инжекции кода.
SetWindowLong <target window handle>, GWL_HWNDPARENT, <new owner handle>
Для моделирования модальности я думаю, что Вы на правильном пути с EnableWindow и WaitForSingleObjectEx.
Просто логическое предложение,
Возможно, можно создать невидимую модальную форму, и от него используют метод № 1.
Короткий ответ - то, что нет никакого способа беспрепятственно сделать окно в потоке B модальным для окна в потоке A, даже если потоки находятся в том же процессе. При владении кодом для обоих окон Вы можете приближаться, но в этом случае Вы достигнете намного лучших результатов для усилия путем помещения всего UI в одном потоке.
При попытке намекнуть пользователю, что окно B потока модально для потока A, существует большой тонкий Z-порядок и поведения активации, в которых необходимо разобраться (как Вы заметили), чтобы Вы не переносите своего рода эффекта странной долины, где пользователю ясно, что окно B потока пытается быть чем-то, что это не и поэтому кажется поврежденным.
Чтобы избежать, чтобы, я проявил бы этот подход:
Таким образом, если все продолжается обычно и быстро, взаимодействие, может быть бесшовным, но если что-то пойдет не так, как надо с дочерним процессом, или Z-порядок изменяется, то и т.д. будет ясно, почему родительский процесс ожидает и что пользователь должен сделать, чтобы или отменить или продолжать задачу, которую он запустил.