電子書籍の厳選無料作品が豊富!

C#でコンピュータのプロセスを監視するプログラムを作っています。

Process.GetProcessesByName メソッドによるプロセスの取得は、リモートコンピューターでも可能なようなのですが、以下1・2の実現方法が分かりません。

1.ユーザーが(ダイアログか何かで)リモートコンピューターを選択する
2.選択されたリモートコンピューターの名前かIPアドレスを取得する
3.プロセスを取得する。Process [] ipByName = Process.GetProcessesByName("notepad", "169.0.0.0");

コンピューターを選択して取得するようなダイアログは.NETに用意されていないようですが、この場合どのようにすればよいでしょうか?

よろしくお願いします。

A 回答 (5件)

すいません情報提供だけです




※1.直接APIで
http://yokohama.cool.ne.jp/chokuto/urawaza/api/S …

SHBrowseForFolderで利用する構造体
http://yokohama.cool.ne.jp/chokuto/urawaza/struc …
フラグにBIF_BROWSEFORCOMPUTERを格納したら、できると思います。


※2.Framework1.1以上という前提であれば
http://www.atmarkit.co.jp/fdotnet/dotnettips/056 …



私の環境は1.0なので、1.1では実験していませんが、※2のURLの説明を読んでいる限り、内部で※1を利用しているようですね。
FolderBrowserDialogって、BIF_BROWSEFORCOMPUTERを格納するところがあるのかしら?
    • good
    • 0
この回答へのお礼

ありがとうございました!
とっかかりやすそうな※2のFolderBrowserDialogからみ手見ましたが、残念ながらBIF_BROWSEFORCOMPUTER的なものを指定できないようです。

*1の方は、winAPIでしょうか?難しそうな感じですね。ちょっと調べてみて、まずはwinAPI(使ったことない)について勉強をせねば、という感じです。。。

お礼日時:2005/08/22 17:40

環境のあるところっていうか、家に戻りました。



pszDisplayNameみたいです^^

この回答への補足

できました!
ありがとうございます。

ただ、実際にはリモートコンピューターのプロセスはとれず、
Process.GetProcessesByName(プロセス名,コンピューター名)で
「System.InvalidOperationException」(リモートコンピューターのプロセス情報が取得できませんでした)が起きてしまうようです。

ともあれ、ダイアログはできましたので、一度締めさせていただきます。
ありがとうございました!

補足日時:2005/08/23 17:12
    • good
    • 0
この回答へのお礼

//BROWSEINFO構造体(SHBrowseForFolderへの引数)
[StructLayout(LayoutKind.Sequential,Pack=8)]
public struct BROWSEINFO {
 ・・・
}
//フォルダを開く、のダイアログ
[DllImport( "shell32.dll" )]
static extern IntPtr SHBrowseForFolder( ref BROWSEINFO lpbi );

// IMallocインターフェイスの C# での表現
// SHBrowseForFolderで確保したPIDLのメモリ領域は、IMallocのFreeメソッドで開放する必要あり
[InterfaceType ( ComInterfaceType.InterfaceIsIUnknown ),Guid ( "00000002-0000-0000-C000-000000000046" )]
public interface IMalloc{
・・・・
}
//メモリの開放
[DllImport ( "Shell32.DLL" )]
public static extern int SHGetMalloc ( out IMalloc ppMalloc );

/**
* リモートコンピュータ選択ダイアログを出し、
* 選択されたコンピューター名を返す
*
* @return null/コンピューター名
*/
private String GetRemoteName(){
String directoryPath = null;//ユーザー選択格納用
IntPtr pidlRet = IntPtr.Zero;//IntPtr構造体の0に初期化されたポインタを示す
try{
 BROWSEINFO binfo = new BROWSEINFO(); //SHBrowseForFolderへの参照渡し引数、BROWSEINFO構造体
 binfo.pszDisplayName = new string( ' ', 256 );//選択されたフォルダ名が格納される
 binfo.pidlRoot = 0x0012;//ダイアログ表示時のルート
 binfo.ulFlags = 0x1000;//選択フィルター
 
 pidlRet = SHBrowseForFolder( ref binfo ); //ダイアログ実行
 
 if ( pidlRet == IntPtr.Zero ){
  // ユーザーが [キャンセル] をクリックした場合。
  directoryPath = null;
 }
 else{
  directoryPath = binfo.pszDisplayName;
  Debug.WriteLine("directoryPath : " + directoryPath);
 }
} finally{
 //メモリの開放
 IMalloc malloc;
 SHGetMalloc(out malloc);
malloc.Free ( pidlRet );
if(pidlRet != IntPtr.Zero){
 malloc.Free ( pidlRet );
}
}
return(directoryPath);
}

お礼日時:2005/08/23 17:12

BIF_BROWSEFORCOMPUTER


をフラグ指定したときは
構造体メンバのpszDisplayNameに入ると思うのですが、開発環境が無いので、ExcelのVBAに置き換えて発言しているので、違ったらすいません。


追記です。
binfo.pidlRoot = CSIDL_NETWORK(0x0012)
を指定すると、もっと効果的な表示ができそうですね
    • good
    • 0
    • good
    • 0
この回答へのお礼

ありがとうございます!
上記アドレスを参考に組んでみました。
普通のフォルダを選択する分には、うまくいきました。

そして、リモートコンピューターのみを選択するよう設定した場合(binfo.ulFlags = 0x0001 = BIF_BROWSEFORCOMPUTER)、SHGetPathFromIDListではパス(?)を取得できないようです。
この場合、どのようにIPアドレスもしくはコンピューター名を引き出せばよいでしょうか?

[StructLayout(LayoutKind.Sequential,Pack=8)]
public struct BROWSEINFO {
 public System.IntPtr hwndOwner;
 public int pidlRoot;
 public string pszDisplayName;
 public string lpszTitle;
 public uint ulFlags;
 public int lpfn;
 public int lParam;
 public int iImage;
}

[DllImport( "shell32.dll" )]
static extern IntPtr SHBrowseForFolder( ref BROWSEINFO lpbi );
[DllImport( "shell32.dll" )]
static extern int SHGetPathFromIDList(IntPtr pidl, StringBuilder Path);

・・・・・・・・・・・・・・

void Button1Click(object sender, System.EventArgs e){
 BROWSEINFO binfo = new BROWSEINFO();
 binfo.pszDisplayName = new string( ' ', 256 );
 binfo.lpszTitle = "BIF_BROWSEFORCOMPUTERは0x1000";
 binfo.ulFlags = 0x1000;
 //binfo.pidlRoot = "";
 //ITEMIDLIST idlist = SHBrowseForFolder( ref binfo );
 IntPtr pidlRet = IntPtr.Zero;
 pidlRet = SHBrowseForFolder( ref binfo );
 if ( pidlRet == IntPtr.Zero ){
  // ユーザーが [キャンセル] をクリックした場合。
 }
 else{
  String directoryPath;
  StringBuilder dir = new StringBuilder( 260 );
  if(SHGetPathFromIDList(pidlRet,dir) == 0){directoryPath = dir.ToString ( );
  }
  else{
   directoryPath = dir.ToString ( );
  }
  Debug.WriteLine("directoryPath : " + directoryPath);
 }
}

お礼日時:2005/08/22 19:38

そうですか、駄目ですか。

。。

ならC#での、APIサンプルをどうぞ
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!