다음을 통해 공유


AutoPlay로 자동 시작하기

AutoPlay를 사용하면 사용자가 디바이스를 PC에 연결할 때 원하는 앱을 옵션으로 제공할 수 있습니다. 여기에는 카메라, 미디어 플레이어 등의 비볼륨 디바이스나 USB 썸 드라이브(thumb drive), SD 카드, DVD 등의 볼륨 디바이스가 포함됩니다. 사용자가 근접(태핑) 기능을 이용하여 두 PC 간에 파일을 공유할 경우에도 AutoPlay를 사용하여 원하는 앱을 옵션으로 제공할 수 있습니다.

참고 항목

사용자가 디바이스 제조업체이고 Microsoft Store 디바이스 앱을 디바이스의 AutoPlay 처리기로 연결하려는 경우, 디바이스 메타데이터에서 해당 앱을 식별할 수 있습니다. 자세한 내용은 Microsoft 스토어 디바이스 앱의 자동 실행을 참조하세요.

AutoPlay 콘텐츠 등록하기

AutoPlay 콘텐츠 이벤트용 옵션으로 앱을 등록할 수 있습니다. AutoPlay 콘텐츠 이벤트는 카메라 메모리 카드, 썸 드라이브 또는 DVD 등의 볼륨 디바이스를 PC에 삽입했을 때 발생합니다. 여기서는 카메라의 볼륨 디바이스가 삽입되었을 때 앱을 AutoPlay 옵션으로 식별하는 방법을 알아보겠습니다.

이 튜토리얼에서는 이미지 파일을 표시하거나 그림으로 복사하는 앱을 만들었습니다. AutoPlay ShowPicturesOnArrival 콘텐츠 이벤트에 맞는 앱을 등록했습니다.

AutoPlay를 사용하면 근접(태핑) 기능을 이용하여 PC 간에 공유되는 콘텐츠에 대한 콘텐츠 이벤트도 발생합니다. 이 섹션의 단계와 코드를 사용하면 근접 기능을 사용하는 PC 간에 공유되는 파일을 처리할 수 있습니다. 다음 표에는 근접 기능을 사용해서 콘텐츠를 공유할 때 사용할 수 있는 AutoPlay 콘텐츠 이벤트가 나열되어 있습니다.

작업 AutoPlay 콘텐츠 이벤트
음악 공유 PlayMusicFilesOnArrival
비디오 공유 PlayVideoFilesOnArrival

근접 기능을 사용하여 파일을 공유하는 경우, FileActivatedEventArgs 개체의 파일 속성에는 공유된 파일이 모두 담긴 루트 폴더에 대한 참조가 포함됩니다.

1단계: 새 프로젝트 생성 및 AutoPlay 선언 추가

  1. Microsoft Visual Studio를 열고 파일 메뉴에서 새 프로젝트를 선택하세요. Visual C# 섹션의 Windows에서 빈 앱(유니버설 Windows)을 선택하세요. 앱 이름을 AutoPlayDisplayOrCopyImages로 지정하고 확인을 클릭하세요.
  2. Package.appxmanifest 파일을 열고 접근 권한 값 탭을 엽니다. 이동식 저장소그림 라이브러리 접근 권한 값을 선택합니다. 이렇게 하면 앱에서 카메라 메모리를 확보하기 위해 이동식 스토리지 디바이스에 액세스하고 로컬 사진에 액세스할 수 있습니다.
  3. 매니페스트 파일에서 선언 탭을 선택합니다. 사용 가능한 선언 드롭다운 목록에서 자동 실행 콘텐츠를 선택한 다음, 추가를 클릭합니다. 지원 대상 선언 목록에 추가된 새 AutoPlay 콘텐츠 항목을 선택하세요.
  4. AutoPlay 콘텐츠 선언은 AutoPlay 사용 시 콘텐츠 이벤트가 발생할 때 앱을 옵션으로 식별합니다. 이 이벤트는 볼륨 디바이스(예: DVD 또는 썸 드라이브)의 콘텐츠를 기준으로 합니다. AutoPlay는 볼륨 디바이스의 콘텐츠를 검사하고 발생시킬 콘텐츠 이벤트를 결정합니다. 볼륨의 루트에 DCIM, AVCHD 또는 PRIVATE\ACHD 폴더가 포함되어 있거나 사용자가 자동 실행 제어판에서 각 미디어 유형으로 수행할 작업 선택을 사용하도록 설정하고 볼륨의 루트에 사진이 있는 경우 자동 실행은 ShowPicturesOnArrival 이벤트를 발생시킵니다. 작업 시작 섹션에서 첫 번째로 시작할 작업에 대해 아래 표 1의 값을 입력하세요.
  5. AutoPlay 콘텐츠 항목에 대한 작업 시작 섹션에서 새로 추가를 클릭하여 두 번째로 시작할 작업을 추가하세요. 두 번째로 시작할 작업에 대해 아래 표 2의 값을 입력하세요.
  6. 사용 가능한 선언 드롭다운 목록에서 파일 형식 연결을 선택하고 추가를 클릭하세요. 새 파일 형식 연결 선언에서 표시 이름 필드를 AutoPlay Copy or Show Images로 설정하고 이름 필드를 image_association1로 설정합니다. 지원 대상 파일 형식 섹션에서 새로 추가를 클릭하세요. 파일 형식 필드를 .jpg로 설정하세요. 지원 대상 파일 형식 섹션에서 새 파일 연결의 파일 형식 필드를 .png로 설정하세요. 콘텐츠 이벤트의 경우 AutoPlay는 앱에 명시적으로 연결되지 않은 파일 형식을 필터링합니다.
  7. 매니페스트 파일을 저장하고 닫습니다.

