//____________________________________________________________________________ // // 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 #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); } }