起動中のIEのプロセスIDやプロセス名を全て取得したい。

解決


しげちお  2005-06-10 08:39:54  No: 122412

度々もうしわけありません。
やはり、後の処理にプロセスIDやプロセス名が必要になるので、
起動中のもののそれらが必要なのですが、
試行錯誤してみたものの、またもやわかりませんでした(><)

'ファイルの先頭に、URLなどの情報を記録してみる
        FS.Write("URL:=")
        FS.WriteLine(CallByName(Exp, "LocationURL", CallType.Get))
        FS.WriteLine("出力日時:=" & Now.ToString("yyyy/MM/dd HH:mm:ss.fffffff")
この次の行にプロセスIDとプロセス名を書き込むにはどうしたら良いでしょうか?

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200506/05060051.txt
上の方法でやるとどうしても一つのIDと名前しか取得できないので、
どうしてかと思いCTRL+ALT+DELでタスクマネージャを出して確認してみたのですが、
アプリケーションの部分にはキャプション名が全て出ているのですが、プロセスタグの中にはプロセス名は一つにまとめられてしまっているので、
このことから、何か別の方法で対策をしないと複数を個別に得ることは出来ないのではないかと思ったのですが、
どうにも方法がわかりませんでした。

度々申し訳ありませんが、ご教示頂けたら幸いです。


しげちお  2005-06-10 08:41:52  No: 122413

プロセス名を得たいと書きましたが、プロセス名は全て「iexplore」だと思うので、
そうではなくて、得たいのはプロセスIDとキャプション名でした。
申し訳ございません。訂正させて頂きます。


魔界の仮面弁士  2005-06-10 13:34:42  No: 122414

> この次の行にプロセスIDとプロセス名を書き込むにはどうしたら良いでしょうか?
いきなり、FS.Write がどうとか書かれても……。
当事者にしかわからないような質問の仕方は避けましょうよ。

せめて、元記事へのリンクぐらいは貼っておいてくださいな。(^_^;
そうしないと、第三者には意味不明な物になってしまいますので。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200506/05060046.txt

で。先に提示したサンプルは、COM の ShellWindows オブジェクトを使って、
COM の InternetExplorer オブジェクトを列挙しているわけですが、
その点は、理解されていますでしょうか。

[ShellWindows オブジェクト]
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/objects/shellwindows/shellwindows.asp

[InternetExplorer オブジェクト]
http://msdn.microsoft.com/workshop/browser/webbrowser/reference/objects/internetexplorer.asp

> 上の方法でやるとどうしても一つのIDと名前しか取得できないので、
そもそも、各画面ごとに異なるプロセスである保証は無いですし。
1つのプロセスで、複数の画面が起動されている事も多いですよね。

> プロセスIDとキャプション名でした。
タイトルに関しては、LocationNameプロパティで取得できるかと。
プロセスIDに関しては……HWNDプロパティでウィンドウハンドルを得てから、
GetWindowThreadProcessId APIで取り出せば良いかな?

Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As IntPtr, ByRef PID As IntPtr) As Integer
Sub Main()
  Dim Shell As Object = CreateObject("Shell.Application")
  Dim Windows As Object = CallByName(Shell, "Windows", CallType.Method)
  For I As Integer = 0 To CInt(CallByName(Windows, "Count", CallType.Get)) - 1
    Dim Exp As Object = CallByName(Windows, "Item", CallType.Get, I)
    Dim PId As IntPtr
    GetWindowThreadProcessId(New IntPtr(CInt(CallByName(Exp, "HWND", CallType.Get))), PId)
    Console.WriteLine(String.Format("{0:x} - [{1}]", PId, CallByName(Exp, "LocationName", CallType.Get)))
    Marshal.ReleaseComObject(Exp)
  Next
  Marshal.ReleaseComObject(Windows)
  Marshal.ReleaseComObject(Shell)
End Sub


魔界の仮面弁士  2005-06-10 13:46:01  No: 122415

> Console.WriteLine(String.Format("{0:x} - [{1}]", PId, CallByName(Exp, "LocationName", CallType.Get)))

失礼。下記のように修正してください。

Console.WriteLine(String.Format("0x{0:x8} - [{1}]", PId.ToInt32(), CallByName(Exp, "LocationName", CallType.Get)))

なお、上記のサンプルでは、iexplore.exe と explorer.exe を同一視して
処理しています。両者を区別したいなら、InternetExplorer オブジェクトの
FullNameプロパティで切り分けるようにしてみてください。
また、IE(iexplore.exe)でフォルダを表示していたり、
エクスプローラ(explorer.exe)でWebページを表示している場合などを
判断したいのであれば、先のサンプルのように、Documentプロパティの
データ型で判断してみてください。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200506/05060046.txt


しげちお  2005-06-11 09:27:46  No: 122416

またも完璧なご回答ありがとうございます。

ご指摘の点確かにその通りでした。
折角回答して頂いているのですから、他の方にも役立てて貰いたいですからね。
(質問者の分際でこんなこと言うのは生意気ですが)

今回教えて頂いたプログラムもズバリ100%目的通りの動作をするものでした。
いろいろやってみてどうにもできなかったので、
ほんとに感謝と驚嘆で頭が下がりました。
リンク先も見て勉強してみたいと思います。

ほんとにありがとうございました!


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加