2012-02-17 3 views
0

Мне нужно иметь возможность переключаться между двумя сторонними приложениями на основе ввода с COM-порта, то есть когда я получаю Command1 с устройства, сделайте App1 активным (верхним) окном и когда я получаю Command2 с устройства , сделайте App2 активным окном. Почему я хочу это сделать? Это приложение будет работать на станции самообслуживания, и я буду следить за входом датчика движения; поэтому, когда никто не находится перед станцией, мне нужно показать App2 (например, рекламу), а когда кто-то стоит впереди, мне нужно показать App1 (например, основное приложение).Как изменить активное окно на Windows?

Я думаю о приложении, которое работает в фоновом режиме и прослушивает вход на COM-порт и соответствующим образом переключает активное окно. Итак, вопрос в том, как изменить активное окно с помощью .NET? ОС будет Windows XP Pro SP2, но было бы лучше, если она будет работать и на Windows 7.

+0

FYI нет такой вещи, как простой сервис, который взаимодействует с рабочим столом пользователя в 7; http://stackoverflow.com/questions/267838/how-can-a-windows-service-execute-a-gui-application –

+0

Службы Windows не могут взаимодействовать с рабочим столом пользователя, начиная с Windows Vista. В любом случае это не должно быть сервисом, просто создайте фоновое приложение (т. Е. Приложение стандартных форм, которое не показывает никаких форм). Кроме того, изменение активного окна принципиально нарушено. Это то, что должен делать только пользователь, а не приложение. Windows будет бороться с вами на каждом шагу, и ваши пользователи не будут очень рады. –

+0

Изменил вопрос в «background app», спасибо ... также добавил дополнительную информацию о _why_ Я хочу это сделать – MarioVW

ответ

2

Вы можете использовать;

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

Затем найти соответствующий процесс по имени или зацикливание GetProcesses например, при условии, что один экземпляр:

Process[] process = Process.GetProcessesByName("myapp"); 
if (process.Length > 0 && process[0].MainWindowHandle != IntPtr.Zero) { 
    SetForegroundWindow(process[0].MainWindowHandle); 
} 
+0

Все, что вы говорите, верно, но я вынужден указать, что ['SetForegroundWindow'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539.aspx) поставляется с ... условия. Как я уже упоминал ранее, попытка изменить активное окно из приложения в окно, принадлежащее другому процессу, обычно не рекомендуется. Вредоносные приложения, используемые для поиска способов сделать это, раздражают своих пользователей, и команда Windows медленно затмевает свои способности для этого. Скорее всего, этот код просто заставит другое приложение выпустить свою кнопку на панели задач. –

+0

Я пробовал ваш код, и он действительно работает. Я хочу указать на то, что я породил оба процесса (сторонние приложения) из своего приложения, чтобы это могло помочь. Тем не менее, поведение несколько противоречиво, потому что, когда я двигаю мышью, он запускает панель задач вместо переключения окон. Во всяком случае, это решение, кажется, достаточно хорошо для моих нужд. – MarioVW

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