![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
C#でコンピュータのプロセスを監視するプログラムを作っています。
Process.GetProcessesByName メソッドによるプロセスの取得は、リモートコンピューターでも可能なようなのですが、以下1・2の実現方法が分かりません。
1.ユーザーが(ダイアログか何かで)リモートコンピューターを選択する
2.選択されたリモートコンピューターの名前かIPアドレスを取得する
3.プロセスを取得する。Process [] ipByName = Process.GetProcessesByName("notepad", "169.0.0.0");
コンピューターを選択して取得するようなダイアログは.NETに用意されていないようですが、この場合どのようにすればよいでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
すいません情報提供だけです
※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を格納するところがあるのかしら?
ありがとうございました!
とっかかりやすそうな※2のFolderBrowserDialogからみ手見ましたが、残念ながらBIF_BROWSEFORCOMPUTER的なものを指定できないようです。
*1の方は、winAPIでしょうか?難しそうな感じですね。ちょっと調べてみて、まずはwinAPI(使ったことない)について勉強をせねば、という感じです。。。
No.5
- 回答日時:
環境のあるところっていうか、家に戻りました。
pszDisplayNameみたいです^^
この回答への補足
できました!
ありがとうございます。
ただ、実際にはリモートコンピューターのプロセスはとれず、
Process.GetProcessesByName(プロセス名,コンピューター名)で
「System.InvalidOperationException」(リモートコンピューターのプロセス情報が取得できませんでした)が起きてしまうようです。
ともあれ、ダイアログはできましたので、一度締めさせていただきます。
ありがとうございました!
//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);
}
No.4
- 回答日時:
BIF_BROWSEFORCOMPUTER
をフラグ指定したときは
構造体メンバのpszDisplayNameに入ると思うのですが、開発環境が無いので、ExcelのVBAに置き換えて発言しているので、違ったらすいません。
追記です。
binfo.pidlRoot = CSIDL_NETWORK(0x0012)
を指定すると、もっと効果的な表示ができそうですね
No.3
- 回答日時:
ありがとうございます!
上記アドレスを参考に組んでみました。
普通のフォルダを選択する分には、うまくいきました。
そして、リモートコンピューターのみを選択するよう設定した場合(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);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 サブアカウントの名前変更 1 2023/02/11 01:27
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- C言語・C++・C# ActiveXコントロールを.NETにインポートできない??? 2 2023/05/02 02:50
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) Application.Dialogs(xlDialogFileDelete).Showの件 1 2023/02/22 10:02
- ネットワーク 瞬快 コンソール操作 ローカル端末のファイルをリモート端末にコピーする方法がない? 1 2023/03/17 18:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
プロセスIDからウィンドウハ...
-
プロセスのアタッチ・デタッチ...
-
CreateObjectで作成したExcelの...
-
怪しいプロセス教えてください。
-
他のコンピュータのプロセスを取得
-
ADOでアクセスのレコードに...
-
[C#]リモートコンピューターを...
-
C++のプログラムをバックグラウ...
-
Visual C++からpingを実行して...
-
プロセスハンドル or ウインド...
-
POSIX メッセージキュー作成時...
-
VBSからbat実行(WMI)して戻り値...
-
デバックにプロセスをアタッチ...
-
プロセスが実行中かどうか調べ...
-
C#でのbatファイル実行結果取得
-
WSH.Runで待機できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
C#でのbatファイル実行結果取得
-
VB6.0 SHELLで起動...
-
ADOでアクセスのレコードに...
-
Windowsでのfork方法
-
非表示になったエクセルは?
-
共有メモリの同時アクセスにつ...
-
プロセスIDからウィンドウハ...
-
プロセスIDの取得方法について
-
C++のプログラムをバックグラウ...
-
C++でシェルを起動
-
Linuxでのスレッド間メッセージ...
-
OSPFでプロセスを分ける意義に...
-
怪しいプロセス教えてください。
-
Process.Startの戻り値を後で取得
-
SendMessageが失敗するときがある
-
ウィンドウのタイトルからプロ...
おすすめ情報