Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1076 lines
25 KiB

/*++
Copyright (C) 1996-1999 Microsoft Corporation
Module Name:
smonprop.cpp
Abstract:
Sysmon property page base class.
--*/
#include "polyline.h"
#include <strsafe.h>
#include "smonprop.h"
#include "genprop.h"
#include "ctrprop.h"
#include "grphprop.h"
#include "srcprop.h"
#include "appearprop.h"
#include "unihelpr.h"
#include "utils.h"
#include "smonhelp.h"
#include "globals.h"
static ULONG
aulControlIdToHelpIdMap[] =
{
IDC_CTRLIST, IDH_CTRLIST, // Data
IDC_ADDCTR, IDH_ADDCTR,
IDC_DELCTR, IDH_DELCTR,
IDC_LINECOLOR, IDH_LINECOLOR,
IDC_LINEWIDTH, IDH_LINEWIDTH,
IDC_LINESTYLE, IDH_LINESTYLE,
IDC_LINESCALE, IDH_LINESCALE,
IDC_GALLERY_REPORT, IDH_GALLERY_REPORT, // General
IDC_GALLERY_GRAPH, IDH_GALLERY_GRAPH,
IDC_GALLERY_HISTOGRAM, IDH_GALLERY_HISTOGRAM,
IDC_VALUEBAR, IDH_VALUEBAR,
IDC_TOOLBAR, IDH_TOOLBAR,
IDC_LEGEND, IDH_LEGEND,
IDC_RPT_VALUE_DEFAULT, IDH_RPT_VALUE_DEFAULT,
IDC_RPT_VALUE_MINIMUM, IDH_RPT_VALUE_MINIMUM,
IDC_RPT_VALUE_MAXIMUM, IDH_RPT_VALUE_MAXIMUM,
IDC_RPT_VALUE_AVERAGE, IDH_RPT_VALUE_AVERAGE,
IDC_RPT_VALUE_CURRENT, IDH_RPT_VALUE_CURRENT,
IDC_COMBOAPPEARANCE, IDH_COMBOAPPEARANCE,
IDC_COMBOBORDERSTYLE, IDH_COMBOBORDERSTYLE,
IDC_PERIODIC_UPDATE, IDH_PERIODIC_UPDATE,
IDC_DISPLAY_INTERVAL, IDH_DISPLAY_INTERVAL,
IDC_UPDATE_INTERVAL, IDH_UPDATE_INTERVAL,
IDC_DUPLICATE_INSTANCE, IDH_DUPLICATE_INSTANCE,
IDC_GRAPH_TITLE, IDH_GRAPH_TITLE, // Graph
IDC_YAXIS_TITLE, IDH_YAXIS_TITLE,
IDC_VERTICAL_GRID, IDH_VERTICAL_GRID,
IDC_HORIZONTAL_GRID, IDH_HORIZONTAL_GRID,
IDC_VERTICAL_LABELS, IDH_VERTICAL_LABELS,
IDC_VERTICAL_MAX, IDH_VERTICAL_MAX,
IDC_VERTICAL_MIN, IDH_VERTICAL_MIN,
IDC_SRC_REALTIME, IDH_SRC_REALTIME, // Source
IDC_SRC_LOGFILE, IDH_SRC_LOGFILE,
IDC_SRC_SQL, IDH_SRC_SQL,
IDC_LIST_LOGFILENAME, IDH_LIST_LOGFILENAME,
IDC_ADDFILE, IDH_ADDFILE,
IDC_REMOVEFILE, IDH_REMOVEFILE,
IDC_LOGSET_COMBO, IDH_LOGSET_COMBO,
IDC_DSN_COMBO, IDH_DSN_COMBO,
IDC_TIMESELECTBTN, IDH_TIMESELECTBTN,
IDC_TIMERANGE, IDH_TIMERANGE,
IDC_COLOROBJECTS, IDH_COLOROBJECTS,
IDC_FONTBUTTON, IDH_FONTBUTTON,
IDC_COLORBUTTON, IDH_COLORBUTTON,
IDC_COLORSAMPLE, IDH_COLORSAMPLE,
IDC_FONTSAMPLE, IDH_FONTSAMPLE,
0,0
};
/*
* CSysmonPropPageFactory::CSysmonPropPageFactory
* CSysmonPropPageFactory::~CSysmonPropPageFactory
* CSysmonPropPageFactory::QueryInterface
* CSysmonPropPageFactory::AddRef
* CSysmonPropPageFactory::Release
*/
CSysmonPropPageFactory::CSysmonPropPageFactory(INT nPageID)
{
m_cRef=0L;
m_nPageID = nPageID;
return;
}
CSysmonPropPageFactory::~CSysmonPropPageFactory(void)
{
return;
}
STDMETHODIMP CSysmonPropPageFactory::QueryInterface(REFIID riid, PPVOID ppv)
{
HRESULT hr = S_OK;
try {
*ppv=NULL;
if (IID_IUnknown==riid || IID_IClassFactory==riid) {
*ppv=this;
AddRef();
}
else {
hr = E_NOINTERFACE;
}
} catch (...) {
hr = E_POINTER;
}
return hr;
}
STDMETHODIMP_(ULONG) CSysmonPropPageFactory::AddRef(void)
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CSysmonPropPageFactory::Release(void)
{
if (0!=--m_cRef)
return m_cRef;
delete this;
return 0;
}
/*
* CSysmonPropPageFactory::CreateInstance
* CSysmonPropPageFactory::LockServer
*/
STDMETHODIMP CSysmonPropPageFactory::CreateInstance(
IN LPUNKNOWN pUnkOuter,
IN REFIID riid,
OUT PPVOID ppvObj
)
{
PCSysmonPropPage pObj;
HRESULT hr = NOERROR;
//
// No aggregation supported
//
if (NULL != pUnkOuter) {
return (CLASS_E_NOAGGREGATION);
}
switch (m_nPageID) {
case GENERAL_PROPPAGE:
pObj = new CGeneralPropPage();
break;
case SOURCE_PROPPAGE:
pObj = new CSourcePropPage();
break;
case COUNTER_PROPPAGE:
pObj = new CCounterPropPage();
break;
case GRAPH_PROPPAGE:
pObj = new CGraphPropPage();
break;
case APPEAR_PROPPAGE:
pObj = new CAppearPropPage();
break;
default:
pObj = NULL;
}
if (NULL == pObj)
return E_OUTOFMEMORY;
if (pObj->Init()) {
try {
*ppvObj = NULL;
hr = pObj->QueryInterface(riid, ppvObj);
} catch (...) {
hr = E_POINTER;
}
} else {
hr = E_UNEXPECTED;
}
//Kill the object if initial creation or Init failed.
if (FAILED(hr)) {
delete pObj;
}
else {
InterlockedIncrement(&g_cObj);
}
return hr;
}
STDMETHODIMP CSysmonPropPageFactory::LockServer(BOOL fLock)
{
if (fLock) {
InterlockedIncrement(&g_cLock);
}
else {
InterlockedDecrement(&g_cLock);
}
return NOERROR;
}
/*
* CSysmonPropPage implementation
*/
CSysmonPropPage::CSysmonPropPage(void)
: m_cRef ( 0 ),
m_hDlg ( NULL ),
m_pIPropertyPageSite ( NULL ),
m_ppISysmon ( NULL ),
m_cObjects ( 0 ),
m_cx ( 300 ), // Default width
m_cy ( 100 ), // Default height
m_fDirty ( FALSE ),
m_fActive ( FALSE ),
m_lcid ( LOCALE_USER_DEFAULT ),
m_dwEditControl ( 0 )
{
return;
}
CSysmonPropPage::~CSysmonPropPage(void)
{
if (NULL != m_hDlg)
DestroyWindow(m_hDlg);
FreeAllObjects();
ReleaseInterface(m_pIPropertyPageSite);
return;
}
/*
* CSysmonPropPage::QueryInterface
* CSysmonPropPage::AddRef
* CSysmonPropPage::Release
*/
STDMETHODIMP CSysmonPropPage::QueryInterface(REFIID riid, PPVOID ppv)
{
HRESULT hr = S_OK;
try {
*ppv=NULL;
if (IID_IUnknown==riid || IID_IPropertyPage==riid) {
*ppv=this;
AddRef();
}
else {
hr = E_NOINTERFACE;
}
} catch (...) {
hr = E_POINTER;
}
return hr;
}
STDMETHODIMP_(ULONG) CSysmonPropPage::AddRef(void)
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CSysmonPropPage::Release(void)
{
if (0 != --m_cRef)
return m_cRef;
InterlockedDecrement(&g_cObj);
delete this;
return 0;
}
/*
* CSysmonPropPage::Init
*
* Purpose:
* Performs initialization operations that might fail.
*
* Parameters:
* None
*
* Return Value:
* BOOL TRUE if initialization successful, FALSE
* otherwise.
*/
BOOL CSysmonPropPage::Init(void)
{
//Nothing to do
return TRUE;
}
/*
* CSysmonPropPage::FreeAllObjects
*
* Purpose:
* Releases all the objects from IPropertyPage::SetObjects
*
* Parameters:
* None
*/
void CSysmonPropPage::FreeAllObjects(void)
{
UINT i;
if (NULL==m_ppISysmon)
return;
for (i=0; i < m_cObjects; i++)
ReleaseInterface(m_ppISysmon[i]);
delete [] m_ppISysmon;
m_ppISysmon =NULL;
m_cObjects = 0;
}
/*
* CSysmonPropPage::SetChange
*
* Purpose:
* Set the page dirty flag to indicate a change
* If page site is active, send status change to it.
*
* Parameters:
* None
*/
void CSysmonPropPage::SetChange(void)
{
if (m_fActive)
{
m_fDirty=TRUE;
if (NULL != m_pIPropertyPageSite)
{
m_pIPropertyPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
}
}
}
/*
* CSysmonPropPage::SetPageSite
*
* Purpose:
* Provides the property page with the IPropertyPageSite
* that contains it. SetPageSite(NULL) will be called as
* part of the close sequence.
*
* Parameters:
* pPageSite LPPROPERTYPAGESITE pointer to the site.
*/
STDMETHODIMP CSysmonPropPage::SetPageSite(
LPPROPERTYPAGESITE pPageSite
)
{
HRESULT hr = S_OK;
if (NULL==pPageSite)
ReleaseInterface(m_pIPropertyPageSite)
else
{
HWND hDlg;
RECT rc;
LCID lcid;
try {
m_pIPropertyPageSite=pPageSite;
m_pIPropertyPageSite->AddRef();
if (SUCCEEDED(m_pIPropertyPageSite->GetLocaleID(&lcid)))
m_lcid=lcid;
/*
* Load the dialog and determine the size it will be to
* return through GetPageSize. We just create the dialog
* here and destroy it again to retrieve the size,
* leaving Activate to create it for real.
*/
hDlg=CreateDialogParam(g_hInstance,
MAKEINTRESOURCE(m_uIDDialog),
GetDesktopWindow(),
SysmonPropPageProc,
0L);
//
// If creation fails, use default values set in constructor
// and return success status.
if (NULL!=hDlg)
{
GetWindowRect(hDlg, &rc);
m_cx=rc.right-rc.left;
m_cy=rc.bottom-rc.top;
DestroyWindow(hDlg);
}
} catch (...) {
hr = E_POINTER;
}
}
return hr;
}
/*
* CSysmonPropPage::Activate
*
* Purpose:
* Instructs the property page to create a window in which to
* display its contents, using the given parent window and
* rectangle. The window should be initially visible.
*
* Parameters:
* hWndParent HWND of the parent window.
* prc LPCRECT of the rectangle to use.
* fModal BOOL indicating whether the frame is modal.
*/
STDMETHODIMP CSysmonPropPage::Activate(
HWND hWndParent,
LPCRECT prc,
BOOL /* fModal */
)
{
if (NULL!=m_hDlg)
return (E_UNEXPECTED);
m_hDlg=CreateDialogParam(g_hInstance,
MAKEINTRESOURCE(m_uIDDialog),
hWndParent,
SysmonPropPageProc,
(LPARAM)this);
if (NULL==m_hDlg) {
//
// Return E_OUTOFMEMORY because caller of Activate might not
// handle HRESULT_FROM_WIN32(GetLastError());
//
return E_OUTOFMEMORY;
}
if (!InitControls()) {
return E_OUTOFMEMORY;
}
if (!GetProperties()) {
return E_OUTOFMEMORY;
}
//
//Move the page into position and show it.
//
try {
SetWindowPos(m_hDlg, NULL, prc->left, prc->top, 0, 0, SWP_NOSIZE );
} catch (...) {
return E_POINTER;
}
m_fActive = TRUE;
return NOERROR;
}
/*
* CSysmonPropPage::Deactivate
*
* Purpose:
* Instructs the property page to destroy its window that was
* created in Activate.
*
* Parameters:
* None
*/
STDMETHODIMP CSysmonPropPage::Deactivate(void)
{
if (NULL==m_hDlg)
return (E_UNEXPECTED);
DeinitControls();
DestroyWindow(m_hDlg);
m_hDlg=NULL;
m_fActive = FALSE;
return NOERROR;
}
/*
* CSysmonPropPage::GetPageInfo
*
* Purpose:
* Fills a PROPPAGEINFO structure describing the page's size,
* contents, and help information.
*
* Parameters:
* pPageInfo LPPROPPAGEINFO to the structure to fill.
*/
STDMETHODIMP CSysmonPropPage::GetPageInfo(
LPPROPPAGEINFO pPageInfo
)
{
IMalloc * pIMalloc;
LPWSTR pTitle = NULL;
ULONG ulTitleLen = 0;
LPWSTR pBuf = NULL;
pTitle = ResourceString(m_uIDTitle);
if (pTitle) {
ulTitleLen = wcslen(pTitle) + 1;
if (FAILED(CoGetMalloc(MEMCTX_TASK, &pIMalloc))) {
return (E_FAIL);
}
pBuf = (LPWSTR)pIMalloc->Alloc(ulTitleLen * sizeof(WCHAR));
if (NULL != pBuf) {
//
// We already reserved an extra position for the null character
//
StringCchCopy(pBuf, ulTitleLen, pTitle);
}
pIMalloc->Release();
}
try {
pPageInfo->size.cx = m_cx;
pPageInfo->size.cy = m_cy;
pPageInfo->pszDocString = NULL;
pPageInfo->pszHelpFile = NULL;
pPageInfo->dwHelpContext= 0;
pPageInfo->pszTitle = pBuf;
} catch (...) {
return E_POINTER;
}
return S_OK;
}
/*
* CSysmonPropPage::SetObjects
*
* Purpose:
* Identifies the objects that are being affected by this property
* page (and all other pages in the frame). These are the object
* to which to send new property values in the Apply member.
*
* Parameters:
* cObjects ULONG number of objects
* ppUnk IUnknown ** to the array of objects being
* passed to the page.
*/
STDMETHODIMP CSysmonPropPage::SetObjects(
IN ULONG cObjects,
IN IUnknown **ppUnk
)
{
HRESULT hr = S_OK;
FreeAllObjects();
if (0 != cObjects) {
UINT i;
m_ppISysmon = new ISystemMonitor * [(UINT)cObjects];
if (m_ppISysmon == NULL)
return E_OUTOFMEMORY;
try {
for (i=0; i < cObjects; i++)
{
hr=ppUnk[i]->QueryInterface(IID_ISystemMonitor,
(void **)&m_ppISysmon[i]);
if (FAILED(hr)) {
break;
}
}
} catch (...) {
hr = E_POINTER;
}
}
if ( FAILED ( hr ) && NULL != m_ppISysmon ) {
//
// Ref count never incremented, so delete the array.
//
delete [] m_ppISysmon;
m_ppISysmon = NULL;
}
if ( SUCCEEDED ( hr ) ) {
m_cObjects=cObjects;
}
return hr;
}
/*
* CSysmonPropPage::Show
*
* Purpose:
* Instructs the page to show or hide its window created in
* Activate.
*
* Parameters:
* nCmdShow UINT to pass to ShowWindow.
*/
STDMETHODIMP CSysmonPropPage::Show(UINT nCmdShow)
{
if (NULL==m_hDlg)
(E_UNEXPECTED);
ShowWindow(m_hDlg, nCmdShow);
// If showing page
if (SW_SHOWNORMAL==nCmdShow || SW_SHOW==nCmdShow) {
// Take the focus
// (Have to delay so it isn't taken back)
PostMessage(m_hDlg,WM_SETPAGEFOCUS,0,0);
}
return NOERROR;
}
/*
* CSysmonPropPage::Move
*
* Purpose:
* Instructs the property page to change its position.
*
* Parameters:
* prc LPCRECT containing the new position.
*/
STDMETHODIMP CSysmonPropPage::Move(
LPCRECT prc
)
{
HRESULT hr = S_OK;
try {
SetWindowPos(m_hDlg, NULL, prc->left, prc->top, 0, 0, SWP_NOSIZE );
} catch (...) {
hr = E_POINTER;
}
return hr;
}
/*
* CSysmonPropPage::IsPageDirty
*
* Purpose:
* Asks the page if anything's changed in it, that is, if the
* property values in the page are out of sync with the objects
* under consideration.
*
* Parameters:
* None
*
* Return Value:
* HRESULT NOERROR if dirty, S_FALSE if not.
*/
STDMETHODIMP CSysmonPropPage::IsPageDirty(void)
{
return (m_fDirty ? S_OK : S_FALSE);
}
/*
* CSysmonPropPage::Apply
*
* Purpose:
* Instructs the page to send changes in its page to whatever
* objects it knows about through SetObjects. This is the only
* time the page should change the objects' properties, and not
* when the value is changed on the page.
*
* Parameters:
* None
*/
STDMETHODIMP CSysmonPropPage::Apply(void)
{
HRESULT hr = NOERROR;
if ( 0 != m_cObjects ) {
// Kill the focus in case a text field has it. This will trigger
// the entry processing code.
SetFocus(NULL);
{
CWaitCursor cursorWait;
if (SetProperties()) {
m_fDirty = FALSE;
} else {
hr = E_FAIL;
}
}
}
return hr;
}
/*
* CSysmonPropPage::Help
*
* Purpose:
* Invokes help for this property page when the user presses
* the Help button. If you return NULLs for the help file
* in GetPageInfo, the button will be grayed. Otherwise the
* page can perform its own help here.
*
* Parameters:
* pszHelpDir LPCOLESTR identifying the default location of
* the help information
*
* Return Value:
* HRESULT NOERROR to tell the frame that we've done our
* own help. Returning an error code or S_FALSE
* causes the frame to use any help information
* in PROPPAGEINFO.
*/
STDMETHODIMP CSysmonPropPage::Help(LPCOLESTR /* pszHelpDir */ )
{
/*
* We can either provide help ourselves, or rely on the
* information in PROPPAGEINFO.
*/
return (S_FALSE);
}
/*
* CSysmonPropPage::TranslateAccelerator
*
* Purpose:
* Provides the page with the messages that occur in the frame.
* This gives the page to do whatever it wants with the message,
* such as handle keyboard mnemonics.
*
* Parameters:
* pMsg LPMSG containing the keyboard message.
*/
STDMETHODIMP CSysmonPropPage::TranslateAccelerator(LPMSG lpMsg)
{
BOOL fTakeIt = TRUE;
BOOL fHandled = FALSE;
HRESULT hr;
HWND hwnd;
if (lpMsg == NULL)
return E_POINTER;
// If TAB key
if (lpMsg->message == WM_KEYDOWN ) {
if ( lpMsg->wParam == VK_TAB
&& GetKeyState(VK_CONTROL) >= 0) {
UINT uDir = GetKeyState(VK_SHIFT) >= 0 ? GW_HWNDNEXT : GW_HWNDPREV;
hwnd = GetFocus();
if (IsChild(m_hDlg, hwnd)) {
// Get top level child for controls with children, like combo.
while (GetParent(hwnd) != m_hDlg) hwnd = GetParent(hwnd);
// If this control is the last enabled tab stop, don't steal the TAB key
do {
hwnd = GetWindow(hwnd, uDir);
if ( NULL == hwnd ) {
fTakeIt = FALSE;
break;
}
}
while ((GetWindowLong(hwnd, GWL_STYLE) & (WS_DISABLED | WS_TABSTOP)) != WS_TABSTOP);
}
}
/*
fTakeIt is already TRUE.
// else if Arrow key
else if ( lpMsg->message == WM_KEYDOWN &&
( lpMsg->wParam == VK_LEFT || lpMsg->wParam == VK_UP
|| lpMsg->wParam == VK_RIGHT || lpMsg->wParam == VK_DOWN ) ) {
fTakeIt = TRUE;
}
*/
// else if Return or Escape key
else if ( lpMsg->wParam == VK_RETURN || lpMsg->wParam == VK_ESCAPE ) {
fTakeIt = (lpMsg->wParam == VK_RETURN);
if ( fTakeIt ) {
hwnd = GetFocus();
if ( NULL == hwnd ) {
fTakeIt = FALSE;
} else {
fTakeIt = IsChild(m_hDlg, hwnd);
if ( fTakeIt ) {
fTakeIt = (BOOL) SendMessage(hwnd, WM_GETDLGCODE, 0, 0) & DLGC_DEFPUSHBUTTON;
}
}
}
}
} else if ( ( WM_KEYUP == lpMsg->message ) ) {
fTakeIt = FALSE;
}
// if we should process the key
if (fTakeIt) {
// if the target is not one of our controls, change it so IsDialogMessage works
if (!IsChild(m_hDlg, lpMsg->hwnd)) {
hwnd = lpMsg->hwnd;
lpMsg->hwnd = GetWindow(m_hDlg, GW_CHILD);
fHandled = IsDialogMessage(m_hDlg, lpMsg);
lpMsg->hwnd = hwnd;
}
else {
fHandled = IsDialogMessage(m_hDlg, lpMsg);
}
}
if (fHandled){
return S_OK;
} else{
hr = m_pIPropertyPageSite->TranslateAccelerator(lpMsg);
}
return hr;
}
/*
* CSysmonPropPage::EditProperty
*
* Purpose:
* Sets focus to the control corresponding to the supplied DISPID.
*
* Parameters:
* dispID DISPID of the property
*/
STDMETHODIMP CSysmonPropPage::EditProperty(DISPID dispID)
{
HRESULT hr;
hr = EditPropertyImpl ( dispID );
if ( SUCCEEDED(hr)) {
SetFocus ( GetDlgItem ( m_hDlg, m_dwEditControl ) );
m_dwEditControl = 0;
}
return hr;
}
/*
* CSysmonPropPage::WndProc
*
* Purpose:
* This is a default message processor that can be overriden by
* a subclass to provide special message handling.
*
* Parameters:
* pMsg LPMSG containing the keyboard message.
*/
BOOL
CSysmonPropPage::WndProc (
UINT, // uMsg,
WPARAM, // wParam,
LPARAM // lParam
)
{
return FALSE;
}
/*
* SysmonPropPageProc
*
* Purpose:
* Dialog procedure for the Sysmon Property Page.
*/
INT_PTR APIENTRY CALLBACK
SysmonPropPageProc(
HWND hDlg,
UINT iMsg,
WPARAM wParam,
LPARAM lParam
)
{
static WCHAR szObj[] = L"Object";
PCSysmonPropPage pObj = NULL;
PMEASUREITEMSTRUCT pMI;
HWND hwndTabCtrl;
HWND hwndPropSheet;
INT iCtrlID;
WCHAR pszHelpFilePath[MAX_PATH * 2];
LPHELPINFO pInfo;
UINT nLen;
BOOL bReturn = FALSE;
if ( NULL != hDlg ) {
pObj = (PCSysmonPropPage)GetProp(hDlg, szObj);
}
switch (iMsg) {
case WM_INITDIALOG:
pObj=(PCSysmonPropPage)lParam;
if ( NULL != pObj && NULL != hDlg ) {
SetProp(hDlg, szObj, (HANDLE)lParam);
hwndTabCtrl = ::GetParent(hDlg);
hwndPropSheet = ::GetParent(hwndTabCtrl);
SetWindowLongPtr(hwndPropSheet,
GWL_EXSTYLE,
GetWindowLongPtr(hwndPropSheet,GWL_EXSTYLE)|WS_EX_CONTEXTHELP);
}
bReturn = TRUE;
break;
case WM_DESTROY:
if ( NULL != hDlg ) {
RemoveProp(hDlg, szObj);
}
bReturn = TRUE;
break;
case WM_MEASUREITEM:
pMI = (PMEASUREITEMSTRUCT)lParam;
if ( NULL != pMI ) {
pMI->itemWidth = 0 ;
pMI->itemHeight = 16;
}
bReturn = TRUE;
break;
case WM_DRAWITEM:
if ( NULL != pObj ) {
pObj->DrawItem ((PDRAWITEMSTRUCT) lParam) ;
}
bReturn = TRUE;
break;
case WM_COMMAND:
if ( NULL != pObj ) {
pObj->DialogItemChange(LOWORD(wParam), HIWORD(wParam));
}
bReturn = FALSE;
break;
case WM_SETPAGEFOCUS:
if ( NULL != hDlg ) {
SetFocus(hDlg);
bReturn = TRUE;
}
break;
case WM_CONTEXTMENU:
if ( NULL != (HWND) wParam ) {
iCtrlID = GetDlgCtrlID ( (HWND) wParam );
if ( 0 != iCtrlID ) {
nLen = ::GetWindowsDirectory(pszHelpFilePath, 2*MAX_PATH);
if ( 0 < nLen ) {
StringCchCat(pszHelpFilePath, 2* MAX_PATH, L"\\help\\sysmon.hlp" );
bReturn = WinHelp(
(HWND) wParam,
pszHelpFilePath,
HELP_CONTEXTMENU,
(DWORD_PTR) aulControlIdToHelpIdMap);
}
}
}
// bReturn is FALSE by default
break;
case WM_HELP:
if ( NULL != hDlg ) {
pInfo = (LPHELPINFO)lParam;
if ( NULL != pInfo ) {
// Only display help for known context IDs.
if ( 0 != pInfo->dwContextId ) {
nLen = ::GetWindowsDirectory(pszHelpFilePath, 2*MAX_PATH);
if ( 0 < nLen ) {
StringCchCat(pszHelpFilePath, 2* MAX_PATH, L"\\help\\sysmon.hlp" );
bReturn = WinHelp (
hDlg,
pszHelpFilePath,
HELP_CONTEXTPOPUP,
pInfo->dwContextId );
}
}
}
}
// bReturn is FALSE by default
break;
default:
if ( NULL != pObj ) {
bReturn = pObj->WndProc(iMsg, wParam, lParam);
}
}
return bReturn;
}