테이블 1

설정
동사 show
작업 표시 이름 그림 보기
콘텐츠 이벤트 ShowPicturesOnArrival

작업 표시 이름 설정은 AutoPlay에서 앱에 대해 표시하는 문자열을 식별합니다. 동사 설정은 선택한 옵션에 대해 앱에 전달된 값을 식별합니다. AutoPlay 이벤트에 대해 시작 작업을 여러 개 지정하고 동사 설정을 사용해서 사용자가 앱에 대해 선택한 옵션을 확인할 수 있습니다. 앱에 전달된 시작 이벤트 인수의 동사 속성을 확인하면 사용자가 선택한 옵션을 알 수 있습니다. 동사 설정에서는 예약된 open을 제외한 모든 값을 사용할 수 있습니다.

표 2

설정
동사 copy
작업 표시 이름 라이브러리로 그림 복사하기
콘텐츠 이벤트 ShowPicturesOnArrival

2단계: XAML UI 추가

MainPage.xaml 파일을 열고 다음 XAML을 기본 <그리드> 섹션에 추가하세요.

<TextBlock FontSize="18">File List</TextBlock>
<TextBlock x:Name="FilesBlock" HorizontalAlignment="Left" TextWrapping="Wrap"
           VerticalAlignment="Top" Margin="0,20,0,0" Height="280" Width="240" />
<Canvas x:Name="FilesCanvas" HorizontalAlignment="Left" VerticalAlignment="Top"
        Margin="260,20,0,0" Height="280" Width="100"/>

3단계: 초기화 코드 추가

이 단계의 코드는 OnFileActivated 이벤트 도중 앱에 전달된 시작 인수 중 하나인 동사 속성의 동사 값을 검사합니다. 그런 다음 이 코드는 사용자가 선택한 옵션과 관련 있는 메서드를 호출합니다. 카메라 메모리 이벤트의 경우, AutoPlay는 카메라 스토리지의 루트 폴더를 앱에 전달합니다. 이 폴더는 파일 속성의 첫 번째 요소에서 검색할 수 있습니다.

App.xaml.cs 파일을 열고 다음 코드를 클래스에 추가하세요.

protected override void OnFileActivated(FileActivatedEventArgs args)
{
    if (args.Verb == "show")
    {
        Frame rootFrame = (Frame)Window.Current.Content;
        MainPage page = (MainPage)rootFrame.Content;

        // Call DisplayImages with root folder from camera storage.
        page.DisplayImages((Windows.Storage.StorageFolder)args.Files[0]);
    }

    if (args.Verb == "copy")
    {
        Frame rootFrame = (Frame)Window.Current.Content;
        MainPage page = (MainPage)rootFrame.Content;

        // Call CopyImages with root folder from camera storage.
        page.CopyImages((Windows.Storage.StorageFolder)args.Files[0]);
    }

    base.OnFileActivated(args);
}

참고 다음 단계에서는 DisplayImages 메서드 및 CopyImages 메서드가 추가됩니다.

4단계: 이미지가 표시되도록 코드 추가

MainPage.xaml.cs 파일에서 다음 코드를 MainPage 클래스에 추가하세요.

async internal void DisplayImages(Windows.Storage.StorageFolder rootFolder)
{
    // Display images from first folder in root\DCIM.
    var dcimFolder = await rootFolder.GetFolderAsync("DCIM");
    var folderList = await dcimFolder.GetFoldersAsync();
    var cameraFolder = folderList[0];
    var fileList = await cameraFolder.GetFilesAsync();
    for (int i = 0; i < fileList.Count; i++)
    {
        var file = (Windows.Storage.StorageFile)fileList[i];
        WriteMessageText(file.Name + "\n");
        DisplayImage(file, i);
    }
}

async private void DisplayImage(Windows.Storage.IStorageItem file, int index)
{
    try
    {
        var sFile = (Windows.Storage.StorageFile)file;
        Windows.Storage.Streams.IRandomAccessStream imageStream =
            await sFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
        Windows.UI.Xaml.Media.Imaging.BitmapImage imageBitmap =
            new Windows.UI.Xaml.Media.Imaging.BitmapImage();
        imageBitmap.SetSource(imageStream);
        var element = new Image();
        element.Source = imageBitmap;
        element.Height = 100;
        Thickness margin = new Thickness();
        margin.Top = index * 100;
        element.Margin = margin;
        FilesCanvas.Children.Add(element);
    }
    catch (Exception e)
    {
       WriteMessageText(e.Message + "\n");
    }
}

