Запуск приложения из фонового процесса
Я работаю над небольшой программой на основе WPF для запуска приложений через общесистемные горячие клавиши, реализованные с использованием перехвата. Я реализую это в C# и Visual Studio 2010.
Когда я определяю конкретное нажатие клавиши, я использую Process.Start(...) для запуска приложения. Это работает нормально, когда Visual Studio активен, помещая новое приложение на передний план с фокусом ввода, как я и ожидал. Если мой лаунчер находится в фоновом режиме (за другой активной программой), он все равно обнаруживает ключ и правильно запускает приложение перед всем остальным.
Проблема заключается в том, что когда я запускаю панель запуска без активной Visual Studio, и мое приложение запуска не запускается, ни приложения не запускаются. Они появляются перед лаунчером, но за активным приложением.
Я вижу, что другие программы, такие как AutoHotkey, могут запускать горячие клавиши с таким поведением, но я не вижу, что я делаю неправильно.
Обновление: только что нашел решение этой проблемы, которое работает в моей среде разработки. Сначала я регистрирую глобальную горячую клавишу через Windows API RegisterHotKey, используя дескриптор главного окна программы запуска. Ключ может быть любым, но обычно он не существует физически, в моем случае - F24. Затем, всякий раз, когда я обнаруживаю нажатие клавиш через зацепки, которые должны запускать приложение, я сначала вызываю keybd_event, чтобы "подделать" нажатие клавиши для горячей клавиши.
Для использования WPF:
keybd_event((byte)KeyInterop.VirtualKeyFromKey(Key.F24),0,KEYEVENTF_KEYUP,0);
Для WinForms используйте:
keybd_event((byte)Keys.F24,0,KEYEVENTF_KEYUP,0);
Это обеспечит достаточный фокус на панели запуска, так что Process.Start(...) заставит выполненную программу оказаться впереди. Он не выводит окно модуля запуска на передний план и не заставляет модуль запуска принимать входные данные.
Если Activate() вызывается в главном окне после keybd_event(), это выведет главное окно вперед и позволит ввод с клавиатуры, как если бы пользователь переключил задачу.