- ベストアンサー
[C#]リモートコンピューターを選択するダイアログ
- C#でリモートコンピューターのプロセスを監視するプログラムを作成中です。
- プロセス.GetProcessesByNameメソッドを使用してリモートコンピューターのプロセスを取得する方法が分かりません。
- ダイアログでユーザーがリモートコンピューターを選択し、選択されたコンピューターの名前やIPアドレスを取得する方法が知りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
すいません情報提供だけです ※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を格納するところがあるのかしら?
その他の回答 (4)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
環境のあるところっていうか、家に戻りました。 pszDisplayNameみたいです^^
お礼
//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); }
補足
できました! ありがとうございます。 ただ、実際にはリモートコンピューターのプロセスはとれず、 Process.GetProcessesByName(プロセス名,コンピューター名)で 「System.InvalidOperationException」(リモートコンピューターのプロセス情報が取得できませんでした)が起きてしまうようです。 ともあれ、ダイアログはできましたので、一度締めさせていただきます。 ありがとうございました!
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
BIF_BROWSEFORCOMPUTER をフラグ指定したときは 構造体メンバのpszDisplayNameに入ると思うのですが、開発環境が無いので、ExcelのVBAに置き換えて発言しているので、違ったらすいません。 追記です。 binfo.pidlRoot = CSIDL_NETWORK(0x0012) を指定すると、もっと効果的な表示ができそうですね
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
お礼
ありがとうございます! 上記アドレスを参考に組んでみました。 普通のフォルダを選択する分には、うまくいきました。 そして、リモートコンピューターのみを選択するよう設定した場合(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); } }
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
そうですか、駄目ですか。。。 ならC#での、APIサンプルをどうぞ
お礼
ありがとうございました! とっかかりやすそうな※2のFolderBrowserDialogからみ手見ましたが、残念ながらBIF_BROWSEFORCOMPUTER的なものを指定できないようです。 *1の方は、winAPIでしょうか?難しそうな感じですね。ちょっと調べてみて、まずはwinAPI(使ったことない)について勉強をせねば、という感じです。。。