// Write a message to MessageBlock on the UI thread.
private Windows.UI.Core.CoreDispatcher messageDispatcher = Window.Current.CoreWindow.Dispatcher;

private async void WriteMessageText(string message, bool overwrite = false)
{
    await messageDispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
        () =>
        {
            if (overwrite)
                FilesBlock.Text = message;
            else
                FilesBlock.Text += message;
        });
}

5단계: 이미지 복사를 위해 코드 추가

MainPage.xaml.cs 파일에서 다음 코드를 MainPage 클래스에 추가하세요.

async internal void CopyImages(Windows.Storage.StorageFolder rootFolder)
{
    // Copy images from first folder in root\DCIM.
    var dcimFolder = await rootFolder.GetFolderAsync("DCIM");
    var folderList = await dcimFolder.GetFoldersAsync();
    var cameraFolder = folderList[0];
    var fileList = await cameraFolder.GetFilesAsync();

    try
    {
        var folderName = "Images " + DateTime.Now.ToString("yyyy-MM-dd HHmmss");
        Windows.Storage.StorageFolder imageFolder = await
            Windows.Storage.KnownFolders.PicturesLibrary.CreateFolderAsync(folderName);

        foreach (Windows.Storage.IStorageItem file in fileList)
        {
            CopyImage(file, imageFolder);
        }
    }
    catch (Exception e)
    {
        WriteMessageText("Failed to copy images.\n" + e.Message + "\n");
    }
}

async internal void CopyImage(Windows.Storage.IStorageItem file,
                              Windows.Storage.StorageFolder imageFolder)
{
    try
    {
        Windows.Storage.StorageFile sFile = (Windows.Storage.StorageFile)file;
        await sFile.CopyAsync(imageFolder, sFile.Name);
        WriteMessageText(sFile.Name + " copied.\n");
    }
    catch (Exception e)
    {
        WriteMessageText("Failed to copy file.\n" + e.Message + "\n");
    }
}

6단계: 앱 빌드 및 실행

  1. 앱을 빌드하고 디버그 모드로 배포하려면 F5를 누르세요.
  2. 앱을 실행하려면 카메라 메모리 카드 또는 카메라의 다른 스토리지 디바이스를 PC에 삽입하세요. 그런 다음 AutoPlay 옵션 목록에서 package.appxmanifest 파일에 지정된 콘텐츠 이벤트 옵션 중 하나를 선택하세요. 이 샘플 코드는 카메라 메모리 카드의 DCIM 폴더에서만 그림을 표시하거나 복사합니다. 카메라 메모리 카드에서 사진을 AVCHD 또는 PRIVATE\ACHD 폴더에 저장하는 경우 그에 따라 코드를 업데이트해야 합니다.

참고 항목

카메라 메모리 카드가 없다면 루트에 DCIM이라는 폴더가 있는 경우, 그리고 DCIM 폴더에 이미지가 담긴 하위 폴더가 있는 경우 플래시 드라이브를 사용할 수 있습니다.

AutoPlay 디바이스 등록하기

AutoPlay 디바이스 이벤트용 옵션으로 앱을 등록할 수 있습니다. AutoPlay 디바이스 이벤트는 디바이스가 PC에 연결되었을 때 발생합니다.

여기서는 카메라가 PC에 연결되었을 때 앱을 AutoPlay 옵션으로 식별하는 방법을 알아보겠습니다. 앱은 WPD\ImageSourceAutoPlay 이벤트에 대한 처리기로 등록됩니다. 이 이벤트는 카메라 및 기타 이미징 디바이스가 MTP를 사용하는 ImageSource임을 알릴 경우 WPD(Windows 이동식 디바이스) 시스템에서 발생하는 일반적인 이벤트입니다. 자세한 내용은 Windows 이동식 디바이스를 참조하세요.

중요 Windows.Devices.Portable.StorageDevice API는 데스크톱 디바이스 제품군의 일부입니다. 앱은 데스크톱 디바이스 제품군(예: PC)의 Windows 10 디바이스에서만 이 API를 사용할 수 있습니다.

