C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 実行中のタスク列挙


(過去ログ 52 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■28730 / inTopicNo.1)  実行中のタスク列挙
  
□投稿者/ Zesa (1回)-(2008/11/29(Sat) 20:06:16)

分類:[.NET 全般] 

すいません、よろしくお願いします。
Windowsのタスクマネージャのアプリケーション一覧のように、
実行中のタスクを列挙したいのですがうまくいきませんでした。

方法としてEnumWindowsを使ってみたのですが、Vistaではディスクトップのガジェットも取得してしまいうまくいきません、
もうひとつ、ProcessでMainWindowHandleが存在しないものを列挙してみたのですが、
エクスプローラなどが希望通りになりません。
(列挙できるものの、キャプションが""で取れない)

タスクマネージャではどのような仕組みで列挙しているのでしょうか?
よろしくお願いします!m(_ _)m

VB 2008/Windows Vista Xp
引用返信 編集キー/
■28732 / inTopicNo.2)  Re[1]: 実行中のタスク列挙
□投稿者/ やじゅ (807回)-(2008/11/29(Sat) 21:54:38)
やじゅ さんの Web サイト
2008/11/29(Sat) 22:17:41 編集(投稿者)
2008/11/29(Sat) 21:59:25 編集(投稿者)

No28730 (Zesa さん) に返信
> Windowsのタスクマネージャのアプリケーション一覧のように、
> 実行中のタスクを列挙したいのですがうまくいきませんでした。
>

「WMI Win32_Process」で検索してみるといいですよ。

VB.NETからWMIを使ってみよう
http://www.wmifun.net/wmistep/step10.html

WMIを使いたくない場合は、実行されているアプリケーションの
どの情報を取得したいのか、また、実行OSが何であるかなどに
よって使用するAPIは異なりますが、
CreateToolhelp32Snapshot、Process32First/Next、Module32First/Next、
EnumProcesses、EnumProcessModules、GetModuleFileNameExA
あたりを使えば、概ねの情報は列挙できるかと思います。
引用返信 編集キー/
■28733 / inTopicNo.3)  Re[2]: 実行中のタスク列挙
□投稿者/ Zesa (2回)-(2008/11/29(Sat) 23:28:02)
返信ありがとうございます!

> 「WMI Win32_Process」で検索
がんばってみたのですが、ちょっと複雑で難しかったです。
できれば、ほかの人も分るよう
なるだけスマートに組み立てたかったので・・・

>
> WMIを使いたくない場合は、実行されているアプリケーションの
> どの情報を取得したいのか、また、実行OSが何であるかなどに
> よって使用するAPIは異なりますが、
> CreateToolhelp32Snapshot、Process32First/Next、Module32First/Next、
> EnumProcesses、EnumProcessModules、GetModuleFileNameExA
> あたりを使えば、概ねの情報は列挙できるかと思います。
何とか近いものを探すことができました!
まだエラーで実行できていませんが、何とかしてみます、
http://support.microsoft.com/kb/175030/ja

ですが、できれば今後のことも考えて少量のAPIで組み立てたいと考えているので、クラスでの方法を探しています。

現段階では
実行中のプロセスを取得することなどはできるのですが、タスクマネージャのアプリケーションタブと同じ列挙ができない
という状態です。


引用返信 編集キー/
■28741 / inTopicNo.4)  Re[3]: 実行中のタスク列挙
□投稿者/ 渋木宏明(ひどり) (967回)-(2008/11/30(Sun) 09:39:08)
渋木宏明(ひどり) さんの Web サイト
2008/11/30(Sun) 09:42:14 編集(投稿者)

> タスクマネージャのアプリケーションタブと同じ列挙ができないという状態です。

まるまる同じ結果を返す、標準 API や標準クラスはありません。

あ「アプリケーションタブに表示されるプロセスの基準」も明文化されているのを見た記憶がないので、Process.GetProcesses() や WMI などで得たプロセス一覧に対して、あなたが満足する基準に照らしてフィルタ処理を行う必要があります。
引用返信 編集キー/
■28744 / inTopicNo.5)  Re[1]: 実行中のタスク列挙
□投稿者/ 魔界の仮面弁士 (913回)-(2008/11/30(Sun) 10:40:44)
2008/11/30(Sun) 10:59:45 編集(投稿者)

No28730 (Zesa さん) に返信
> Windowsのタスクマネージャのアプリケーション一覧のように、
> 実行中のタスクを列挙したいのですがうまくいきませんでした。
タスクマネージャと完全に同じというわけでは無いですが、たとえばこんなのとか。

