Как указано в документации на MSDN :
Функция не будет работать в следующих ситуациях:
- [...]
- Если поток не является владельцем окна.[...]
Таким образом, здесь нет «основного» обсуждаемого потока (AFAIK Win32Api не заботится о том потоке ведьмы, в котором выполняется точка входа вашей программы).
Единственное условие - вы должны выполнить AnimateWindow в потоке, которому принадлежит окно, которое вы анимируете.Это тот, который вызывал CreateWindow , так как это функция, определяющая бесконечность потока / цикла сообщений).
- Большую часть времени, как сказал Джон, этот поток должен запускатьцикл сообщений, созданный Application.Run .Из другого потока вы можете использовать метод Control.Invoke , чтобы заставить основной поток выполнить код.Если у вас нет ссылки Control, просто создайте ее в основном потоке и вызовите ее CreateHandle метод.Если у вас есть основная форма, просто используйте ее
- Цикл сообщений также можно создать по-старому, особенно если вы все равно уже создали свое окно с помощью PInvoke.Основной поток должен иметь стандартный цикл PeekMessage , ожидающий по крайней мере WM_QUIT и WM_EXECUTE_ANIMATE_WINDOW, которые вы определяете.Вторичный поток, представляющий это сообщение через PostMessage или PostThreadMessage.
Теперь, когда вы опубликовали свой пример кода, проблема, с которой вы столкнетесь, заключается в том, что вы не пытаетесь анимировать только любое окно ...но вы пытаетесь анимировать само окно консоли ... И вы не в потоке его владельца (иначе он не обновится, когда вы создадите бесконечный цикл в вашем приложении) ... поэтому вызов AnimateWindow будет невозможенза исключением случаев, когда вам удается принудительно заставить окна выполнять код в этом потоке.
Тот факт, что окна консоли фактически принадлежат CSRSS, ведь системный процесс, выполняющийся с повышенными правами, делает в любом случае очень опасным взаимодействие с ними.
Поскольку Windows Vista даже не может отправить сообщение в такие окна из-за защиты процесса, поэтому любая уязвимость, которая могла быть использована ранее для принудительного выполнения этого потока для выполнения кода, теперь должна быть непригодной.
Для получения подробной информации оСпецифика консольного окна смe Почему консольные окна не предназначены для Windows XP? сообщение в блоге Рэймонда Чена (из команды Microsoft Windows Shell, так что в значительной степени из источника)