|
|
//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1996.
//
// File: tasks.cxx
//
// Contents: Tray notification icon for Job Scheduler service.
//
// Classes: CTrayIcon
//
// Functions: None.
//
// History: 3/22/1996 RaviR Created
//
//____________________________________________________________________________
#include "..\pch\headers.hxx"
#pragma hdrstop
#include <svc_core.hxx>
#include "tasks.hxx"
extern HINSTANCE g_hInstance; extern HWND g_hwndSchedSvc;
//____________________________________________________________________________
//
// Member: CTrayIcon::_TrayMessage
//
// Synopsis: S
//
// Arguments: [dwMessage] -- IN Msg to Shell_NotifyIcon
// [uiIcon] -- IN Tray icon id
// [ids] -- IN Tool tip string id.
//
// Returns: HRESULT.
//
// History: 3/22/1996 RaviR Created
//
//____________________________________________________________________________
BOOL CTrayIcon::_TrayMessage( DWORD dwMessage, UINT uiIcon, int ids) { NOTIFYICONDATA tnd;
schDebugOut((DEB_ITRACE, "_TrayMessage: g_hwndSchedSvc = %x, dwMessage = %s, " "uiIcon = %u\n", g_hwndSchedSvc, dwMessage == NIM_ADD ? "NIM_ADD" : dwMessage == NIM_MODIFY ? "NIM_MODIFY" : "NIM_DELETE", uiIcon));
tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = g_hwndSchedSvc; tnd.uID = 0; tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnd.uCallbackMessage = SCHEDM_TRAY_NOTIFY;
if (m_hTrayIcon != NULL) { DestroyIcon(m_hTrayIcon); m_hTrayIcon = NULL; }
if (uiIcon != NULL) { m_hTrayIcon = (HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(uiIcon), IMAGE_ICON, 16, 16, 0); } tnd.hIcon = m_hTrayIcon;
if (ids != 0) { LoadString(g_hInstance, ids, tnd.szTip, sizeof(tnd.szTip)); } else { tnd.szTip[0] = TEXT('\0'); }
return Shell_NotifyIcon(dwMessage, &tnd); }
//____________________________________________________________________________
//
// Function: Schedule_TrayNotify
//
// Synopsis: Notify handler for notifications from the scheduler tray icon.
//
// Arguments: [wParam] -- IN
// [lParam] -- IN
//
// Returns: void
//
// History: 3/22/1996 RaviR Created
//
//____________________________________________________________________________
void Schedule_TrayNotify( WPARAM wParam, LPARAM lParam) { if (lParam == WM_RBUTTONDOWN) { //
// Popup the context menu. {open, pause}
//
HMENU popup; HMENU subpopup; POINT mousepos;
popup = LoadMenu(g_hInstance, GetCurrentServiceState() == SERVICE_PAUSED ? MAKEINTRESOURCE(IDR_TRAY_ICON_POPUP_MENU_CONTINUE) : MAKEINTRESOURCE(IDR_TRAY_ICON_POPUP_MENU_PAUSE));
if (popup) { int suspended;
subpopup = GetSubMenu(popup, 0);
if( subpopup ) { SetMenuDefaultItem(subpopup, 0, MF_BYPOSITION);
if (GetCursorPos(&mousepos)) { SetForegroundWindow(g_hwndSchedSvc);
TrackPopupMenuEx(subpopup, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, mousepos.x, mousepos.y, g_hwndSchedSvc, NULL); }
RemoveMenu(popup, 0, MF_BYPOSITION); DestroyMenu(popup); DestroyMenu(subpopup); } else //if we failed clean up first
{ RemoveMenu(popup, 0, MF_BYPOSITION); DestroyMenu(popup); } }
} else if (lParam == WM_LBUTTONDBLCLK) { OpenJobFolder(); } }
//____________________________________________________________________________
//
// Function: OpenJobFolder
//
// Synopsis: Opens the job folder on the local machine.
//
// Returns: void
//
// History: 3/22/1996 RaviR Created
//
//____________________________________________________________________________
#define BREAK_ON_FAIL(hr) if (FAILED(hr)) { break; } else 1;
#define CMD_ID_FIRST 1
#define CMD_ID_LAST 0x7fff
void OpenJobFolder(void) {
//
// Browse the jobs folder
//
HCURSOR hcWait = SetCursor(LoadCursor(NULL, IDC_WAIT)); HRESULT hr = S_OK; LPSHELLFOLDER pshf = NULL; LPCONTEXTMENU pcm = NULL; HMENU hmenu = NULL;
// "::CLSID_MyComputer\\::CLSID_TasksFolder"
WCHAR buf1[200] = L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{d6277990-4c6a-11cf-8d87-00aa0060f5bf}";
do { hr = SHGetDesktopFolder(&pshf);
CHECK_HRESULT(hr); BREAK_ON_FAIL(hr);
ULONG chEaten, dwAttributes; LPITEMIDLIST pidl;
hr = pshf->ParseDisplayName(NULL, 0, buf1, &chEaten, &pidl, &dwAttributes);
CHECK_HRESULT(hr); BREAK_ON_FAIL(hr);
hr = pshf->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST *)&pidl, IID_IContextMenu, NULL, (void**)&pcm);
CHECK_HRESULT(hr); BREAK_ON_FAIL(hr);
hmenu = CreatePopupMenu();
if (hmenu == NULL) { hr = E_OUTOFMEMORY; CHECK_HRESULT(hr); break; }
#ifdef _CHICAGO_
CMINVOKECOMMANDINFO ici = { sizeof(CMINVOKECOMMANDINFO), CMIC_MASK_ASYNCOK, NULL, NULL, NULL, NULL, SW_NORMAL, }; #else
CMINVOKECOMMANDINFOEX ici = { sizeof(CMINVOKECOMMANDINFOEX), CMIC_MASK_ASYNCOK, NULL, NULL, NULL, NULL, SW_NORMAL, }; #endif
UINT idCmd; UINT fFlags = CMF_DEFAULTONLY;
hr = pcm->QueryContextMenu(hmenu, 0, CMD_ID_FIRST, CMD_ID_LAST, fFlags);
CHECK_HRESULT(hr); BREAK_ON_FAIL(hr);
idCmd = GetMenuDefaultItem(hmenu, MF_BYCOMMAND, 0);
SetCursor(hcWait); hcWait = NULL;
if (idCmd) { ici.lpVerb = (LPSTR)MAKEINTRESOURCE(idCmd - CMD_ID_FIRST);
hr = pcm->InvokeCommand((LPCMINVOKECOMMANDINFO)&ici);
CHECK_HRESULT(hr); }
} while (0);
if (hmenu != NULL) { DestroyMenu(hmenu); }
if (pcm != NULL) { pcm->Release(); }
if (pshf != NULL) { pshf->Release(); }
if (hcWait != NULL) { SetCursor(hcWait); } }
|