1단계: 다른 새 프로젝트 생성 및 AutoPlay 선언 추가

  1. Visual Studio를 열고 파일 메뉴에서 새 프로젝트를 선택하세요. Visual C# 섹션의 Windows에서 빈 앱(유니버설 Windows)을 선택하세요. 앱의 이름을 AutoPlayDevice_Camera로 지정하고 확인을 클릭합니다.
  2. Package.appxmanifest 파일을 열고 접근 권한 값 탭을 엽니다. 이동식 저장소 접근 권한 값을 선택합니다. 이렇게 하면 앱이 이동식 스토리지 볼륨 디바이스로서 카메라의 데이터에 액세스할 수 있습니다.
  3. 매니페스트 파일에서 선언 탭을 선택합니다. 사용 가능한 선언 드롭다운 목록에서 자동 실행 장치를 선택한 다음 추가를 클릭합니다. 지원 대상 선언 목록에 추가된 새 AutoPlay 디바이스 항목을 선택하세요.
  4. AutoPlay 디바이스 선언은 AutoPlay에서 알려진 이벤트에 대한 디바이스 이벤트가 발생할 경우 앱을 옵션으로 식별합니다. 작업 시작 섹션에서 첫 번째로 시작할 작업에 대해 아래 표의 값을 입력하세요.
  5. 사용 가능한 선언 드롭다운 목록에서 파일 형식 연결을 선택하고 추가를 클릭하세요. 새 파일 형식 연결 선언에서 표시 이름 필드를 Show Images from Camera로 설정하고 이름 필드를 camera_association1으로 설정합니다. 지원 대상 파일 형식 섹션에서 새로 추가를 클릭하세요(필요한 경우). 파일 형식 필드를 .jpg로 설정하세요. 지원 대상 파일 형식 섹션에서 새로 추가를 한 번 더 클릭하세요. 새 파일 연결의 파일 형식 필드를 .png로 설정하세요. 콘텐츠 이벤트의 경우 AutoPlay는 앱에 명시적으로 연결되지 않은 파일 형식을 필터링합니다.
  6. 매니페스트 파일을 저장하고 닫습니다.
설정
동사 show
작업 표시 이름 그림 보기
콘텐츠 이벤트 WPD\ImageSource

작업 표시 이름 설정은 AutoPlay에서 앱에 대해 표시하는 문자열을 식별합니다. 동사 설정은 선택한 옵션에 대해 앱에 전달된 값을 식별합니다. AutoPlay 이벤트에 대해 시작 작업을 여러 개 지정하고 동사 설정을 사용해서 사용자가 앱에 대해 선택한 옵션을 확인할 수 있습니다. 앱에 전달된 시작 이벤트 인수의 동사 속성을 확인하면 사용자가 선택한 옵션을 알 수 있습니다. 동사 설정에서는 예약된 open을 제외한 모든 값을 사용할 수 있습니다. 단일 앱에서 여러 동사를 사용하는 것에 관한 예제는 AutoPlay 콘텐츠 등록을 참조하세요.

2단계: 데스크톱 확장을 위한 어셈블리 참조 추가

Windows 이동식 디바이스인 Windows.Devices.Portable.StorageDevice의 스토리지에 액세스하는 데 필요한 API는 데스크톱 디바이스 제품군의 일부입니다. 즉 API를 사용하기 위해서는 특수 어셈블리가 필요하며, 이러한 호출은 데스크톱 디바이스 제품군(예: PC)의 디바이스에서만 작동합니다.

  1. 솔루션 탐색기에서 참조를 마우스 오른쪽 버튼으로 클릭한 다음 참조 추가를 클릭하세요.
  2. 유니버설 Windows를 펼친 후 확장을 클릭하세요.
  3. 그런 다음 UWP용 Windows 데스크톱 확장을 선택하고 확인을 클릭하세요.

3단계: XAML UI 추가

MainPage.xaml 파일을 열고 다음 XAML을 기본 <그리드> 섹션에 추가하세요.

<StackPanel Orientation="Vertical" Margin="10,0,-10,0">
    <TextBlock FontSize="24">Device Information</TextBlock>
    <StackPanel Orientation="Horizontal">
        <TextBlock x:Name="DeviceInfoTextBlock" FontSize="18" Height="400" Width="400" VerticalAlignment="Top" />
        <ListView x:Name="ImagesList" HorizontalAlignment="Left" Height="400" VerticalAlignment="Top" Width="400">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <Image Source="{Binding Path=Source}" />
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapGrid Orientation="Horizontal" ItemHeight="100" ItemWidth="120"></WrapGrid>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
        </ListView>
    </StackPanel>
</StackPanel>

4단계: 활성화 코드 추가

이 단계의 코드는 카메라의 디바이스 정보 ID를 FromId 메서드에 전달해서 카메라를 StorageDevice로 참조합니다. 먼저 이벤트 인수를 DeviceActivatedEventArgs로 캐스팅한 다음, DeviceInformationId 속성의 값을 가져옴으로써 카메라의 디바이스 정보 ID를 구합니다.

App.xaml.cs 파일을 열고 다음 코드를 클래스에 추가하세요.

