트 레이 프로그램 프 리 젠 테 이 션 - 알 람 Alert (전재)
트 레이 프로그램 을 만 드 는 관건 은 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: [인자 입력] 실행 할 동작 을 설명 합 니 다.동작 선택 값 은 다음 과 같 습 니 다:
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 에서 사용 할 아이콘 과 유사):
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 에 해당 하 는 특집 기사 가 있 으 니 스스로 찾 아 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.