У меня есть приложение формы Windows, которое должно быть TopMost. Я установил свою форму как TopMost, и мое приложение работает так, как мне хотелось бы, за исключением одного случая.
Существует стороннее приложение (называемое player.exe), которое отображает файлы фильмов SWF на той части экрана, которая всплывает поверх моего приложения.
С помощью Process Monitor я определил, что приложение player.exe вызываетflash.exe <PositionX> <PositionY> <Width> <Height> <MovieFile>
в моем случае:flash.exe 901 96 379 261 somemovie.swf
Поскольку flash.exe создается в новом процессе после того, как моя форма была установлена на TopMost, он появляется поверх моего приложения.
Первое, что я сделал, это заставил мое приложение минимизировать главное окно приложения player.exe, надеясь, что это предотвратит появление Flash. Но, к сожалению, это не так... даже когда окно свернуто, всякий раз, когда запускается флэш-ролик, оно отображается в месте расположения пикселя (901,96). Затем я попытался создать таймер, чтобы устанавливать для свойства form.TopMost значение true каждые 10 мс. Это работает, но вы все еще видите очень быстрое изображение swf-файла.
Есть ли какой-либо тип вызова Windows API, который можно использовать для временного запрета player.exe создавать видимые дочерние процессы? Признаюсь, это звучит немного надуманно. Но любопытно, сталкивался ли кто-нибудь с подобной проблемой.
Приложение:
Это дополнение должно дать ответ на некоторые предложения, изложенные в сообщении Мэтью ниже.
Для чрезвычайной ситуации, описанной в комментариях, я бы рассмотрел возможные решения в следующих направлениях:
1) Как обычно запускается и останавливается стороннее приложение? Могу ли я закрыть его таким же образом? Если это служба, диспетчер управления службами может ее остановить. Если это обычное приложение, отправка управляющего нажатия клавиши (возможно, с помощью SendInput()) или сообщения WM_CLOSE в его главное окно может работать.
Самый простой способ закрыть приложение — нажать CTRL-ALT-DEL, а затем завершить процесс. -ИЛИ- Правильный способ - удерживать ESC, нажимая левую кнопку мыши... затем введите свое имя пользователя и пароль, перейдите в некоторые меню, чтобы остановить проигрыватель.
Команды PAUSE нет... хотите верьте, хотите нет.
Я не думаю, что использование WM_CLOSE поможет, так как сворачивание приложения не поможет. Это также убьет процесс? Если нет, то как открыть заново.
2) Если я не могу закрыть его красиво, могу ли я его убить? Если это так, TerminateProcess() должен работать.
Я не могу убить процесс по двум причинам. 1) При перезапуске вам необходимо указать учетные данные имени пользователя/пароля... Может быть способ обойти это, так как он не запрашивает, когда машина перезагружается, но... 2) Всякий раз, когда я убиваю процесс в диспетчере задач < strong>он не умирает изящно и спрашивает, хотите ли вы отправить отчет об ошибке.
3) Если мне абсолютно необходимо оставить другой процесс запущенным, я попытаюсь посмотреть, смогу ли я программно вызвать быстрое переключение пользователей, чтобы перейти к другому сеансу (в котором не будет конкурирующих окон). Я не знаю, с чего в API начать с этого. (Питер Рудерман предлагает SwitchDesktop() для этой цели в своем ответе.)
Меня очень вдохновила эта идея... Я нашел эту статью на сайте CodeProject. который предоставляет множество методов API-оболочки. Я прекратил его реализацию, потому что я думаю, что для того, чтобы рабочий стол работал, у вас должен быть запущен explorer.exe (чего у меня нет).
EDIT2: Если подумать... может быть, explorer.exe не нужен. Я попробую и отчитаюсь.
Edit3: не удалось заставить работать код в этой статье. Придется отложить это на мгновение.
Резюме ответа
Как и следовало ожидать, простого ответа на эту проблему не существует. Лучшим решением было бы проблематично переключиться на другой рабочий стол, когда вам нужно гарантировать, что на нем ничего не появится. Мне не удалось найти простую реализацию переключения рабочих столов на C#, которая работала, и у меня возникло подозрение, что я просто открою совершенно новый набор червей, как только она будет реализована. Поэтому я решил не реализовывать переключение рабочих столов. Я нашел реализация C++, которая хорошо работает. Опубликуйте работающий виртуальный рабочий стол C#. реализации для других.
TopMost
. - person uSeRnAmEhAhAhAhAhA   schedule 10.11.2013