Imports System.Runtime.InteropServices
Module Sample
 Sub Main()
  Dim wd As Object = Nothing, tasks As Object = Nothing
  Try
   wd = CreateObject("Word.Application")
   tasks = CallByName(wd, "Tasks", vbGet)
   For i As Integer = 1 To CInt(CallByName(tasks, "Count", vbGet))
    Dim task As Object = CallByName(tasks, "Item", vbMethod, i)
    If CBool(CallByName(task, "Visible", vbGet)) Then
     Console.WriteLine(CallByName(task, "Name", vbGet))
    End If
    If Marshal.IsComObject(task) Then
     Marshal.ReleaseComObject(task)
    End If
   Next
  Catch
   Console.Error.WriteLine("タスクを取得できませんでした。")
  Finally
   If tasks IsNot Nothing AndAlso Marshal.IsComObject(tasks) Then
    Marshal.ReleaseComObject(tasks)
   End If
   If wd IsNot Nothing Then
    Try
     CallByName(wd, "Quit", vbMethod)
    Finally
     If Marshal.IsComObject(wd) Then
      Marshal.ReleaseComObject(wd)
     End If
    End Try
   End If
  End Try
 End Sub
End Module


> Vistaではディスクトップのガジェットも
http://www.tt.rim.or.jp/~rudyard/gaigo001.html


> タスクマネージャではどのような仕組みで列挙しているのでしょうか?
明確な仕様定義を見た事は無いのですが、動作から想像すると、恐らく、
列挙したプロセスのうち、メインウィンドウが可視状態の物を取り出して、さらにそこから
自分自身(Windows タスク マネージャ)と Windows タスクバーを取り除いているのでは無いかと。
引用返信 編集キー/
■28746 / inTopicNo.6)  Re[2]: 実行中のタスク列挙
□投稿者/ やじゅ (808回)-(2008/11/30(Sun) 11:17:55)
やじゅ さんの Web サイト
No28744 (魔界の仮面弁士 さん) に返信
>    wd = CreateObject("Word.Application")
>    tasks = CallByName(wd, "Tasks", vbGet)

Wordにこんな機能があるんですねw

Microsoft Office を使用した実際のスクリプト作成
http://www.microsoft.com/japan/technet/scriptcenter/topics/office/tasks.mspx

Word VBAには現在実行中のタスク一覧を返すTasksコレクションが実装されているのに
Excel VBAに実装されていないんですね。
http://officetanaka.net/excel/vba/tips/tips61.htm
引用返信 編集キー/
■28753 / inTopicNo.7)  Re[3]: 実行中のタスク列挙
□投稿者/ 魔界の仮面弁士 (914回)-(2008/11/30(Sun) 12:35:54)
No28746 (やじゅ さん) に返信
> Wordにこんな機能があるんですねw

SendWindowMessage メソッドなんてのもあったりして、そこそこ遊べますが、
System.Diagnostics.Process や WMI Win32_Process クラスと違って、
ハンドルを得る事ができないのが難点だったりします。

手軽さだけで言えば、Process.GetProcesses メソッドなのですが、こちらはメインウィンドウしか
得られないので、IE で複数のウィンドウを開いた場合などに対応できませんよね。

なのでこの場合はプロセスから探すのでは無く、EnumWindows API でトップウィンドウを列挙して、
IsWindowVisible API で可視性を調べるという方向で処理した方が良いのかも知れません。
引用返信 編集キー/
■28760 / inTopicNo.8)  Re[4]: 実行中のタスク列挙
□投稿者/ 渋木宏明(ひどり) (968回)-(2008/11/30(Sun) 14:26:00)
渋木宏明(ひどり) さんの Web サイト
> なのでこの場合はプロセスから探すのでは無く、EnumWindows API でトップウィンドウを列挙して、
> IsWindowVisible API で可視性を調べるという方向で処理した方が良いのかも知れません。

そっちの線で行くなら、ウィンドウスタイルのチェックも必要なはず。
他にも何か必要かもしれない。
引用返信 編集キー/
■28773 / inTopicNo.9)  Re[5]: 実行中のタスク列挙
□投稿者/ Zesa (3回)-(2008/11/30(Sun) 20:21:55)
いろいろな方法を教えていただきありがとうございます!

渋木宏明さんの言う通り用意されていないようなので、コツコツ振るいにかけるしかないようです・・・
魔界の仮面弁士さんに教えて頂いたOfficeの利用なんですが、入っていないので断念してしまいました、(できないなーと思っていたら、OpenOfficeでした)

そこで、EnumWindowsで実行中のタスクを列挙して、IsWindowVisibleで〜試したのですが、やはりガジェットが引っかかります。
ですので、タスクバーに表示される項目のキャプションを取って、ProcessやEnumWindowsで検索するなどして見ます。
(タスクバーに表示されない物があると、また別の方法を探さないとだめですね。orz)
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -