트 레이 프로그램 프 리 젠 테 이 션 - 알 람 Alert (전재)

시스템 트 레이 (Tray) 에 있 는 프로그램 을 모두 보 셨 을 것 입 니 다. 본 고 는 이러한 트 레이 프로그램 Alert 를 만 드 는 방법 을 보 여 주 었 습 니 다.Alert 는 시스템 트 레이 에서 실행 되 는 작은 알 람 입 니 다. 설정 한 시간 후에 화면 보호 기 를 실행 하고 노래 를 재생 합 니 다.이 프로그램 은 아주 오래 전에 쓴 것 인 데 저 는 지금 VC++ 를 설치 하지 않 았 습 니 다. 그래서 본 논문 의 캡 처 는 모두 친구 Leoyin 이 만들어 서 저 에 게 보 내 준 것 입 니 다. (귀 찮 습 니 다. 하하) 여기 서도 그 에 게 감 사 를 드 립 니 다!
트 레이 프로그램 을 만 드 는 관건 은 Windows API - Shell 입 니 다.Notify Icon () 의 사용, 이 API 의 성명 은 ShellAPI. H 파일 에 포함 되 어 있 습 니 다.Stdafx. h 에서 "\# include < ShellAPI. H >"를 사용 하여 프로젝트 에 도입 하 십시오. 저 처럼 멍청 하지 마 십시오. 프로젝트 관리자 에 이 파일 을 도입 하여 현재 클래스 보기에 서 보고 싶 지 않 은 것 을 많이 보 게 되 었 습 니 다.나 도 이제 VC + IDE 로 수정 할 수 없 으 니 이렇게 하 자.
우선, 관련 함수 와 구 조 를 소개 합 니 다: ShellNotify Icon () 의 원형 과 설명 (최신 판) 은 다음 과 같 습 니 다.
BOOL Shell_NotifyIcon(
	DWORD dwMessage,
	PNOTIFYICONDATA lpdata
	);
