2015-01-04 2 views
0

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

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

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

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

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

  • 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#code-snippet-1).

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

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

  • PsSuspend: если я бегу без остановки приложения перед переключением обратно на пусковую, то же самое происходит
  • Операционная система и компьютер: I имеют ту же проблему, что и на трех компьютерах, моя установка 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; 
} 

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

+0

Не используйте 'SwitchToThisWindow'. Посмотрите на другие альтернативы. Также попробуйте запустить как admin, чтобы увидеть, есть ли разница. – SimpleVar

+0

Спасибо за ваш комментарий. Как и выше, я пробовал два разных метода, но с теми же результатами. Я также попробовал работать как администратор, и это не помогло (обновит это выше). – user3550959

ответ

0

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

Оказывается, проблема связана не с каким-либо из моих кодов, связанных с этими вызовами 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

Смежные вопросы