protected override void OnActivated(IActivatedEventArgs args)
{
   if (args.Kind == ActivationKind.Device)
   {
      Frame rootFrame = null;
      // Ensure that the current page exists and is activated
      if (Window.Current.Content == null)
      {
         rootFrame = new Frame();
         rootFrame.Navigate(typeof(MainPage));
         Window.Current.Content = rootFrame;
      }
      else
      {
         rootFrame = Window.Current.Content as Frame;
      }
      Window.Current.Activate();

      // Make sure the necessary APIs are present on the device
      bool storageDeviceAPIPresent =
      Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Devices.Portable.StorageDevice");

      if (storageDeviceAPIPresent)
      {
         // Reference the current page as type MainPage
         var mPage = rootFrame.Content as MainPage;

         // Cast the activated event args as DeviceActivatedEventArgs and show images
         var deviceArgs = args as DeviceActivatedEventArgs;
         if (deviceArgs != null)
         {
            mPage.ShowImages(Windows.Devices.Portable.StorageDevice.FromId(deviceArgs.DeviceInformationId));
         }
      }
      else
      {
         // Handle case where APIs are not present (when the device is not part of the desktop device family)
      }

   }

   base.OnActivated(args);
}

참고 항목

ShowImages 메서드는 다음 단계에서 추가됩니다.

5단계: 디바이스 정보가 표시되도록 코드 추가

StorageDevice 클래스의 속성에서 카메라 관련 정보를 가져올 수 있습니다. 이 단계의 코드는 앱이 실행되면 디바이스 이름 및 기타 정보를 사용자에게 표시합니다. 그런 다음 이 코드는 카메라에 저장된 이미지의 썸네일을 표시하기 위해 GetImageList 메서드 및 GetThumbnail 메서드(다음 단계에서 추가할 예정)를 호출합니다.

MainPage.xaml.cs 파일에서 다음 코드를 MainPage 클래스에 추가하세요.

private Windows.Storage.StorageFolder rootFolder;

internal async void ShowImages(Windows.Storage.StorageFolder folder)
{
    DeviceInfoTextBlock.Text = "Display Name = " + folder.DisplayName + "\n";
    DeviceInfoTextBlock.Text += "Display Type =  " + folder.DisplayType + "\n";
    DeviceInfoTextBlock.Text += "FolderRelativeId = " + folder.FolderRelativeId + "\n";

    // Reference first folder of the device as the root
    rootFolder = (await folder.GetFoldersAsync())[0];
    var imageList = await GetImageList(rootFolder);

    foreach (Windows.Storage.StorageFile img in imageList)
    {
        ImagesList.Items.Add(await GetThumbnail(img));
    }
}

참고 항목

GetImageList 메서드 및 GetThumbnail 메서드는 다음 단계에서 추가됩니다.

6단계: 이미지가 표시되도록 코드 추가

이 단계의 코드는 카메라에 저장된 이미지의 썸네일을 표시합니다. 이 코드는 카메라를 비동기적으로 호출하여 썸네일 이미지를 가져옵니다. 단, 다음 비동기 호출은 이전 비동기 호출이 완료될 때까지 발생하지 않습니다. 이렇게 하면 카메라에 대한 요청이 한 번에 한 건만 수행됩니다.

MainPage.xaml.cs 파일에서 다음 코드를 MainPage 클래스에 추가하세요.

async private System.Threading.Tasks.Task<List<Windows.Storage.StorageFile>> GetImageList(Windows.Storage.StorageFolder folder)
{
    var result = await folder.GetFilesAsync();
    var subFolders = await folder.GetFoldersAsync();
    foreach (Windows.Storage.StorageFolder f in subFolders)
        result = result.Union(await GetImageList(f)).ToList();

    return (from f in result orderby f.Name select f).ToList();
}

async private System.Threading.Tasks.Task<Image> GetThumbnail(Windows.Storage.StorageFile img)
{
    // Get the thumbnail to display
    var thumbnail = await img.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem,
                                                100,
                                                Windows.Storage.FileProperties.ThumbnailOptions.UseCurrentScale);

    // Create a XAML Image object bind to on the display page
    var result = new Image();
    result.Height = thumbnail.OriginalHeight;
    result.Width = thumbnail.OriginalWidth;
    result.Name = img.Name;
    var imageBitmap = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
    imageBitmap.SetSource(thumbnail);
    result.Source = imageBitmap;

    return result;
}

7단계: 앱 빌드 및 실행

  1. 앱을 빌드하고 디버그 모드로 배포하려면 F5를 누르세요.
  2. 앱을 실행하려면 카메라를 원하는 머신에 연결하세요. 그런 다음 AutoPlay 옵션 목록에서 앱을 선택하세요.

참고 항목

모든 카메라가 WPD\ImageSource AutoPlay 디바이스 이벤트에 대해 광고하는 것은 아닙니다.

이동식 스토리지 구성하기

볼륨 디바이스가 PC에 연결되면 볼륨 디바이스(예: 메모리 카드 또는 썸 드라이브)를 AutoPlay 디바이스로 식별할 수 있습니다. 이 기능은 특정 AutoPlay용 앱을 볼륨 디바이스의 사용자에게 표시되도록 연결하려는 경우에 특히 유용합니다.

여기서는 볼륨 디바이스를 AutoPlay 디바이스로 식별하는 방법을 알아보겠습니다.

