Отладка VisualStudio необходима для переключения окон

Немного предыстории о том, что я делаю первым. Это программа запуска на C#, которая позволяет легко переключаться между основными медиапроигрывателями для домашнего кинотеатра (в моем случае, Plex, MediaPortal и Kodi), так что все они могут использоваться для достижения своих личных качеств (Plex для загружаемого контента, MediaPortal для ТВ) записи и прямая трансляция, и Kodi для всего остального, обычно потокового).
Эти приложения приостанавливаются с помощью pssuspend, что означает, что все они могут оставаться открытыми одновременно, что отлично подходит для медленных компьютеров.

Пользователи нажимают кнопку (на своем пульте), чтобы переключиться обратно на панель запуска и выбрать другое приложение.

Я почти на подходящей версии, но у меня некоторое время была проблема, которую я сузил.

Если мой модуль запуска переключается в приложение (используя методы, упомянутые ниже), я не могу вернуться к процессу запуска.

Это происходит только тогда, когда:

  • VisualStudio не отлаживается, или "процесс размещения Visual Studio" (vshost версия процесса) не выполняется.
  • Клавиатура / дистанционный ввод был применен к приложению, которое переключается на
    • То есть: если я перехожу куда-нибудь к приложению, переключенному на, я могу нормально вернуться к панели запуска, но как только я нажимаю что-то еще в приложении, я не могу выключиться.
  • Выключение приложения, которое было переключено, а не в него из модуля запуска.

В остальное время все работает как положено.

Для переключения я сейчас использую SwitchToThisWindow(IntPtr hWnd, bool fAltTab) (из http://www.pinvoke.net/default.aspx/user32/SwitchToThisWindow.html). Я также использовал Microsoft.VisualBasic.Interaction.AppActivatehttp://msdn.microsoft.com/en-us/library/x9784w8e(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp).

Оба из них имеют одинаковые результаты.

Вещи, которые я подтвердил, НЕ связаны с этой проблемой:

  • pssuspend: если я запускаю без приостановки приложения перед переключением обратно на панель запуска, происходит то же самое
  • Операционная система и компьютер: у меня одна и та же проблема, возникающая на 3 компьютерах, моя установка Windows 8 и две установки Windows 7
  • слушатель возвращается на домашний экран: он использует широковещательную передачу UDP от EventGhost и делает все остальное, что необходимо сделать, например, обновление интерфейса на панели запуска, просто не переключается на панель запуска
  • Компиляция на локальной машине: я изначально думал, что это помогло, но это было только из-за вышеописанной ситуации. Версия, скомпилированная на моем компьютере с Windows 8, прекрасно работает на Windows 7, пока этот процесс vshost открыт. Я не пробовал ни на каких других системах.
    • запуск от имени администратора не дал эффекта

Кое-что, что не должно быть проблемой, но должно быть замечено на всякий случай, - то, что фронтэнд запуска все использует CefSharp (CEF - интегрированная версия браузера Chrome). Хотя проблема возникла до того, как это было добавлено.

Мои Потенциальные мысли:

  • Из-за вещей, упомянутых в AppActivate Я понял, что уровень UIPermission может иметь значение, однако ручная настройка на полное доверие не вносит никаких изменений.
    Я также понял, что в VisualStudio свойства "Безопасность" настроены на использование настроек "OneClick Security" и включены в опцию "Это приложение с полным доверием". Это имеет смысл для меня, так как отладчик дал бы им эти повышенные разрешения, но, вероятно, это должно работать без выполнения отладки.

Некоторый код моего приложения переключается в контекст:

[DllImport("user32.dll", SetLastError = true)]
static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);

static Process currentProcess = Process.GetCurrentProcess();  
public static void SwitchToApplication(Process toSwitchTo)
{
    SwitchProcess(toSwitchTo);
}

public static void SwitchToLauncher()
{
    FrontendBridge.GetInstance().Reset();
    SwitchProcess(Process.GetCurrentProcess());
    Taskbar.Hide();
}

private static void SwitchProcess(Process toSwitchTo)
{
    if (currentProcess == toSwitchTo)
        return;

    if (toSwitchTo.MainWindowHandle != IntPtr.Zero)
    {
        SwitchToThisWindow(toSwitchTo.MainWindowHandle,true);
    }
    currentProcess = toSwitchTo;
}

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

1 ответ

Решение

Так что мне удалось это исправить.

Оказывается, проблема не в каком-либо моем коде, окружающем эти вызовы API, или в приложениях, которые переключались на себя.

Прорывный ответ был отсюда:
http://www.codeproject.com/Tips/76427/How-to-bring-window-to-top-with-SetForegroundWindo

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

Решение состояло в том, чтобы код содержал клавишу alt, чтобы окна позволяли моей программе устанавливать окно переднего плана, затем могли бы использоваться SetForegroundWindow или SwitchToThisWindow (у меня были лучшие результаты с этим при переключении на что-то, что еще не может быть открыто).

Я нашел пример кого-то, использующего этот код здесь:
http://csharpapprentice.blogspot.co.nz/2013/03/ok-ok-its-c.html

Другие вопросы по тегам