매개 변수 및 반환 값 설명:
dwMessage: [인자 입력] 실행 할 동작 을 설명 합 니 다.동작 선택 값 은 다음 과 같 습 니 다:
  • NIM_ADD 트 레이 에 아이콘 추가
  • NIM_DELETE 트 레이 에서 아이콘 삭제
  • NIM_MODIFY 아이콘 수정
  • NIM_SETFOCUS 는 초점 (Focus) 을 트 레이 영역 으로 되 돌려 줍 니 다.이 메 시 지 는 보통 트 레이 아이콘 이 사용자 인터페이스 에서 작 동 한 후에 보 냅 니 다.예 를 들 어 트 레이 아이콘 이 단축 메뉴 를 표시 하고 사용자 가 ESC 키 를 누 르 면 작 동 합 니 다. 이때 NIM 을 사용 합 니 다.SETFOCUS 는 트 레이 에 초점 을 계속 유지 합 니 다.이 항목 은 시스템 케이스 와 상용 제어 DLL (Shlwapi. dll 과 Comctl32. dll) 5.0 이상 버 전에 서 만 사용 할 수 있 습 니 다.
  • NIM_SETVERSION 은 특정 버 전의 시스템 케이스 와 자주 사용 하 는 DLL 을 지정 합 니 다.결 성 치 는 0 으로 Win 95 방식 을 사용 하 는 것 을 나타 낸다.이 항목 은 시스템 케이스 와 상용 제어 DLL 5.0 이상 버 전에 서 만 사용 할 수 있 습 니 다.

  • lpdata: [입력 매개 변수] NOTIFIICONDATA 구 조 를 가리 키 는 지침 입 니 다.
    반환 값: 성공 시 함수 가 TRUE 로 돌아 갑 니 다. 그렇지 않 으 면 FALSE 입 니 다.
    NOTIFIICONDATA 구조 에 대한 설명 (최신 판) 은 다음 과 같다.
    typedef struct _NOTIFYICONDATA {
        DWORD cbSize;
        HWND hWnd;
        UINT uID;
        UINT uFlags;
        UINT uCallbackMessage;
        HICON hIcon;
        TCHAR szTip[64];
        DWORD dwState;
        DWORD dwStateMask;
        TCHAR szInfo[256];
        union {
            UINT uTimeout;
            UINT uVersion;
        };
        TCHAR szInfoTitle[64];
        DWORD dwInfoFlags;
        GUID guidItem;
    } NOTIFYICONDATA, *PNOTIFYICONDATA;

    cbSize
    바이트 의 구조 크기 로 서로 다른 버 전에 적응 합 니 다.
    hWnd
    윈도 메 시 지 를 받 는 창 핸들 입 니 다.
    uID
    트 레이 아이콘 의 ID 입 니 다.
    uFlags
    구조 에 유효한 데 이 터 를 포함 하 는 구성원 을 표시 합 니 다. 선택 가능 한 값: NIFICON, NIF_MESSAGE,NIF_TIP,NIF_STATE,NIF_INFO,NIF_GUID.
    uCallbackMessage
    사용자 정의 메시지 ID 를 되 돌려 줍 니 다.사용자 정의 메시지 처리 함수 와 연결 되 어 있 습 니 다.
    hIcon
    트 레이 아이콘 의 핸들.
    szTip
    트 레이 아이콘 의 알림 문자열 입 니 다.
    주의: 아래 데이터 구성원 제한
    시스템 케이스 와 상용 제어 DLL 5.0 이상 버 전이 유효 합 니 다!
    dwState
    아이콘 상태: NISHIDDEN - 숨 기기 또는 NISSHAREDICON - 시각.
    dwStateMask
    dwState 설정 에 사용 할 아이콘 상태 마스크
    szInfo
    풍선 모양 알림 (Balloon ToolTip) 의 문자열 입 니 다.
    uTimeout
    밀리초 단위 의 힌트 로 시간 을 표시 합 니 다.
    uVersion
    의존 하 는 버 전 을 확인 합 니 다.0-Win95,NOTIFYICON_VERSION-Win2000
    szInfoTitle
    풍선 형 힌트 의 제목
    dwInfoFlags
    풍선 모양 알림 에 사용 할 아이콘 설정 (Message Box 에서 사용 할 아이콘 과 유사):
  • NIIF_ERROR 오류
  • NIIF_INFO 정보
  • NIIF_NONE 아이콘 없 음
  • NIIF_경고 경고
  • NIIF_ICON_MASK 6.0 버 전 유지
  • NIIF_NOSOUND 는 6.0 버 전 으로 대응 하 는 소 리 를 재생 하지 않 습 니 다
  • guidItem
    6.0 버 전 유지
    이제 이 Alert 를 실현 합 시다.Alert 는 대화 상 자 를 기반 으로 한 Win 32 프로그램 입 니 다. AppWizard 를 이용 하여 만 듭 시다.그리고 이 대화 상 자 를 그림 과 같이 설계 하 십시오.
    AlertDlg. H 에 가입:
    #include < mmsystem.h >          //              ,  
    
    #define WM_NOTIFYICON	WM_USER+5  //      ID
    #define IDI_ICON		0x0005     //  ID
    #define IDT_APPLY		WM_USER+6  //        Timer      ID
    
    그리고 클래스 CAlertDlg 에 데이터 멤버 m 추가Interval 과 사용자 정의 멤버 함수 성명.마지막 으로 CAlertDlg 류 의 성명 을 만 듭 니 다. (주석 을 지 웠 습 니 다) 다음 과 같 습 니 다.
    class CAlertDlg : public CDialog
    {
    public:
    	~CAlertDlg();
    	CAlertDlg(CWnd* pParent = NULL);
    
    
    	enum { IDD = IDD_ALERT_DIALOG };
    	int	m_Interval;		//    ,      
    
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);
    
    
    protected:
    	void ShowMessage(void);  //              
    	HICON m_hIcon;  //    
    
    
    	virtual BOOL OnInitDialog();
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    
    
    	afx_msg void OnClickApply();  //"  "           
    	virtual void OnCancel();  //"  "           
    	afx_msg void OnTimer(UINT nIDEvent);  //         
    	afx_msg void OnClickHide();  //"  "           
    
    	//   WM_NOTIFYICON       
    	afx_msg void OnNotifyIcon(WPARAM wParam, LPARAM lParam);  
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  //        
    	afx_msg BOOL OnQueryEndSession();  //Windows        
    
    
    	DECLARE_MESSAGE_MAP()
    };
    
    다음은 AlertDlg. CPP 에서 해당 하 는 함수 의 실현 (앵 커 점 을 설정 하 는 것 이 좋 습 니 다):
    BOOL CAlertDlg::OnInitDialog()
    {
    	SetIcon(m_hIcon, TRUE);
    	SetIcon(m_hIcon, FALSE);
    	
    	//        
    	CSpinButtonCtrl * pSpin;
    	pSpin = (CSpinButtonCtrl *) GetDlgItem(IDC_SPIN);
    	pSpin->SetRange(5,150);
    	m_Interval = 30;
    	CDialog::OnInitDialog();
    	
    	//      ,      
    	SetTimer(1, 1000, NULL);
    
    	//          
    	NOTIFYICONDATA nd;
    	nd.cbSize	= sizeof (NOTIFYICONDATA);
    	nd.hWnd	= m_hWnd;
    	nd.uID	= IDI_ICON;
    	nd.uFlags	= NIF_ICON|NIF_MESSAGE|NIF_TIP;
    	nd.uCallbackMessage= WM_NOTIFYICON;
    	nd.hIcon	= m_hIcon;
    
    	strcpy(nd.szTip, "    ");
    	
    	Shell_NotifyIcon(NIM_ADD, &nd);
    	
    	return TRUE;
    }
    void CAlertDlg::OnClickApply() 
    {
    	//       
    	UpdateData();
    	OnTimer(IDT_APPLY);
    }
    void CAlertDlg::OnCancel() 
    {
    	//      
    	KillTimer(1);
    
    	//            
    	NOTIFYICONDATA nd;
    	nd.cbSize	= sizeof (NOTIFYICONDATA);
    	nd.hWnd	= m_hWnd;
    	Shell_NotifyIcon(NIM_DELETE, &nd);
    	
    	CDialog::OnCancel();
    }
    void CAlertDlg::OnTimer(UINT nIDEvent) 
    {
    	static CString	strTemp;
    	static int		Count = 0;
    	COleDateTime	dtTime;
    
    	//        
    	//                 ,      ?
    	dtTime = COleDateTime::GetCurrentTime();  
    	strTemp.Format("     %02i:%02i:%02i ",
    			dtTime.GetHour(),
    			dtTime.GetMinute(),
    			dtTime.GetSecond());
    	GetDlgItem(IDC_CURTIME)->SetWindowText(strTemp);
    
    	//        
    	if (nIDEvent == IDT_APPLY) Count = 0;  //            ,       
    	Count++;
    	int RestTime;
    	RestTime = m_Interval - Count/60;
    	if (RestTime <= 0) 
    	{
    		Count = 0;
    		ShowMessage();
    	}
    	
    	strTemp.Format("        %i   ", RestTime);
    	GetDlgItem(IDC_RESTTIME)->SetWindowText(strTemp);	
    	CDialog::OnTimer(nIDEvent);
    }
    
    //이 ShowMessassge () 함수, 당신들 이 직접 수정 해 야 합 니 다. 제 코드 는 너무 딱딱 합 니 다.
    void CAlertDlg::ShowMessage()
    {
    	//  C:/InfoCD/WinaMP/  WinaMP3  Music.m3u  
    	::WinExec("C://INFOCD//WINAMP//WINAMP.EXE music.m3u",SW_HIDE);
    	
    	MessageBox("        ......", 
    			"  ", 
    			MB_SYSTEMMODAL|MB_OK|MB_ICONEXCLAMATION|MB_ICONWARNING);
    
    	//  C:/Windows/System      
    	ShellExecute(m_hWnd,"open","C://WINDOWS//SYSTEM//  .scr", NULL,NULL,SW_SHOWNORMAL);
    }
    afx_msg void CAlertDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
    {
    	//            
    	//wParam         ID,lParam   Windows   
    	if ((wParam == IDI_ICON)&&(lParam == WM_LBUTTONDOWN))
    		ShowWindow(SW_SHOWNORMAL);
    }
    void CAlertDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	//      (MFC Bug?),            
    	if (nID == SC_MAXIMIZE)
    		return;
    	if (nID == SC_MINIMIZE)
    		ShowWindow(SW_HIDE);
    	else
    		CWnd::OnSysCommand(nID, lParam);
    }
    BOOL CAlertDlg::OnQueryEndSession()
    {
    	//      Windows         
    	CAlertDlg::OnCancel();
    	return TRUE;
    }
    
    void CAlertDlg::OnClickHide() 
    {
    	OnSysCommand(SC_MINIMIZE, 0x0000);
    	return;
    }
    
    자, 위의 소스 코드 를 읽 으 면서 트 레이 프로그램의 생 성에 대해 어느 정도 인식 을 가지 게 되 었 다 고 생각 합 니 다. 이것 도 본 고의 근본 적 인 목적 입 니 다.다만 이 프로그램 에 버그 가 있 습 니 다. 프로그램 이 종 료 된 후에 도 아이콘 이 트 레이 에 표시 되 어 있 습 니 다. 마 우 스 를 아이콘 위 에 올 려 야 사라 집 니 다.이 bug 는 누군가가 해결 방법 을 제시 한 것 을 기억 합 니 다. 아이콘 핸들 을 풀 려 고 하 는 것 같 습 니 다.애석 하 게 도 나 는 기억 이 나 지 않 는 다. 이 절차 도 다시 수정 하지 않 았 다.
    진심으로 여러분 이 저 에 게 회답 해 주시 기 를 바 랍 니 다. 감사합니다!
    참고 글:
    1. MSDN 의 관련 링크: The Taskbar, Tray Not Sample,
    2. VCKbase 에 도 우수한 글 이 적지 않다 (예 를 들 어 NorthTibet 이 컴 파일 한 '시스템 트 레이 프로 그래 밍 완전 가이드').
    하드디스크 에 있 는 MSDN 에 해당 하 는 특집 기사 가 있 으 니 스스로 찾 아 보 세 요.

    좋은 웹페이지 즐겨찾기