볼륨 디바이스를 AutoPlay 디바이스로 식별하려면 디바이스의 루트 드라이브에 autorun.inf 파일을 추가하세요. autorun.inf 파일에서 AutoRun 섹션에 CustomEvent 키를 추가하세요. 볼륨 디바이스가 PC에 연결되면 AutoPlay에서 autorun.inf 파일을 찾아 볼륨을 디바이스로 처리하세요. AutoPlayCustomEvent 키에 제공한 이름을 사용하여 AutoPlay 이벤트를 생성합니다. 그런 다음 앱을 만들고, 이 앱을 해당 AutoPlay 이벤트에 대한 처리기로 등록할 수 있습니다. 디바이스가 PC에 연결되면 AutoPlay가 앱을 볼륨 디바이스의 처리기로 표시합니다. autorun.inf 파일에 대한 자세한 내용은 autorun.inf 항목을 참조하세요.

1단계: autorun.inf 파일 생성

볼륨 디바이스의 루트 드라이브에서 autorun.inf라는 파일을 추가하세요. autorun.inf 파일을 열고 다음 텍스트를 추가하세요.

[AutoRun]
CustomEvent=AutoPlayCustomEventQuickstart

2단계: 새 프로젝트 생성 및 AutoPlay 선언 추가

  1. Visual Studio를 열고 파일 메뉴에서 새 프로젝트를 선택하세요. Visual C# 섹션의 Windows에서 빈 앱(유니버설 Windows)을 선택하세요. 애플리케이션 이름을 AutoPlayCustomEvent로 지정하고 확인을 클릭하세요.
  2. Package.appxmanifest 파일을 열고 접근 권한 값 탭을 엽니다. 이동식 저장소 접근 권한 값을 선택합니다. 이렇게 하면 앱으로 이동식 스토리지 디바이스의 파일 및 폴더에 액세스할 수 있습니다.
  3. 매니페스트 파일에서 선언 탭을 선택합니다. 사용 가능한 선언 드롭다운 목록에서 자동 실행 콘텐츠를 선택한 다음, 추가를 클릭합니다. 지원 대상 선언 목록에 추가된 새 AutoPlay 콘텐츠 항목을 선택하세요.

참고 항목

아니면 사용자 지정 AutoPlay 이벤트에 대한 AutoPlay 디바이스 선언을 추가하도록 선택할 수도 있습니다.

  1. AutoPlay 콘텐츠 이벤트 선언에 대한 작업 시작 섹션에서 첫 번째로 시작할 작업에 대해 아래 표의 값을 입력하세요.
  2. 사용 가능한 선언 드롭다운 목록에서 파일 형식 연결을 선택하고 추가를 클릭하세요. 새 파일 형식 연결 선언에서 표시 이름 필드를 Show .ms Files로 설정하고 이름 필드를 ms_association로 설정합니다. 지원 대상 파일 형식 섹션에서 새로 추가를 클릭하세요. 파일 형식 필드를 .ms로 설정하세요. 콘텐츠 이벤트의 경우, AutoPlay는 앱에 명시적으로 연결되지 않은 파일 형식을 필터링합니다.
  3. 매니페스트 파일을 저장하고 닫습니다.
설정
동사 show
작업 표시 이름 파일 보기
콘텐츠 이벤트 AutoPlayCustomEventQuickstart

콘텐츠 이벤트 값은 autorun.inf 파일에서 CustomEvent 키에 대해 제공된 텍스트입니다. 작업 표시 이름 설정은 AutoPlay에서 앱에 대해 표시하는 문자열을 식별합니다. 동사 설정은 선택한 옵션에 대해 앱에 전달된 값을 식별합니다. AutoPlay 이벤트에 대해 시작 작업을 여러 개 지정하고 동사 설정을 사용해서 사용자가 앱에 대해 선택한 옵션을 확인할 수 있습니다. 앱에 전달된 시작 이벤트 인수의 동사 속성을 확인하면 사용자가 선택한 옵션을 알 수 있습니다. 동사 설정에서는 예약된 open을 제외한 모든 값을 사용할 수 있습니다.

3단계: XAML UI 추가

MainPage.xaml 파일을 열고 다음 XAML을 기본 <그리드> 섹션에 추가하세요.

<StackPanel Orientation="Vertical">
    <TextBlock FontSize="28" Margin="10,0,800,0">Files</TextBlock>
    <TextBlock x:Name="FilesBlock" FontSize="22" Height="600" Margin="10,0,800,0" />
</StackPanel>

4단계: 활성화 코드 추가

이 단계의 코드는 볼륨 디바이스의 루트 드라이브에 있는 폴더를 표시할 메서드를 호출합니다. AutoPlay 콘텐츠 이벤트의 경우, AutoPlay는 OnFileActivated 이벤트 도중 애플리케이션에 전달된 시작 인수에서 스토리지 디바이스의 루트 폴더를 전달합니다. 이 폴더는 파일 속성의 첫 번째 요소에서 검색할 수 있습니다.

App.xaml.cs 파일을 열고 다음 코드를 클래스에 추가하세요.

