Windows Service Process

주로 시스템 트레이에 등록되어 있는 프로그램들로

화면(창)이 사라져도 프로그램이 종료되지 않고 계속 실행되고 있는 것들.

 

Shell Interface: 데이타나 파일이나 디렉토리등을 보여줄 수 있는 화면

 

1. 프로그램 실행시 트레이에 아이콘이 들어가게 함

-트레이에 아이콘이 박히는 시점 결정. 함수가 호출되는 시점

 

1.1 함수 구현(트레이에 아이콘이 박히는 시점과 관련된)

응용프로그램에서의 편리한 제어를 위해 MainFrame에 구현

 

MainFrame.h파일에 원형 선언

void ViewTray(void);

 

MainFrame.cpp파일에 코드 구현

 // CMainFrame 메시지 처리기

 

 void CMainFrame::ViewTray(void)
  {
  NOTIFYICONDATA nid;
  ::ZeroMemory(&nid, sizeof(nid));
 
  nid.cbSize     =sizeof(nid);
  nid.hWnd     =m_hWnd;
  nid.uID      =IDR_MAINFRAME;
  nid.uFlags     =NIF_MESSAGE | NIF_ICON | NIF_TIP;
  nid.uCallbackMessage =UM_TRAY;
  nid.hIcon     =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  wsprintf(nid.szTip, _T("%s"), _T("메롱!"));
 
  ::Shell_NotifyIcon(NIM_ADD, &nid);  // 트레이 아이콘에 넣음
 }

 

1.2 전역헤더(stdafx.h)에 UM_TRAY 메시지 선언

#define UM_TRAY WM_USER + 100

 

ViewTray함수 구현만 하고 아직 호출하지는 않았으므로 이 단계까지는 아직 트레이에 들어가지 않는다.

프로그램이 실행되면 바로 트레이에 들어가도록 하기 위해

이 함수가 호출되는 시점은... 메인 프레임이 다 완성된 후에 시스템 트레이에 올려주기 위해

OnCreate함수에서 리턴되기 직전에 호출해 주는 것이 좋다.

 

트레이 영역에 아이콘을 넣는 것은 윈도우의 쉘서비스가 하는 일.

프로그래머는 구조체를 채워 던져주는 역할만.

 

2. 창을 닫아도 시스템트레이에서 사라지지 않도록.

 Onclose메시지 재정의

-프로그램이 종료되지 않도록 OnClose함수가 실해되지 않게 해주고

창은 숨겨준다.

void CMainFrame::OnClose()
{
 ShowWindow(SW_HIDE);
 // CFrameWndEx::OnClose(); // 응용 프로그램의 종료를 막기위해 주석처리.
}

 

3. 아이콘을 더블클릭하면 프로그램이 다시 실행되도록.

트레이 아이콘이 메시지를 받을 수 있도록 한다.

 

 

윈도우를 종료할 때

 

WM_Close

WM_Destory

WM-Quit

 

순서로 메시지 큐에 쌓이면서 윈도우가 종료됨

Quit은 응용프로그램을 완전히 종료하므로 개발자가 재정의 할 수 없음.

 

Onclose에 넣었을 경우 응용프로그램이 종료되는것 위에서 확인했음

 

따라서, WM_Destory를 이용해서 창을 닫아도 트레이에서 아이콘이 사라지지 않도록 해준다.

 

void CMainFrame::OnDestroy()
{
 NOTIFYICONDATA nid;
 nid.cbSize    =sizeof(nid);
 nid.hWnd    =m_hWnd;
 nid.uID     =IDR_MAINFRAME;

 ::Shell_NotifyIcon(NIM_DELETE, &nid);

 CFrameWndEx::OnDestroy();

}

 

cf.) 프로그램이 실행되는 순서? 이벤트 발생-메시지발생-메시지에 대응하는 이벤트 처리 함수

 

4. 리소스뷰-Menu-리소스뷰 추가

 

EXIT, ABOUT버튼은 따로 코드 구현필요없이 속성-ID수정으로 가능(ID_APP_EXIT, ID_APP_ABOUT로)

 

5. 이벤트처리기(사용자 정의 함수) 생성

 

선언(사용자 정의 함수의 선언은 메시지 맵 함수 안에.)-MainFrm.h

사용자 정의 함수의 선언은 메시지 맵 함수 안에.

// 생성된 메시지 맵 함수
protected:
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnApplicationLook(UINT id);
 afx_msg void OnUpdateApplicationLook(CCmdUI* pCmdUI);
 afx_msg void OnFilePrint();
 afx_msg void OnFilePrintPreview();
 afx_msg void OnUpdateFilePrintPreview(CCmdUI* pCmdUI);
 DECLARE_MESSAGE_MAP()

 void InitializeRibbon();
public:
 afx_msg LRESULT OnTray(WPARAM wParam, LPARAM lParam);
 afx_msg void OnClose();
 afx_msg void OnDestroy();
};

메시지 맵 등록

 

 

구현-MainFrm.cpp

LRESULT CMainFrame::OnTray(WPARAM wParam, LPARAM lParam)
{
 if (lParam == WM_RBUTTONDOWN)
 {
  SetCapture();
 }
 else if(lParam == WM_RBUTTONDOWN)
 {
  CMenu menu, *pMenu = NULL;
  CPoint pt;

  menu.LoadMenu(IDR_MENU1);
  pMenu = menu.GetSubMenu(0);

  GetCursorPos(&pt);
  SetForegroundWindow();
  pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, this);

  ::PostMessage(m_hWnd, WM_NULL, 0, 0);
  ReleaseCapture();
 }
 else if (lParam == WM_LBUTTONDBLCLK)
 {
  ShowWindow(SW_SHOW);
  SetForegroundWindow();
 }
 return 0;
}

6. 리소스뷰-MainFrame 메뉴 추가

.....


'PROGRAMMING > MFC(C++)' 카테고리의 다른 글

Dialog에서 Enter키 종료 방지  (0) 2012.02.23
소켓 프로그래밍 주요함수  (0) 2011.04.27
[0425수업] dll파일 만들기  (0) 2011.04.25
[0425수업] ClipBoard  (0) 2011.04.25
[0422수업] IPC통신  (0) 2011.04.22
Posted by 마마필로 :