WindowsXP-SP1/admin/services/sched/service/tasks.cxx
2020-09-30 16:53:49 +02:00

293 lines
6.9 KiB
C++

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