protected override void OnFileActivated(FileActivatedEventArgs args)
{
    var rootFrame = Window.Current.Content as Frame;
    var page = rootFrame.Content as MainPage;

    // Call ShowFolders with root folder from device storage.
    page.DisplayFiles(args.Files[0] as Windows.Storage.StorageFolder);

    base.OnFileActivated(args);
}

참고 항목

DisplayFiles 메서드는 다음 단계에서 추가됩니다.

5단계: 폴더가 표시되도록 코드 추가

MainPage.xaml.cs 파일에서 다음 코드를 MainPage 클래스에 추가하세요.

internal async void DisplayFiles(Windows.Storage.StorageFolder folder)
{
    foreach (Windows.Storage.StorageFile f in await ReadFiles(folder, ".ms"))
    {
        FilesBlock.Text += "  " + f.Name + "\n";
    }
}

internal async System.Threading.Tasks.Task<IReadOnlyList<Windows.Storage.StorageFile>>
    ReadFiles(Windows.Storage.StorageFolder folder, string fileExtension)
{
    var options = new Windows.Storage.Search.QueryOptions();
    options.FileTypeFilter.Add(fileExtension);
    var query = folder.CreateFileQueryWithOptions(options);
    var files = await query.GetFilesAsync();

    return files;
}

6단계: 애플리케이션 빌드 및 실행

  1. 앱을 빌드하고 디버그 모드로 배포하려면 F5를 누르세요.
  2. 앱을 실행하려면 메모리 카드 또는 다른 스토리지 디바이스를 PC에 삽입하세요. 그런 다음 AutoPlay 처리기 옵션 목록에서 앱을 선택하세요.

AutoPlay 이벤트 참조

AutoPlay 시스템을 사용하면 앱으로 다양한 디바이스 및 볼륨(디스크) 도착 이벤트에 등록할 수 있습니다. AutoPlay 콘텐츠 이벤트에 등록하려면 패키지 매니페스트에서 이동식 스토리지 기능을 사용하도록 설정해야 합니다. 이 표에는 등록할 수 있는 이벤트와 이벤트가 발생하는 시기가 나와 있습니다.

