Я использую функцию SetWindowPos
для задачи автоматизации, чтобы показать окно. Я знаю, что есть два способа, которые предоставляет Windows, чтобы сделать это:SetWindowPos/ShowWindow с таймаутом
- Синхронно:
SetWindowPos
илиShowWindow
. - Асинхронно:
SetWindowPos
сSWP_ASYNCWINDOWPOS
илиShowWindowAsync
.
Теперь я хотел бы получить лучшее из обоих миров: я хочу иметь возможность показывать окно синхронно, потому что я хотел бы, чтобы это было сделано, когда функция возвращается. Но Я не хочу, чтобы вызов зависал мой процесс - если это занимает слишком много времени, я хочу, чтобы можно было прекратить вызов.
Теперь, когда вы ищете ответ, единственное, что я мог придумать, это использовать отдельный поток и использовать SendMessageTimeout
, но даже тогда, если зависает нить, я не могу сделать это, чтобы закончить его, кроме TerminateProcess
, что не является чистым решением.
Я также видел this answer, но, насколько я понимаю, у него нет альтернативы для собственного WinAPI.
Вы выдаете команду из потока, который имеет другую входную очередь, чем та, которая владеет окном? –
@AdrianMcCarthy да, и другой процесс. Цель - еще одна программа, в которой я не контролирую. – Paul
UI Automation (упомянутый в другом ответе, который вы связали) существует для собственных программ WinAPI. Это немного сложнее в использовании, потому что вы не получаете всю помощь во время работы с COM-объектами. Но если вы пытаетесь запустить другое приложение (особенно, которое вы не пишете), UI Automation - это, как правило, лучший способ. –