потерял фокус после того, как окно другого приложения стало верхним - PullRequest
0 голосов
/ 23 октября 2008

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

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

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);

Ответы [ 3 ]

2 голосов
/ 23 октября 2008

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

2 голосов
/ 23 октября 2008

Похожие: Неожиданное поведение Process.MainWindowHandle

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

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

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

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

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

0 голосов
/ 28 октября 2008

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

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

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

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

...