시나리오 이벤트 설명
카메라로 사진 사용하기 WPD\ImageSource Windows 이동식 디바이스로 식별되고 ImageSource 기능을 제공하는 카메라에 대해 발생합니다.
오디오 플레이어로 음악 사용하기 WPD\AudioSource Windows 이동식 디바이스로 식별되고 AudioSource 기능을 제공하는 미디어 플레이어에 대해 발생합니다.
비디오 카메라로 비디오 사용하기 WPD\VideoSource Windows 이동식 디바이스로 식별되고 VideoSource 기능을 제공하는 비디오 카메라에 대해 발생합니다.
연결된 플래시 드라이브 또는 외장 하드 드라이브에 액세스하기 StorageOnArrival 드라이브 또는 볼륨이 PC에 연결된 경우에 발생합니다. 드라이브 또는 볼륨의 디스크 루트에 DCIM, AVCHD 또는 PRIVATE\ACHD 폴더가 담겨 있으면 ShowPicturesOnArrival 이벤트가 대신 발생합니다.
대용량 스토리지에서 사진 사용하기(레거시) ShowPicturesOnArrival 드라이브 또는 볼륨의 디스크 루트에 DCIM, AVCHD 또는 PRIVATE\ACH 폴더가 담겨 있는 경우에 발생합니다. 사용자가 AutoPlay 제어판에서 각 유형의 미디어로 수행할 작업 선택을 사용하도록 설정한 경우, AutoPlay는 PC에 연결된 볼륨을 검사하여 디스크에 있는 콘텐츠의 유형을 확인합니다. 그림을 찾으면 ShowPicturesOnArrival이 발생합니다.
근접 공유 기능으로 사진 받기(탭 및 전송) ShowPicturesOnArrival 사용자가 근접(전송) 기능으로 콘텐츠를 전송하면 AutoPlay가 공유된 파일을 검사하여 콘텐츠 유형을 확인합니다. 그림을 찾으면 ShowPicturesOnArrival이 발생합니다.
대용량 스토리지에서 음악 사용하기(레거시) PlayMusicFilesOnArrival 사용자가 AutoPlay 제어판에서 각 유형의 미디어로 수행할 작업 선택을 사용하도록 설정한 경우, AutoPlay는 PC에 연결된 볼륨을 검사하여 디스크에 있는 콘텐츠의 유형을 확인합니다. 음악 파일을 찾으면 PlayMusicFilesOnArrival이 발생합니다.
근접 공유 기능으로 음악 받기(탭 및 전송) PlayMusicFilesOnArrival 사용자가 근접(전송) 기능으로 콘텐츠를 전송하면 AutoPlay가 공유된 파일을 검사하여 콘텐츠 유형을 확인합니다. 음악 파일을 찾으면 PlayMusicFilesOnArrival이 발생합니다.
대용량 스토리지에서 비디오 사용하기(레거시) PlayVideoFilesOnArrival 사용자가 AutoPlay 제어판에서 각 유형의 미디어로 수행할 작업 선택을 사용하도록 설정한 경우, AutoPlay는 PC에 연결된 볼륨을 검사하여 디스크에 있는 콘텐츠의 유형을 확인합니다. 비디오 파일을 찾으면 PlayVideoFilesOnArrival이 발생합니다.
근접 공유 기능으로 비디오 받기(탭 및 전송) PlayVideoFilesOnArrival 사용자가 근접(전송) 기능으로 콘텐츠를 전송하면 AutoPlay가 공유된 파일을 검사하여 콘텐츠 유형을 확인합니다. 비디오 파일을 찾으면 PlayVideoFilesOnArrival이 발생합니다.
연결된 디바이스에서 혼합 파일 집합 처리하기 MixedContentOnArrival 사용자가 AutoPlay 제어판에서 각 유형의 미디어로 수행할 작업 선택을 사용하도록 설정한 경우, AutoPlay는 PC에 연결된 볼륨을 검사하여 디스크에 있는 콘텐츠의 유형을 확인합니다. 특정 콘텐츠 유형(예: 그림)을 찾지 못하면 MixedContentOnArrival이 발생합니다.
근접 공유 기능으로 혼합 파일 집합 처리하기(탭 및 전송) MixedContentOnArrival 사용자가 근접(전송) 기능으로 콘텐츠를 전송하면 AutoPlay가 공유된 파일을 검사하여 콘텐츠 유형을 확인합니다. 특정 콘텐츠 유형(예: 그림)을 찾지 못하면 MixedContentOnArrival이 발생합니다.
광 미디어에서 비디오 처리하기 PlayDVDMovieOnArrival
PlayBluRayOnArrival
PlayVideoCDMovieOnArrival
PlaySuperVideoCDMovieOnArrival
광학 드라이브에 디스크를 삽입하면 자동 실행에서 파일을 검사하여 콘텐츠 종류를 확인합니다. 동영상 파일이 발견되면 광 디스크 종류에 해당하는 이벤트가 발생합니다.
광 미디어에서 음악 처리하기 PlayCDAudioOnArrival
PlayDVDAudioOnArrival
광학 드라이브에 디스크를 삽입하면 자동 실행에서 파일을 검사하여 콘텐츠 종류를 확인합니다. 음악 파일이 발견되면 광 디스크 종류에 해당하는 이벤트가 발생합니다.
강화된 디스크 재생하기 PlayEnhancedCDOnArrival
PlayEnhancedDVDOnArrival
광학 드라이브에 디스크를 삽입하면 자동 실행에서 파일을 검사하여 콘텐츠 종류를 확인합니다. EDD가 발견되면 광 디스크 종류에 해당하는 이벤트가 발생합니다.
쓰기 가능한 광 디스크 처리하기 HandleCDBurningOnArrival
HandleDVDBurningOnArrival
HandleBDBurningOnArrival
광학 드라이브에 디스크를 삽입하면 자동 실행에서 파일을 검사하여 콘텐츠 종류를 확인합니다. 쓰기 가능한 디스크가 발견되면 광 디스크 종류에 해당하는 이벤트가 발생합니다.
기타 디바이스 또는 볼륨 연결 처리하기 UnknownContentOnArrival AutoPlay 콘텐츠 이벤트와 일치하지 않는 콘텐츠를 찾은 경우 모든 이벤트에 대해 발생합니다. 이 이벤트는 사용하지 않는 것이 좋습니다. 처리할 수 있는 특정 AutoPlay 이벤트에 대해서만 애플리케이션을 등록해야 합니다.

AutoPlay가 볼륨에 대한 autorun.inf 파일의 CustomEvent 항목을 사용해서 사용자 지정 AutoPlay 콘텐츠 이벤트를 발생시키도록 지정할 수 있습니다. 자세한 내용은 Autorun.inf 항목을 참조하세요.

앱의 package.appxmanifest 파일에 확장을 추가하면 앱을 AutoPlay 콘텐츠 또는 AutoPlay 디바이스 이벤트 처리기로 등록할 수 있습니다. Visual Studio를 사용하는 경우 자동 실행 콘텐츠 또는 자동 실행 디바이스 선언을 선언 탭에 추가할 수 있습니다. 앱의 package.appxmanifest 파일을 직접 편집하는 경우 windows.autoPlayContent 또는 windows.autoPlayDevice범주로 지정하는 패키지 매니페스트에 확장 요소를 추가합니다. 그 예로 패키지 매니페스트의 다음 항목은 AutoPlay 콘텐츠 확장을 추가하여 앱을 ShowPicturesOnArrival 이벤트에 대한 처리기로 등록합니다.

  <Applications>
    <Application Id="AutoPlayHandlerSample.App">
      <Extensions>
        <Extension Category="windows.autoPlayContent">
          <AutoPlayContent>
            <LaunchAction Verb="show" ActionDisplayName="Show Pictures"
                          ContentEvent="ShowPicturesOnArrival" />
          </AutoPlayContent>
        </Extension>
      </Extensions>
    </Application>
  </Applications>