|
分類:[C#]
簡単なエクスプローラのようなものを作っています。
今、listview上に任意のフォルダ(マイドキュメント)を表示させるところまでできました。
この表示されたフォルダやファイルをダブルクリックしたら開くようにしたいです。
ソースコードです。
Form1.cs
*********************************************************************
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using System.Diagnostics;
using WinApi;
namespace Listview
{
/// <summary>
/// Form1 の概要の説明です。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.ImageList imageList1;
private System.Windows.Forms.ImageList imageList2;
private System.ComponentModel.IContainer components;
public Form1()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();
//
// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
//
}
/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.listView1 = new System.Windows.Forms.ListView();
this.imageList1 = new System.Windows.Forms.ImageList(this.components);
this.imageList2 = new System.Windows.Forms.ImageList(this.components);
this.SuspendLayout();
//
// listView1
//
this.listView1.Alignment = System.Windows.Forms.ListViewAlignment.Default;
this.listView1.BackColor = System.Drawing.SystemColors.Window;
this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.listView1.Cursor = System.Windows.Forms.Cursors.Default;
this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listView1.Location = new System.Drawing.Point(0, 0);
this.listView1.Name = "listView1";
this.listView1.Scrollable = false;
this.listView1.Size = new System.Drawing.Size(434, 344);
this.listView1.TabIndex = 0;
//
// imageList1
//
this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
//
// imageList2
//
this.imageList2.ImageSize = new System.Drawing.Size(16, 16);
this.imageList2.TransparentColor = System.Drawing.Color.Transparent;
//
// Form1
//
this.AutoScale = false;
this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
this.BackColor = System.Drawing.SystemColors.HotTrack;
this.ClientSize = new System.Drawing.Size(434, 344);
this.ControlBox = false;
this.Controls.Add(this.listView1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Form1";
this.ShowInTaskbar = false;
this.Text = "Icon ListView";
this.TopMost = true;
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private IntPtr hImageSmall;
private IntPtr hImageLarge;
private int nIndex=0;
private void GetFile()
{
nIndex =0;
foreach(string s in System.IO.Directory.GetFileSystemEntries(@"C:\Documents and Settings\Administrator\My Documents"))
{
Shell32.SHFILEINFO shfi=new Shell32.SHFILEINFO();
FileInfo fi=new FileInfo(s);
//32 x 32サイズのアイコンを取得
hImageLarge=Shell32.SHGetFileInfo(s,0,ref shfi,(uint)Marshal.SizeOf(shfi),
Shell32.SHGFI_ICON|Shell32.SHGFI_LARGEICON);
imageList2.Images.Add(Icon.FromHandle(shfi.hIcon));
//16 x 16サイズのアイコンを取得
hImageSmall=Shell32.SHGetFileInfo(s,0,ref shfi,(uint)Marshal.SizeOf(shfi),
Shell32.SHGFI_ICON|Shell32.SHGFI_SMALLICON);
imageList1.Images.Add(Icon.FromHandle(shfi.hIcon));
//リストビューにアイテムを追加
listView1.Items.Add(
new ListViewItem(
new string[]{fi.Name,Directory.GetCreationTime(fi.FullName).ToString(),
Directory.GetLastAccessTime(fi.FullName).ToString()}
,nIndex++)
);
}
}
private void Form1_Load(object sender, System.EventArgs e)
{
//リストビューのヘッダを作成
ColumnHeader ch1=new ColumnHeader();
ch1.Text="File";
ColumnHeader ch2=new ColumnHeader();
ch2.Text="CreateDate";
ColumnHeader ch3=new ColumnHeader();
ch3.Text="AccessDate";
//リストビューのヘッダ&イメージリスト&サイズ&ドッキング先の設定
listView1.Columns.AddRange(new ColumnHeader[]{ch1,ch2,ch3});
listView1.SmallImageList=imageList1;
listView1.LargeImageList=imageList2;
//listView1.Size=new Size(200,Size.Height);
//listView1.Dock=DockStyle.Left|DockStyle.Bottom|DockStyle.Top;
//2つのイメージリストのサイズ&色深度の設定
imageList1.ImageSize=SystemInformation.SmallIconSize;
imageList1.ColorDepth=ColorDepth.Depth32Bit;
imageList2.ImageSize=SystemInformation.IconSize;
imageList2.ColorDepth=ColorDepth.Depth32Bit;
//ファイルの取得
GetFile();
}
}
}
***************************************************************
Shell32.cs
***************************************************************
using System;
using System.Runtime.InteropServices;
namespace WinApi
{
class Shell32
{
public const uint SHGFI_ICON=0x100;
public const uint SHGFI_LARGEICON=0x0;
public const uint SHGFI_SMALLICON=0x1;
//typedef struct _SHFILEINFO {
// HICON hIcon;
// int iIcon;
// DWORD dwAttributes;
// TCHAR szDisplayName[MAX_PATH];
// TCHAR szTypeName[80];
//} SHFILEINFO
public struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=80)]
public string szTypeName;
}
//DWORD_PTR SHGetFileInfo(
// LPCTSTR pszPath,
// DWORD dwFileAttributes,
// SHFILEINFO* psfi,
// UINT cbFileInfo,
// UINT uFlags
//);
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(
string pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbFileInfo,
uint uFlags
);
}
}
**************************************************************
ネットで調べたところ、
System.Diagnostics.Process.startメソッドを使うところまではわかったのですが、
()のなかをどう記述したらよいのかがわかりません。
よろしくお願いします。
|