Способы отображения значков exe в ListView - PullRequest
0 голосов
/ 27 марта 2012

Используя ListView, мне нужно отобразить (большие) иконки для массива исполняемых файлов.

Есть ли стандартный способ сделать это / "Шаблон" (будь то Дизайн или иным образом)?

Складка: эти .exes должны запускаться ТОЛЬКО из этого ListView.Если человек должен был перейти к .exe через Проводник, он не сможет запустить его оттуда.Таким образом, пользователь должен войти в систему, прежде чем увидеть массив значков программ (и то, что он увидит, будет зависеть от их роли) *, и это ЕДИНСТВЕННЫЙ шлюз для запуска этих приложений.

  • Таким образом, эти значки приложений должны быть добавлены программно.

Идеи?

Обновление:

Попытка использовать приведенный ниже код для создания приложения "Quick and Dirty".

Вот мой код:

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.IO;

namespace ListViewWithAppIcons {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            DirectoryInfo dir = new DirectoryInfo(@"C:\SpotRun");
            foreach (FileInfo file in dir.GetFiles()) {
                try {
                    this.imageList1.Images.Add(Image.FromFile(file.FullName)); 
                } catch {
                    Console.WriteLine("This is not a Duck-billed Platypus");
                }
            }
            this.listView1.View = View.LargeIcon;
            this.imageList1.ImageSize = new Size(32, 32);
            this.listView1.LargeImageList = this.imageList1;
            //or 
            //this.listView1.View = View.SmallIcon; 
            //this.listView1.SmallImageList = this.imageList1; 

            for (int j = 0; j < this.imageList1.Images.Count; j++) {
                ListViewItem item = new ListViewItem();
                item.ImageIndex = j;
                this.listView1.Items.Add(item);
            } 

        }
    }
}

.. и вот "код, сгенерированный инструментом" (не я, другой инструмент):

namespace ListViewWithAppIcons {
    partial class Form1 {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </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.SuspendLayout();
            // 
            // listView1
            // 
            this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.listView1.Location = new System.Drawing.Point(0, 0);
            this.listView1.Name = "listView1";
            this.listView1.Size = new System.Drawing.Size(555, 408);
            this.listView1.TabIndex = 0;
            this.listView1.UseCompatibleStateImageBehavior = false;
            // 
            // imageList1
            // 
            this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
            this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(555, 408);
            this.Controls.Add(this.listView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.ListView listView1;
        private System.Windows.Forms.ImageList imageList1;
    }
}

1 Ответ

1 голос
/ 28 марта 2012

Привет, Клей, мне нужно сослаться на лишнюю принцессу-невесту!

Пример из MSDN, так что вы знаете, как хорошо его кодировать:

private void Form_Load(object sender, EventArgs e)
{
    DirectoryInfo dir = new DirectoryInfo(@"c:\pic");
    foreach (FileInfo file in dir.GetFiles())
    {
        try
        {
            this.imageList1.Images.Add(Image.FromFile(file.FullName));
        }
        catch
        {
            Console.WriteLine("This is not an image file");
        }
    }
    this.listView1.View = View.LargeIcon;
    this.imageList1.ImageSize = new Size(32, 32);
    this.listView1.LargeImageList = this.imageList1;
    //or
    //this.listView1.View = View.SmallIcon;
    //this.listView1.SmallImageList = this.imageList1;

    for (int j = 0; j < this.imageList1.Images.Count; j++)
    {
        ListViewItem item = new ListViewItem();
        item.ImageIndex = j;
        this.listView1.Items.Add(item);
    }
}

Запретить людям открывать exe-файлы (кроме вашей программы) довольно сложно, было бы легко, если бы вы написали все эти приложения и могли требовать секретный аргумент (например, аргумент командной строки) для запуска другие приложения. Но с помощью Process Monitor / Explorer пользователи могут узнать секретный ключ.

В качестве альтернативы вы можете скрыть exe-файлы в какой-то папке, но хитрость заключается в том, что имя exe-файла будет отображаться в диспетчере задач, и как только пользователи увидят это, они смогут искать exe-файл. Я имею в виду, что вы могли бы обойти это, используя мою технику, но насколько глубока дыра бешенства: Как скрыть приложение C # от TaskManager Processtab? - см. Мой ответ, оно получило большинство голосов.

Может быть, лучшим решением, чем все эти махинации с сокрытием штуковин от пользователей - Режим киоска: http://support.microsoft.com/kb/555463

...