|
|
// SAFInciTrayIcon.cpp: implementation of the CSAFInciTrayIcon class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SAFInciTrayIcon.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
const UINT CSAFInciTrayIcon::WM_TASKBARCREATED = ::RegisterWindowMessage(_T("TaskbarCreated")); DWORD CSAFInciTrayIcon::dwThreadId = 0; BOOL CSAFInciTrayIcon::m_bVisible = FALSE; NOTIFYICONDATA CSAFInciTrayIcon::m_tnd;
#define CHANNEL_PATH TEXT("\\PCHEALTH\\HelpCtr\\Binaries\\HelpCtr.exe -FromStartHelp -Url \"hcp://CN=Microsoft Corporation,L=Redmond,S=Washington,C=US/Remote%20Assistance")
#define ID_SAFINCIDENT_ICON 1
const TCHAR cstrToolTip[] = _T("Remote Assistance - %d tickets");
CSAFInciTrayIcon::CSAFInciTrayIcon(UINT &nRefCount):m_nRefCount(nRefCount) { m_wIconId = IDI_NORMALINCIDENT; }
BOOL CSAFInciTrayIcon::RemoveTrayIcon() { m_tnd.uFlags = 0; if (m_bVisible == TRUE) { if (Shell_NotifyIcon(NIM_DELETE, &m_tnd)) m_bVisible = FALSE; } return m_bVisible; }
BOOL CSAFInciTrayIcon::AddTrayIcon() { ZeroMemory(&m_tnd, sizeof(m_tnd));
m_tnd.cbSize = sizeof(NOTIFYICONDATA); m_tnd.hWnd = m_hWnd; m_tnd.uID = ID_SAFINCIDENT_ICON; m_tnd.hIcon = ::LoadIcon(_Module.m_hInst, (LPCWSTR)m_wIconId); m_tnd.uCallbackMessage = WM_ICON_NOTIFY; m_tnd.uFlags = NIF_MESSAGE | NIF_ICON ;
if (m_nRefCount) { m_tnd.uFlags |= NIF_TIP; TCHAR strbuf[64] = _T(""); wsprintf(strbuf,cstrToolTip,m_nRefCount); _tcsncpy(m_tnd.szTip, strbuf, 64); } m_bVisible = Shell_NotifyIcon(NIM_ADD, &m_tnd);
m_tnd.uFlags = 0; m_tnd.uVersion = NOTIFYICON_VERSION;
if (m_bVisible == TRUE) { Shell_NotifyIcon(NIM_SETVERSION, &m_tnd); } return m_bVisible; }
BOOL CSAFInciTrayIcon::ChangeToolTip() { NOTIFYICONDATA IconData = {0};
IconData.cbSize = sizeof(NOTIFYICONDATA); IconData.hWnd = m_hWnd; IconData.uID = ID_SAFINCIDENT_ICON; if (m_nRefCount) { IconData.uFlags = NIF_TIP; TCHAR strbuf[64] = _T(""); wsprintf(strbuf,cstrToolTip,m_nRefCount); _tcsncpy(IconData.szTip, strbuf, 64); Shell_NotifyIcon(NIM_MODIFY, &IconData); } return TRUE; }
BOOL CSAFInciTrayIcon::ModifyIcon() { NOTIFYICONDATA IconData = {0};
IconData.cbSize = sizeof(NOTIFYICONDATA); IconData.hWnd = m_hWnd; IconData.uID = ID_SAFINCIDENT_ICON; IconData.hIcon = ::LoadIcon(_Module.m_hInst, (LPCWSTR)m_wIconId); IconData.uFlags = NIF_ICON; Shell_NotifyIcon(NIM_MODIFY, &IconData);
return TRUE; }
BOOL CSAFInciTrayIcon::ShowBalloon(LPCTSTR szText, LPCTSTR szTitle /*=NULL*/, DWORD dwIcon /*=NIIF_NONE*/, UINT uTimeout /*=10*/ ) { m_tnd.uFlags = NIF_INFO; _tcsncpy(m_tnd.szInfo, szText, 256); if (szTitle) _tcsncpy(m_tnd.szInfoTitle, szTitle, 64); else m_tnd.szInfoTitle[0] = _T('\0'); m_tnd.dwInfoFlags = dwIcon; m_tnd.uTimeout = uTimeout * 1000; // convert time to ms
BOOL bSuccess = Shell_NotifyIcon (NIM_MODIFY, &m_tnd);
// Zero out the balloon text string so that later operations won't redisplay
// the balloon.
m_tnd.szInfo[0] = _T('\0');
return bSuccess; }
DWORD WINAPI CSAFInciTrayIcon::SAFInciTrayIconThreadFn(LPVOID lpParameter) { CSAFInciTrayIcon *pThis = (CSAFInciTrayIcon*)lpParameter;
HWND hWnd = pThis->Create(NULL,CWindow::rcDefault);
if (::IsWindow(hWnd) == FALSE) return FALSE;
MSG msg; while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
pThis->RemoveTrayIcon(); return TRUE; }
LRESULT CSAFInciTrayIcon::OnTrayNotification(UINT wParam, LONG lParam) { if (LOWORD(lParam) == WM_LBUTTONDBLCLK) { TCHAR szCommandLine[2048]; STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcInfo;
ZeroMemory(&StartupInfo,sizeof(StartupInfo)); StartupInfo.cb = sizeof(StartupInfo);
TCHAR szWinDir[2048]; GetWindowsDirectory(szWinDir, 2048); _stprintf(szCommandLine, _T("%s%s/rcBuddy.htm?CheckStatus=1"), szWinDir,CHANNEL_PATH); BOOL bRetVal = CreateProcess(NULL,szCommandLine,NULL,NULL,TRUE,CREATE_NEW_PROCESS_GROUP,NULL,NULL,&StartupInfo,&ProcInfo);
if (!bRetVal) { TCHAR buff[50]; DWORD dwLastError = GetLastError(); wsprintf(buff,_T("%d"),dwLastError); MessageBox(buff); } CloseHandle(ProcInfo.hThread); CloseHandle(ProcInfo.hProcess); } return 1; }
LRESULT CSAFInciTrayIcon::OnIconNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { OnTrayNotification(wParam,lParam); return 0; }
LRESULT CSAFInciTrayIcon::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { AddTrayIcon(); return 0; }
LRESULT CSAFInciTrayIcon::OnTaskBarCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { AddTrayIcon(); return 0; }
|