2012-02-17 17 views
0

COMポートからの入力に基づいて2つのサードパーティアプリケーションを切り替える必要があります。つまり、デバイスからCommand1を受け取ったときに、App1をアクティブ(最前面)ウィンドウにし、デバイスからCommand2を受け取ったとき、App2をアクティブなウィンドウにします。なぜ私はこれをしたいのですか?このアプリケーションはセルフサービスステーションで動作し、モーションセンサーの入力を監視します。駅の前に誰もいないときにApp2(広告など)を表示する必要があり、誰かが目の前に立っているときにApp1(メインアプリケーションなど)を表示する必要があります。Windows上でアクティブなウィンドウを変更するには?

私は、バックグラウンドで実行され、COMポートの入力を待ち受け、それに応じてアクティブなウィンドウを切り替えるアプリケーションを考えています。ですから、問題は、.NETを使用してアクティブなウィンドウを変更するにはどうすればいいですか? OSはWindows XP Pro SP2ですが、Windows 7でも動作する方が良いでしょう。

+0

FYIでは、ユーザーデスクトップと対話する単純なサービスのようなものはありません。 http://stackoverflow.com/questions/267838/how-can-a-windows-service-execute-a-gui-application –

+0

Windowsサービスは、Windows Vistaから始まるユーザーのデスクトップと対話できません。これはサービスではありません。バックグラウンドアプリケーション(フォームを表示しない標準フォームアプリケーション)を作成するだけです。また、アクティブウィンドウの変更は根本的に壊れています。これは、アプリケーションではなく、ユーザーだけができるべきことです。 Windowsはあらゆる方法であなたと戦うでしょうし、ユーザーはあまり幸せではありません。 –

+0

質問を「背景アプリ」に変更しました。ありがとうございました。また、_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

関連する問題