WPF/개발

WPF 프로세스 아이콘 가져오는 방법

푸코잇 2024. 7. 25. 13:43

WPF에서 프로세스 아이콘 가져오는 방법을 배워보자.

 

1. Process.cs (모델)

public class Process
{
    // 프로세스명
    public string Name { get; set; }
    // 아이콘
    public ImageSource AppIcon { get; set; }
    public Process(string path)
    {
        Name = Path.GetFileName(path);
        AppIcon = GetAppIcon(path);
    }
    private ImageSource GetAppIcon(string path)
    {
        Icon icon = null;
        ImageSource imageSource;
        try
        {
            // 파일에 들어있는 이미지의 아이콘 반환
            icon = Icon.ExtractAssociatedIcon(path);
        }
        catch
        {
            // 기본 응용 프로그램 아이콘
            icon = SystemIcons.Application;
        }
        finally
        {
            // 아이콘 이미지에 대한 BitmapSource 반환
            imageSource = Imaging.CreateBitmapSourceFromHIcon(
                            icon.Handle,
                            Int32Rect.Empty,
                            BitmapSizeOptions.FromEmptyOptions());
        }

        return imageSource;
    }
}

 

Icon.ExtractAssociatedIcon 메서드가 핵심이다.

매개변수의 경로가 올바르지 않은 경우 ArgumentException이 발생한다.

이 경우 기본 응용 프로그램 아이콘을 설정하도록 했다.

 

2. MainWindowVM.cs (뷰모델)

public class MainWindowVM
{
    public ObservableCollection<Process> Processes { get; set; } = new ObservableCollection<Process>();
    public MainWindowVM()
    {
        Processes.Add(new Process(@"C:\Program Files\Google\Chrome\Application\chrome.exe"));
        Processes.Add(new Process(@"C:\NotFile.12"));
    }
}

 

3. MainWindow.xaml (뷰)

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest"
        mc:Ignorable="d"
        Title="프로세스 아이콘" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindowVM/>
    </Window.DataContext>

    <Grid>
        <ListView ItemsSource="{Binding Processes}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="프로세스">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <!--아이콘-->
                                    <Image Source="{Binding AppIcon}" Width="16" Height="16"/>
                                    
                                    <!--프로세스명-->
                                    <TextBlock Text="{Binding Name}"/>
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

 

4. 실행결과

WPF-프로세스아이콘