Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

183 lines
4.8 KiB

// 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;
}