728x90

지금 Windows 10에서 Notification 을 해주는 프로그램을 만들려고 했는데, 보니까, UWP와 같은 유형의 프로젝트에서만 가능한 API를 사용해야 했다. 처음에 프로젝트의 일부 설정 바꿔서하는 방법을 해봤는데, 확인해보니, 1908 버전 이후의 Windows 10의 경우에는 이 기능이 안된다고 한다.

그래서 구글링을 해보니 나와 같은 유사 문제가 발생했었고, 여기서는 좀 색다른 방법을 제시하여 포스팅 한다. 원문은 아래의 링크를 통해서 확인하면 된다. 사실 원문에서는 WPF 프로젝트를 만들었는데, UWP로 만들지 않고 처리하는 방법이지만, WinForm으로 해보니 잘 되었다.

www.thomasclaudiushuber.com/2019/04/26/calling-windows-10-apis-from-your-wpf-application/

 

Calling Windows 10 APIs From Your WPF Application

Did you know that you can call Windows 10 WinRT APIs from your WPF and WinForms apps? In this blog post I’ll show you how to display toast messages from a WPF application by using the Windows…

www.thomasclaudiushuber.com

지금 만들고 싶은 것은 Windows 10의 알림센터에 알림을 자동으로 내보내는 도구를 만들려고 한다. 여기 포스팅하는 예제는 그 프로그램을 만들면서 하는 방식들이다.

다만, 이 개발 작업은 Windows 10 2H02 버전 위에서 Visual Studio 2019로 했다.

 

WinForm 만들기

WinForm 프로젝트는 기본대로 만들면 된다. 다만, 사용하는 .NET Framework 버전을 4.8로 했다. 이 내용을 적용하려면, 최소 .NET Framework 4.5 이상이라고 했는데, 4.5에서 잘 안되는 것 같아, 내 Visual Studio에서 갖는 최신 버전인 4.8로 했다.

NuGet 패키지 관리를 띄운다.

NuGet 패키지 관리 도구가 뜨면, "찾아보기" 탭에서 "Microsoft.Windows.SDK.Contracts"를 검색어로 넣어 찾는다,

찾았으면, 해당 내용에 대한 Install 버튼을 누르고, 라이선스에 "동의함"을 하면 된다.

일단, 위의 패키지만 설치되면 기본적인 준비는 끝난다.

 

알림 메시지 전송 Application 만들기.

일정 주기에 따라 실행되는 코드를 만들기는 하겠지만, 여기서는 알림센터에 알림을 띄우는데에 있으니, 대충 Button 누르면 알림 메시지가 뜰 수 있게 만들 예정이다. 

먼저 WinForm(Form1.cs)의 디자이너 화면을 띄워 Button을 추가한다.

자 이제 해당 Button의 OnClick 이벤트에 대한 핸들러 코드를 생성한 뒤에 다음 코드를 추가한다.

string title = "이 알림 테스트는 말이죠, 현재시간을 알려줍니다.";
string timeString = $"현재 시간은 말이죠~ {DateTime.Now:HH:mm:ss} 입니다.";
string thomasImage = "https://www.thomasclaudiushuber.com/thomas.jpg";

string toastXmlString =
   $@"<toast><visual>
            <binding template='ToastGeneric'>
            <text>{title}</text>
            <text>{timeString}</text>
            <image src='{thomasImage}'/>
            </binding>
        </visual></toast>";

var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(toastXmlString);

var toastNotification = new ToastNotification(xmlDoc);

var toastNotifier = ToastNotificationManager.CreateToastNotifier();
toastNotifier.Show(toastNotification);

그런데 보면, XmlDocument, ToastNotification, ToastNotificationManager 등이 붉은색 글자로 참조가 안걸려 있다고 한다. 이 항목들에 대한 using을 걸어주는데, 단! 이 모든 모듈들은 Windows.UI, Windows.Data 라는 이름으로 시작되는 Namespace에서 using을 걸어야 한다. 특히 XmlDocument의 경우 System.Xml과 겹칠 수 있는데, 절대 System.Xml을 걸면 안된다!

XmlDocument는 반드시 Windows.Data.Xml.Dom 을 걸어준다.

나머지 ToastNotification과 ToastNotificationManager는 Windows.UI에서 걸면 된다.

붉은색 표시 없이 말짱하게 나오면 된다.

코드까지는 모두 준비되었고, 컴파일도 된다. 

그런데 실행하면 ToastNotificationManager.CreateToastNotifier() 에서 계속 Exception이 발생한다.

왜 이럴까.. 처음에는 나도 잘 몰랐는데 원문 포스팅 글을 보니, 저 문제는 Windows 10 1809 버전 이후 보안 문제로 인해 UWP 프로젝트에서 처럼 고유 ID를 갖는 Application이 아니면 API 사용이 불가능하게 되었다고 한다. 즉 이 WinForm 프로그램을 마치 Windows 10 Application 처럼 구성하도록 해야한다는 것이다. 결론은 UWP 로 개발하라는 것인데... 다행히 해당 블로그 포스트에서는 해결 방법을 제시한다.

Windows App으로 둔갑시키기

결론적으로는 Windows App과 같은 설치용 프로그램으로 만들어 실행하면 된다고 한다. 여기서는 이를 위한 작업을 수행한다. 

먼저 솔루션 위에서 메뉴를 띄워 "추가"를 선택하고, "새 프로젝트"를 선택하면 된다. 

프로젝트 종류를 고르는 창이 뜨는데, 이 창의 오른쪽 위의 검색창을 이용해 "패키징" 혹은 "Packaging" 이라고 검색어를 넣으면 "Windows Application Packaging Project" 라는 항목을 볼 수 있다. 이 항목을 고르면 된다.

뭐 이름은 대충 지어도 된다. 나는 기본 값을 그대로 넣었다.

그러면 이 Application이 지원하게 되는 Windows 버전을 선택하는 것이 나온다. 기본 Windows 10 버전과, 최소 버전을 설정한다. 현재 Visual Studio 설치시 적용했던 SDK 버전 만큼 선택이 가능하며, 자신이 사용할 API 들의 버전을 잘 고려해주어야 한다. 특별한 기능적인 이슈가 없다면 기본 값으로 설정하면 된다. 다만 실행할 곳의 Windows 버전이 너무 낮다면 어느 정도 고려를 해줘야 할 수도 있다.

새롭게 추가된 프로젝트에서 "Application" 이란 위치에서 메뉴를 띄워 "참조 추가"를 한다.

선택 창이 나오는데 여기서 우리 프로그램을 걸어주면 된다.

이제 이 새로만든 프로젝트에서 "시작 프로젝트로 설정"을 해주고 실행한다.

만약 UWP 개발을 한번도 해본적이 없는 경우 Windows 10 설정에서 "개발자용" 항목이 뜨게 된다. 이 새로 만든 UWP가 Microsoft Store를 통하지 않고 바로 실행할 수 있게 하는 설정이다. 일단 해당 기능을 "켬"으로 하면 실행이 가능하다.

 

그러면 오른편 아래 쪽에 우리가 원하는 기능이 활성화되어 알림을 띄워 주게 된다.

728x90

+ Recent posts