потерял фокус после того, как окно другого приложения стало верхним

StackOverflow https://stackoverflow.com/questions/230337

Вопрос

Я делаю окно другого приложения самым верхним, чтобы убедиться, что щелчок в моем приложении выводит диалог другого приложения в представления. Проблема в том, что после звонка я не могу сосредоточиться на своем приложении. Если у другого приложения больше окон, одно из них заканчивается фокусом, и в противном случае ни одно окно (только на панели задач) не получает фокус. С чего мне начать расследование проблемы?

Мой код для создания другого приложения:

Process p = Process.GetProcessById(trackedProcessID);
IntPtr h = p.MainWindowHandle;
uint TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE | SWP_ASYNCWINDOWPOS;
SetWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);

с константами в виде

public static readonly uint SWP_NOMOVE = 0x0002;
public static readonly uint SWP_NOSIZE = 0x0001;
public static readonly uint SWP_ASYNCWINDOWPOS = 0x4000;
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
Это было полезно?

Решение

Связанные: Неожиданное поведение Process.MainWindowHandle

В основном MainWindowHandle предоставляет текущее самое верхнее окно процесса, несмотря на то, что говорится в документации.

Это объясняет, почему главное окно вашего другого процесса не обязательно фокусируется.

Ваша другая проблема заключается в том, что вы не возвращаете фокус на свое приложение после его передачи.

На самом деле, правильный термин для того, что вы делаете, устанавливает z-порядок .

Вместо того, чтобы пытаться контролировать z-порядок - что не может быть гарантировано - вам лучше отправлять сообщения другому процессу.

Другие советы

Вы пробовали SWP_NOACTIVATE?

[Фактическое решение использовано]

Пока что я собираюсь отправить дескриптор окна вызывающего окна целевому приложению и заставить его вернуть его наверх, когда закончите. Это настоящая боль, так как у меня будет ~ 50 окон, но она кажется стабильной. Следующий подход, если окажется, что возникнут проблемы, - это перезвонить вызывающему приложению и попросить его выдвинуть окно на передний план, но я бы предпочел не делать этого, поскольку он дает возможность пользователю что-то сделать для вызывающее приложение, когда сообщение находится в процессе передачи (проблема только в том случае, если по одному и тому же транспортному протоколу поступает много сообщений), что вполне может произойти

Не пытайтесь использовать дескриптор входящего окна и установить родительский элемент любого окна, показанного в целевом приложении, на этот дескриптор, он только отображает диалоговое окно в границах вызывающего окна приложения и обрезается при необходимости - бесполезно

Большое спасибо за ответы выше на вопрос

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top