Отладка 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.AppActivate
(с http://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