C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.33926 の関連記事表示

<< 0 >>
■33926  ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 -(2009/03/13(Fri) 14:25:39)

    分類:[C#] 

    環境
    ・WindowsXP
    ・Visual C# 2008 Express Edition

    お世話になります。
    ファイルアイコンを取得し、そのアイコンをリストビューに表示させたいのですが、
    リストビューに表示されずに困っています。どこがわるいか指摘頂けないでしょうか。
    よろしくお願いします。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using System.Windows;
    using System.Runtime.InteropServices;
    using System.IO;

    namespace IconExtract
    {
    public partial class Form1 : Form
    {
    // --------------------------------------------
    // アイコン取得用のWin32 API
    // --------------------------------------------
    // SHGetFileInfo関数
    [DllImport("shell32.dll")]
    private static extern IntPtr SHGetFileInfo
    (string pszPath,
    uint dwFileAttributes,
    ref SHFILEINFO psfi,
    uint cbSizeFileInfo,
    uint uFlags);

    // SHGetFileInfo関数で使用するフラグ
    private enum shfileflg
    {
    SHGFI_ICON = 0x000000100,
    SHGFI_DISPLAYNAME = 0x000000200,
    SHGFI_TYPENAME = 0x000000400,
    SHGFI_ATTRIBUTES = 0x000000800,
    SHGFI_ICONLOCATION = 0x000001000,
    SHGFI_EXETYPE = 0x000002000,
    SHGFI_SYSICONINDEX = 0x000004000,
    SHGFI_LINKOVERLAY = 0x000008000,
    SHGFI_SELECTED = 0x000010000,
    SHGFI_ATTR_SPECIFIED = 0x000020000,
    SHGFI_LARGEICON = 0x000000000,
    SHGFI_SMALLICON = 0x000000001,
    SHGFI_OPENICON = 0x000000002,
    SHGFI_SHELLICONSIZE = 0x000000004,
    SHGFI_PIDL = 0x000000008,
    SHGFI_USEFILEATTRIBUTES = 0x000000010
    };

    // SHGetFileInfo関数で使用する構造体
    private struct SHFILEINFO
    {
    public IntPtr hIcon;
    public IntPtr iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
    };

    public Form1()
    {
    InitializeComponent();
    }

    public static void main()
    {
    // アイコンを取得
    SHFILEINFO shinfo = new SHFILEINFO();
    uint flg;
    flg = (uint)(shfileflg.SHGFI_ICON | shfileflg.SHGFI_LARGEICON);
    IntPtr hSuccess = SHGetFileInfo("c:\\test.log",
    0,
    ref shinfo,
    (uint)Marshal.SizeOf(shinfo),
    flg);
    if (hSuccess != IntPtr.Zero)
    {
    Icon appIcon = Icon.FromHandle(shinfo.hIcon);
    imageList1.Images.Add(appIcon);
    listView1.LargeImageList = imageList1;
    }
    }
    }
    }
親記事 /過去ログ59より / 関連記事表示
削除チェック/

■33927  Re[1]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO -(2009/03/13(Fri) 14:34:12)
    No33926 (hide123 さん) に返信

    まさかとは思うけど、Application.Run してないからとか?
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33928  Re[2]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO -(2009/03/13(Fri) 14:43:52)
    もしかして main って Main とは別物ですか?
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33931  Re[3]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 -(2009/03/13(Fri) 14:52:03)
    No33928 (.SHO さん) に返信
    > もしかして main って Main とは別物ですか?

    大変失礼しました。わかりにくいと思い、ボタン押下時の処理をmain(Mainが正)に変更しました。
    リストビューにアイコンを設定する箇所か、もしくはリストビューコントロールプロパティの設定
    がおかしいのかなとは思っているのですが・・・。

記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33929  Re[2]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 -(2009/03/13(Fri) 14:46:21)
    No33927 (.SHO さん) に返信
    > ■No33926 (hide123 さん) に返信
    >
    > まさかとは思うけど、Application.Run してないからとか?

    いえ、別ファイル(Program.cs)にて行っています。
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33930  Re[3]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO -(2009/03/13(Fri) 14:50:37)
    ListView に ImageList を登録しただけで、データを入れてないから?
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33932  Re[4]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 -(2009/03/13(Fri) 14:56:35)
    No33930 (.SHO さん) に返信
    > ListView に ImageList を登録しただけで、データを入れてないから?

    試しに下記のようにピクチャボックスに設定してみたところ
    アイコンが表示されましたのでデータはあると思っているのですが。

    this.pictureBox1.Image = appIcon.ToBitmap();
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33933  Re[5]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO -(2009/03/13(Fri) 15:00:39)
    > 試しに下記のようにピクチャボックスに設定してみたところ
    > アイコンが表示されましたのでデータはあると思っているのですが。
    >
    > this.pictureBox1.Image = appIcon.ToBitmap();

    ImageList のデータじゃなくて ListView のデータです。
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33934  Re[6]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO -(2009/03/13(Fri) 15:16:25)
    ImageList は ListView に登録したデータに関連付けるイメージを登録するだけで
    それだけでは、何も表示されません。

    ListView にデータを登録し、そのデータを ImageList と対応付けて始めて
    アイコンが表示されます。
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33935  Re[7]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 -(2009/03/13(Fri) 15:28:27)
    No33934 (.SHO さん) に返信
    > ImageList は ListView に登録したデータに関連付けるイメージを登録するだけで
    > それだけでは、何も表示されません。
    >
    > ListView にデータを登録し、そのデータを ImageList と対応付けて始めて
    > アイコンが表示されます。
    >

    ありがとうございます。

    ListView にデータを登録とは前もってListViewItemを登録しておくという
    ことでしょうか。
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33937  Re[7]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 -(2009/03/13(Fri) 15:37:24)
    No33934 (.SHO さん) に返信
    > ImageList は ListView に登録したデータに関連付けるイメージを登録するだけで
    > それだけでは、何も表示されません。
    >
    > ListView にデータを登録し、そのデータを ImageList と対応付けて始めて
    > アイコンが表示されます。
    >

    下記のようにListViewItemを登録してみたところ表示されました。

    Icon appIcon = Icon.FromHandle(shinfo.hIcon);
    imageList1.Images.Add(appIcon);
    listView1.LargeImageList = imageList1;
    listView1.Items.Add(new ListViewItem("", 0)); ←

記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33936  Re[8]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO -(2009/03/13(Fri) 15:36:12)
    No33935 (hide123 さん) に返信

    > ListView にデータを登録とは前もってListViewItemを登録しておくという
    > ことでしょうか。

    「前もって」じゃなくていいです。
    つか、前もって登録しておくのは ImageList の方です。
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33939  Re[9]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 -(2009/03/13(Fri) 15:41:47)
    2009/03/13(Fri) 15:44:14 編集(投稿者)

    下記について問題があれば申し訳ありませんがご指摘をお願いします。
    listView1.Items.Add(new ListViewItem("", 0));

    また、この延長上の話になってしまうのですが、ファイルアイコンではなく、
    システムアイコンを取得する方法はないでしょうか。
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33940  Re[10]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO -(2009/03/13(Fri) 15:47:24)
    No33939 (hide123 さん) に返信

    > 下記について問題があれば申し訳ありませんがご指摘をお願いします。
    > listView1.Items.Add(new ListViewItem("", 0));

    アイコンだけ表示したいなら、それで問題ないです。

    > また、この延長上の話になってしまうのですが、ファイルアイコンではなく、
    > システムアイコンを取得する方法はないでしょうか。

    APIなら出来そうだけど。
    つか、C:\WINDOWS\system32\shell32.dll とか C:\WINDOWS\system32\shell.dll
    とか指定すればいいのでは?
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/

■33941  Re[11]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 -(2009/03/13(Fri) 16:52:40)
    下記のAPIを使用して実現することができました。
    色々とアドバイス頂きありがとうございました。
    また何かありましたらよろしくお願いします。


    // ---------------------------------------
    // 宣言部
    // ---------------------------------------
    [DllImport("shell32.dll")]
    private static extern uint ExtractIconEx(
    string lpszFile,
    int nIconIndex,
    IntPtr[] phiconLarge,
    IntPtr[] phiconSmall,
    uint nIcons
    );

    // ---------------------------------------
    // ソース抜粋
    // ---------------------------------------
    string path = "C:\\Windows\\System32\\shell32.dll";

    // 対象ファイル内アイコン総数を取得
    uint tCnt = ExtractIconEx(path, -1, (IntPtr[])null, (IntPtr[])null, 0);
    IntPtr[] sIcon = new IntPtr[tCnt]; // 小さいアイコン
    IntPtr[] lIcon = new IntPtr[tCnt]; // 大きいアイコン
    // 表示するアイコンを取得
    uint getCnt = ExtractIconEx(path, 0, lIcon, sIcon, tCnt);

    for (int i = 0; i < getCnt; i++)
    {
    Icon appIcon = Icon.FromHandle(lIcon[i]);
    imageList1.Images.Add(appIcon);
    listView1.LargeImageList = imageList1;
    listView1.Items.Add(new ListViewItem("", i));
    }

記事No.33926 のレス / END /過去ログ59より / 関連記事表示
削除チェック/

■33938  Re[8]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO -(2009/03/13(Fri) 15:39:25)
    No33937 (hide123 さん) に返信

    > 下記のようにListViewItemを登録してみたところ表示されました。

    で?
    OKですか?解決?
記事No.33926 のレス /過去ログ59より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -