• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[C#]リモートコンピューターを選択するダイアログ)

[C#]リモートコンピューターを選択するダイアログ

このQ&Aのポイント
  • C#でリモートコンピューターのプロセスを監視するプログラムを作成中です。
  • プロセス.GetProcessesByNameメソッドを使用してリモートコンピューターのプロセスを取得する方法が分かりません。
  • ダイアログでユーザーがリモートコンピューターを選択し、選択されたコンピューターの名前やIPアドレスを取得する方法が知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

すいません情報提供だけです ※1.直接APIで http://yokohama.cool.ne.jp/chokuto/urawaza/api/SHBrowseForFolder.html SHBrowseForFolderで利用する構造体 http://yokohama.cool.ne.jp/chokuto/urawaza/struct/BROWSEINFO.html フラグにBIF_BROWSEFORCOMPUTERを格納したら、できると思います。 ※2.Framework1.1以上という前提であれば http://www.atmarkit.co.jp/fdotnet/dotnettips/056folderdlg/folderdlg.html 私の環境は1.0なので、1.1では実験していませんが、※2のURLの説明を読んでいる限り、内部で※1を利用しているようですね。 FolderBrowserDialogって、BIF_BROWSEFORCOMPUTERを格納するところがあるのかしら?

ohnotellme
質問者

お礼

ありがとうございました! とっかかりやすそうな※2のFolderBrowserDialogからみ手見ましたが、残念ながらBIF_BROWSEFORCOMPUTER的なものを指定できないようです。 *1の方は、winAPIでしょうか?難しそうな感じですね。ちょっと調べてみて、まずはwinAPI(使ったことない)について勉強をせねば、という感じです。。。

その他の回答 (4)

回答No.5

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

ohnotellme
質問者

お礼

//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); }

ohnotellme
質問者

補足

できました! ありがとうございます。 ただ、実際にはリモートコンピューターのプロセスはとれず、 Process.GetProcessesByName(プロセス名,コンピューター名)で 「System.InvalidOperationException」(リモートコンピューターのプロセス情報が取得できませんでした)が起きてしまうようです。 ともあれ、ダイアログはできましたので、一度締めさせていただきます。 ありがとうございました!

回答No.4

BIF_BROWSEFORCOMPUTER をフラグ指定したときは 構造体メンバのpszDisplayNameに入ると思うのですが、開発環境が無いので、ExcelのVBAに置き換えて発言しているので、違ったらすいません。 追記です。 binfo.pidlRoot = CSIDL_NETWORK(0x0012) を指定すると、もっと効果的な表示ができそうですね

回答No.3
ohnotellme
質問者

お礼

ありがとうございます! 上記アドレスを参考に組んでみました。 普通のフォルダを選択する分には、うまくいきました。 そして、リモートコンピューターのみを選択するよう設定した場合(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);  } }

回答No.2

そうですか、駄目ですか。。。 ならC#での、APIサンプルをどうぞ

関連するQ&A