- PR -

【VB.NET】 別APを最前面に表示させる

1
投稿者投稿内容
くぷ
会議室デビュー日: 2005/05/27
投稿数: 12
投稿日時: 2005-08-09 10:58
いつも勉強させて頂いてます。

現在、VB.NETで開発を行っています。
A"と"B"というAPが起動している状態で、
"A"のほうであるボタンをクリックしたときに
"B"をアクティブにし最前面に表示するようにしたいです。
また、"B"が起動していない場合には"B"を起動するようにしたいのですが
どのようにすればよいのでしょうか?

どなたかご教授お願い致します。
よろしくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-09 11:19
APってのはアプリケーションのことで良いんですかね。

他のプロセスの情報を取得するにはSystem.Diagnostics.Processクラスを使います。
タイトル文字列が分かっているならProcess.GetProcessesByNameメソッド。
そうでなければProcess.GetProcessesをしてそれぞれのMainModuleプロパティからFileNameやModuleNameで判断します。

他プロセスのウィンドウの操作は現在の.NETではサポートされていないので、Win32APIのSetForegroundWindow関数を使うことになります。
関数に渡すウィンドウハンドルは、通常は前述のメソッドで取得したProcessインスタンスのMainWindowHandleプロパティを使えばいいでしょう。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-09 11:27
こんにちは、じゃんぬ です。

最小化されてることも考慮すると、ShowWindow 関数も合わせておくと良いでしょう。

同一アプリケーションなので、ちょっと例は違いますが...
二重起動をした時に既に起動中のアプリケーションをアクティブにする



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
くぷ
会議室デビュー日: 2005/05/27
投稿数: 12
投稿日時: 2005-08-09 14:04
Hongliangさん、じゃんぬねっとさん
お早い回答ありがとうございます。
あまりの早さにちょっと感動しました。

SetForegroundWindow関数を用いることで何とか解決しました。

本当にありがとうございました。
くぷ
会議室デビュー日: 2005/05/27
投稿数: 12
投稿日時: 2005-08-10 09:59
度々で申し訳ないのですが・・・。

SetForegroundWindow関数を用いて最前面に持ってくることは出来たのですが、
ターミナルサービス上で複数ユーザーがログインして作業を行うため、
同じアプリケーションが複数起動している状態になっています。
こんな場合にでも、特定のプロセス情報を取得するには
どのようにすれば良いのでしょうか?

どなたかご存知の方がおりましたら、
ご教授お願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-10 10:39
引用:

こんな場合にでも、特定のプロセス情報を取得するには
どのようにすれば良いのでしょうか?


確実な識別にはプロセス ID しかないです。
ただ今回の場合、その ID がどれなのか結局判らないのですよね。
現状のまま簡単に解決するとなると、
タイトルバーの文字列 + (ログイン ユーザ ID) などにして判断するとか...
後は、情報をプロセスごとに埋め込んでおくしかないでしょうね。
いずれにしても、起動される側の対応は必須です。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-10 11:58
Win32APIまみれになりますが、Terminal Service APIを駆使すればなんとかなるんじゃないでしょうか。
適当につらつら考えてみれば、
  1. Process.GetCurrentProcess().Idで現在のプロセスのプロセスIDを取得
  2. ProcessIdToSessionIdで関連づけられたセッションを取得
  3. WTSEnumerateProcessesでプロセスを列挙
  4. 現在のプロセスのセッションと一致するものの中で、取得すべきプロセスのIDを取得
  5. Process.GetProcessByIdでProcessインスタンスを取得
こんな感じでできそうな気がしますが。
//ターミナルサービスに詳しくないので実際に可能かは分かりません。

手前みそですがWTSEnumerateSessionsのVB.NETのサンプルです。ちょっといじるだけでWTSEnumerateProcessesに置き換えられます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21701&forum=7&2
ここではWTSFreeMemoryが省かれてたりしますのでちょっと注意ですが。
//確認のためにコードを書こうとしたらイマイチしっくり来ず、検索したら過去の自分が普通にコーディングしていたという……もうボケが始まってるのかしら。
くぷ
会議室デビュー日: 2005/05/27
投稿数: 12
投稿日時: 2005-08-10 14:21
じゃんぬねっとさん、Hongliangさん
ご回答ありがとうございます。

引用:
  1. Process.GetCurrentProcess().Idで現在のプロセスのプロセスIDを取得
  2. ProcessIdToSessionIdで関連づけられたセッションを取得
  3. WTSEnumerateProcessesでプロセスを列挙
  4. 現在のプロセスのセッションと一致するものの中で、取得すべきプロセスのIDを取得
  5. Process.GetProcessByIdでProcessインスタンスを取得



この方法で出来ました!!
本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)