Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9707

C# - 開いているエクスプローラのパスを一覧表示する

$
0
0

エクスプローラーを開きすぎてとっちらかってるときに、数が多すぎたりパスが長いとタスクバーの一覧表示だと使いづらいので、表形式でリストアップするツールを作ってみた。

キャプチャ

image.png

項目をダブルクリックすると、そのウィンドウが最前面表示されます。
※すでに閉じてしまっていた場合はノーケアです。

ソースコード

ListUpFileExplorer.cs
usingSystem;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO;usingSystem.Reflection;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Windows.Forms;classListUpFileExplorer:Form{ListViewlsv;classNativeMethods{[DllImport("user32.dll")][return:MarshalAs(UnmanagedType.Bool)]publicstaticexternboolSetForegroundWindow(IntPtrhWnd);[DllImport("user32.dll")][return:MarshalAs(UnmanagedType.Bool)]publicstaticexternboolIsIconic(IntPtrhWnd);[DllImport("user32.dll")][return:MarshalAs(UnmanagedType.Bool)]publicstaticexternboolShowWindow(IntPtrhWnd,intnCmdShow);publicconstintSW_RESTORE=9;//[DllImport("user32.dll", SetLastError = true)]//public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);}ListUpFileExplorer(){Text="List up File Explorer";ClientSize=newSize(960,250);varbtn=newButton(){Location=newPoint(0,0),Size=newSystem.Drawing.Size(100,25),Text="Reload",};btn.Click+=(s,e)=>{ReloadList();};Controls.Add(btn);Controls.Add(lsv=newListView(){Location=newPoint(0,30),Size=newSystem.Drawing.Size(700,200),View=View.Details,FullRowSelect=true,GridLines=true,});lsv.Columns.Add("Name",150,HorizontalAlignment.Left);lsv.Columns.Add("Path",800,HorizontalAlignment.Left);lsv.DoubleClick+=(s,e)=>{Lsv_DoubleClick();};varcms=newContextMenuStrip();cms.Opening+=Cms_Opening;cms.Items.Add(newToolStripMenuItem("Copy Text",null,(s,e)=>{CopySelectedItemText();},Keys.Control|Keys.C));lsv.ContextMenuStrip=cms;ReloadList();Load+=(s,e)=>{Form_Resize();};Resize+=(s,e)=>{Form_Resize();};ResizeEnd+=(s,e)=>{Form_Resize();};}voidReloadList(){{lsv.Items.Clear();lsv.BeginUpdate();try{TypecomShellType=Type.GetTypeFromProgID("Shell.Application");dynamicshell=Activator.CreateInstance(comShellType);dynamicwindows=shell.Windows();foreach(dynamicwininwindows){//エクスプローラのみ(IEを除外)stringtmp=win.FullName;if(String.Compare(Path.GetFileName(tmp),"EXPLORER.EXE",true)==0){// 大文字小文字無視で比較stringwebUri=win.LocationURL;if(webUri!=""){Uriu=newUri(webUri);if(u.IsFile){//Windows形式のパス表現に変換するstringpath=u.LocalPath+Uri.UnescapeDataString(u.Fragment);varitem=newListViewItem(newstring[]{Path.GetFileName(path),path});longhwndValue=win.HWND;item.Tag=newIntPtr(hwndValue);lsv.Items.Add(item);}}}}}finally{lsv.EndUpdate();}}// COMオブジェクト解放 ... これでいいはずGC.Collect();GC.WaitForPendingFinalizers();}voidCms_Opening(objectsender,CancelEventArgse){Pointp=lsv.PointToClient(Cursor.Position);varitem=lsv.HitTest(p).Item;if(item==null){e.Cancel=true;}elseif(item.Bounds.Contains(p)){}else{e.Cancel=true;}}voidCopySelectedItemText(){varindices=lsv.SelectedIndices;if(indices.Count==1){stringpath=lsv.Items[indices[0]].SubItems[1].Text;Clipboard.SetText(path);}}voidLsv_DoubleClick(){varindices=lsv.SelectedIndices;if(indices.Count==1){varhwnd=(IntPtr)(lsv.Items[indices[0]].Tag);//int pid;//NativeMethods.GetWindowThreadProcessId(hWnd, out pid);//Process p = Process.GetProcessById(pid);if(NativeMethods.IsIconic(hwnd)){// 最小化から戻すNativeMethods.ShowWindow(hwnd,NativeMethods.SW_RESTORE);}if(!NativeMethods.SetForegroundWindow(hwnd)){// フォーカス移動失敗}}}voidForm_Resize(){inth=ClientSize.Height-lsv.Top;if(h<=10){h=10;}lsv.Size=newSize(ClientSize.Width,h);}[STAThread]staticvoidMain(string[]args){Application.Run(newListUpFileExplorer());}}

参考サイト

右クリックメニュー関連:


Viewing all articles
Browse latest Browse all 9707

Trending Articles