안녕하세요? 맨날맑음 입니다.

네이트온을 사용하다 보면 친구가 로그인 했더나 대화 요청이 들어올때 트레이 아이콘 주위에 알림창이 뜨는것을 볼 수  있습니다.

이와 같이 트레이창의 위치를 윈도우 주위로 위치하는 것은 .NET에서도 Win32API의 SystemParamete
rsInfo
를 사용하면 간단하게 구현 할 수 있습니다.

.NET에서 Win32API를 사용하기위해 우선 using System.Runtime.InteropServices; 이 필요합니다.
또한 SystemParametersInfo에 대한 아래와 같은 선언도 필요합니다.
 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int SystemParametersInfo(int uAction, int uParam, out RECT lpvParam, int fuWinIni);


SystemParametersInfo 함수를 호출하여 작업표시줄의 영역을 뺀 화면의 크기를 얻어 오기 위하여 RECT 구조체가 필요 하기 때문에 아래와 같이 임의로 RECT 구조체를 정의해 줍니다.
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
        public int left;
        public int top;
        public int right;
        public int bottom;
}
사실 SystemParametersInfo는 매우 다양한 기능을 수행하는 API입니다. 여러가지 시스템 정보를 설정하거나 가져 올 수 있습니다. 예를들어 바탕화면 이미지를 변경한다던지, 작업영역의 크기를 알아낼 수 도 있고, 화면보호기의 동작 유무를 제어 할 수도 있습니다. 인자에 따른 기능이 너무 많아서 좀더 자세한 기능을 알고 싶다면 아래의 링크에서 MSDN 도움말을 확인 하시면 됩니다.
http://msdn.microsoft.com/en-us/library/ms724947(VS.85).aspx

위에 그림에서 보듯이 작업표시줄의 트레이 아이콘 위에 윈도우를 띄우려면(무언가 보여주고 싶다면...) 작업표시줄의 영역을 제외한 윈도우의 실질적인 작업영역의 크기를 얻어오면 됩니다.
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int SystemParametersInfo(int uAction, int uParam, out RECT lpvParam, int fuWinIni);

        private void SetFormLocationToTray(Form form)
        {
            int SPI_GETWORKAREA = 0x0030; //작업영역을 알아오는 Flag
            RECT r = new RECT();
            SystemParametersInfo(SPI_GETWORKAREA, 0, out r, 0);
            Size s = form.Size;
            Point p = new Point(r.right - s.Width, r.bottom - s.Height); 
            form.Location = p;
        }
 
SetFormLocationToTray 함수는 인자로 들어온 Form 객체의 위치를 Tray 주위로 옮겨 주는 역할을 합니다.
SystemParametersInfo의 첫번째 인자중 0x0030(SPI_GETWORKAREA)을 넣으면 작업표시중을 뺀 작업영역의 크기를 3번째 인자의 RECT 구조체에 얻어오게 됩니다.
알아온 작업영역의 크기로 위의 소스에서 보는것 처럼 현재 폼의 크기에 따라 계산을 하여 폼의 location을 변경하여 네이트온처럼 트레이 주위에 윈도우가 뜨게 할 수 있습니다.
Posted by 맨날맑음

댓글을 달아 주세요

  1. 내가니악마다 2009.07.18 16:40 신고  댓글주소  수정/삭제  댓글쓰기

    이거 써본적 있는느낌

  2. Favicon of http://kwangho.tistory.com BlogIcon kwangho 2009.08.31 23:07  댓글주소  수정/삭제  댓글쓰기

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int SystemParametersInfo(int uAction, int uParam, out RECT lpvParam, int fuWinIni);

    private void SetFormLocationToTray(Form form)
    {
    int SPI_GETWORKAREA = 0x0030; //작업영역을 알아오는 Flag
    RECT r = new RECT();
    SystemParametersInfo(SPI_GETWORKAREA, 0, out r, 0);
    Size s = form.Size;
    Point p = new Point(r.right - s.Width, r.bottom - s.Height);
    form.Location = p;
    }

    을 어떻게 써야 하나요???

    폼을 넣어야 하나요?

    • Favicon of https://crynut84.tistory.com BlogIcon 맨날맑음 2009.09.01 14:20 신고  댓글주소  수정/삭제

      kwangho님 안녕하세요?
      SetFormLocationToTray 메서드는 인자로 받은 Form을 트레이 주위로 이동시키는 기능을 합니다~^^ 그러니 Form 트레이 주위에 생성하고 싶은 폼 객체를 넣으면 되겠죠?^^ 좋은하루 되세요

  3. Favicon of https://ndolson.com BlogIcon 엔돌슨 2009.09.01 20:04 신고  댓글주소  수정/삭제  댓글쓰기

    아하아하~ 감사합니다. Form을 생성해서 언제 넣어야 할까했는 데
    생성하고 Show하니깐 보이네요 ^^
    네이트온처럼 짠하고 나오게 하려고 고생하고 있습니다 ㅠ.ㅠ

    • Favicon of https://crynut84.tistory.com BlogIcon 맨날맑음 2009.09.02 13:52 신고  댓글주소  수정/삭제

      도움 대셨다니 다행이네요; 네이트온처럼 짠하고 나오게 하려면, 넣을 폼을 조금 수정해야겠네요; WPF의 경우는 스토리보드를 이용하면 간다히 되겠지만, 윈폼은 그냥 생각하기에 타이머로 Opercity를 조절하는 방법으로 해야할 꺼같군요, 또한 맨위의 타이틀바(?)도 없애야 할꺼같구요; 좋은하루 되세요^^

  4. Favicon of https://redreans.tistory.com BlogIcon 아르다 2011.02.11 10:14 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 잘 보고 갑니다..^^;
    한가지 질문이 있는데요..이 포스트를 보고 정말 잘 만들었는데요..이렇게 폼을 트레이 뜨게 했고..
    TopMost로 맨위에 보이게 했습니다..그런데 제가 다른 작업을 하고 있는 동안에 폼이 뜨게되면 포커스가
    폼으로 넘어가버리네요..이럴때 포커스는 그대로 두고 폼만 뜨게 할수 없을까요??