servman.c

来自「一个类似windows」· C语言 代码 · 共 775 行 · 第 1/2 页

C
775
字号
/*
 * PROJECT:     ReactOS Services
 * LICENSE:     GPL - See COPYING in the top level directory
 * FILE:        base/system/servman/servman.c
 * PURPOSE:     Main window message handler
 * COPYRIGHT:   Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>
 *
 */

#include "servman.h"

const TCHAR ClassName[] = _T("ServiceManager");

HINSTANCE hInstance;
HWND hMainWnd;
HWND hListView;
HWND hStatus;
HWND hTool;
HWND hProgDlg;
HMENU hShortcutMenu;
INT SelectedItem = -1;

TBBUTTON *ptbb;

extern HWND hwndGenDlg;


INT GetSelectedItem(VOID)
{
    return SelectedItem;
}

VOID SetView(DWORD View)
{
    DWORD Style = GetWindowLong(hListView, GWL_STYLE);

    if ((Style & LVS_TYPEMASK) != View)
        SetWindowLong(hListView, GWL_STYLE, (Style & ~LVS_TYPEMASK) | View);
}


VOID SetMenuAndButtonStates()
{
    HMENU hMainMenu;
    ENUM_SERVICE_STATUS_PROCESS *Service = NULL;
    DWORD Flags, State;

    /* get handle to menu */
    hMainMenu = GetMenu(hMainWnd);

    /* set all to greyed */
    EnableMenuItem(hMainMenu, ID_START, MF_GRAYED);
    EnableMenuItem(hMainMenu, ID_STOP, MF_GRAYED);
    EnableMenuItem(hMainMenu, ID_PAUSE, MF_GRAYED);
    EnableMenuItem(hMainMenu, ID_RESUME, MF_GRAYED);
    EnableMenuItem(hMainMenu, ID_RESTART, MF_GRAYED);

    EnableMenuItem(hShortcutMenu, ID_START, MF_GRAYED);
    EnableMenuItem(hShortcutMenu, ID_STOP, MF_GRAYED);
    EnableMenuItem(hShortcutMenu, ID_PAUSE, MF_GRAYED);
    EnableMenuItem(hShortcutMenu, ID_RESUME, MF_GRAYED);
    EnableMenuItem(hShortcutMenu, ID_RESTART, MF_GRAYED);

    SendMessage(hTool, TB_SETSTATE, ID_START,
                   (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
    SendMessage(hTool, TB_SETSTATE, ID_STOP,
                   (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
    SendMessage(hTool, TB_SETSTATE, ID_PAUSE,
                   (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
    SendMessage(hTool, TB_SETSTATE, ID_RESTART,
                   (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));

    if (GetSelectedItem() != -1)
    {
        /* get pointer to selected service */
        Service = GetSelectedService();

        Flags = Service->ServiceStatusProcess.dwControlsAccepted;
        State = Service->ServiceStatusProcess.dwCurrentState;

        if (State == SERVICE_STOPPED)
        {
            EnableMenuItem(hMainMenu, ID_START, MF_ENABLED);
            EnableMenuItem(hShortcutMenu, ID_START, MF_ENABLED);
            SendMessage(hTool, TB_SETSTATE, ID_START,
                   (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
        }

        if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )
        {
            EnableMenuItem(hMainMenu, ID_STOP, MF_ENABLED);
            EnableMenuItem(hShortcutMenu, ID_STOP, MF_ENABLED);
            SendMessage(hTool, TB_SETSTATE, ID_STOP,
                   (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
        }

        if ( (Flags & SERVICE_ACCEPT_PAUSE_CONTINUE) && (State == SERVICE_RUNNING) )
        {
            EnableMenuItem(hMainMenu, ID_PAUSE, MF_ENABLED);
            EnableMenuItem(hShortcutMenu, ID_PAUSE, MF_ENABLED);
            SendMessage(hTool, TB_SETSTATE, ID_PAUSE,
                   (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
        }

        if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )
        {
            EnableMenuItem(hMainMenu, ID_RESTART, MF_ENABLED);
            EnableMenuItem(hShortcutMenu, ID_RESTART, MF_ENABLED);
            SendMessage(hTool, TB_SETSTATE, ID_RESTART,
                   (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
        }
    }
    else
    {
        EnableMenuItem(hMainMenu, ID_PROP, MF_GRAYED);
        EnableMenuItem(hMainMenu, ID_DELETE, MF_GRAYED);
        EnableMenuItem(hShortcutMenu, ID_DELETE, MF_GRAYED);
        SendMessage(hTool, TB_SETSTATE, ID_PROP,
                   (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
    }

}




LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
        {
            TBADDBITMAP tbab;
            INT iImageOffset;
            INT statwidths[] = {110, -1}; /* widths of status bar */
            TCHAR szTemp[256];
            LVCOLUMN lvc = { 0 };

            /* Toolbar buttons */
            TBBUTTON tbb [NUM_BUTTONS] =
            {   /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
                {TBICON_PROP,    ID_PROP,    TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0},    /* properties */
                {TBICON_REFRESH, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0},          /* refresh */
                {TBICON_EXPORT,  ID_EXPORT,  TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0},          /* export */

                /* Note: First item for a seperator is its width in pixels */
                {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},                                  /* separator */

                {TBICON_CREATE,  ID_CREATE,  TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 },         /* create */

                {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},                                  /* separator */

                {TBICON_START,   ID_START,   TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 },   /* start */
                {TBICON_STOP,    ID_STOP,    TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 },   /* stop */
                {TBICON_PAUSE,   ID_PAUSE,   TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 },   /* pause */
                {TBICON_RESTART, ID_RESTART, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 },   /* restart */

                {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},                                  /* separator */

                {TBICON_HELP,    ID_HELP,    TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 },         /* help */
                {TBICON_EXIT,    ID_EXIT,   TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 },          /* exit */

            };

            ptbb = tbb;

/* ======================== Create Toolbar ============================== */

            /* Create Toolbar */
            hTool = CreateWindowEx(0,
                                   TOOLBARCLASSNAME,
                                   NULL,
                                   WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,
                                   0, 0, 0, 0,
                                   hwnd,
                                   (HMENU)IDC_TOOLBAR,
                                   hInstance,
                                   NULL);
            if(hTool == NULL)
                MessageBox(hwnd, _T("Could not create tool bar."), _T("Error"), MB_OK | MB_ICONERROR);

            /* Send the TB_BUTTONSTRUCTSIZE message, which is required for backward compatibility */
            SendMessage(hTool, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);

            /* Add custom images */
            tbab.hInst = hInstance;
            tbab.nID = IDB_BUTTONS;
            iImageOffset = (INT)SendMessage(hTool, TB_ADDBITMAP, NUM_BUTTONS, (LPARAM)&tbab);
            tbb[0].iBitmap += iImageOffset; /* properties */
            tbb[1].iBitmap += iImageOffset; /* refresh */
            tbb[2].iBitmap += iImageOffset; /* export */
            tbb[4].iBitmap += iImageOffset; /* create */
            tbb[6].iBitmap += iImageOffset; /* start */
            tbb[7].iBitmap += iImageOffset; /* stop */
            tbb[8].iBitmap += iImageOffset; /* pause */
            tbb[9].iBitmap += iImageOffset; /* restart */
            tbb[11].iBitmap += iImageOffset; /* help */
            tbb[12].iBitmap += iImageOffset; /* exit */

            /* Add buttons to toolbar */
            SendMessage(hTool, TB_ADDBUTTONS, NUM_BUTTONS, (LPARAM) &tbb);

            /* Show toolbar */
            ShowWindow(hTool, SW_SHOWNORMAL);



/* ======================== Create List View ============================== */

            hListView = CreateWindowEx(0,
                                       WC_LISTVIEW,
                                       NULL,
                                       WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER |
                                       LBS_NOTIFY | LVS_SORTASCENDING | LBS_NOREDRAW,
                                       0, 0, 0, 0, /* sized via WM_SIZE */
                                       hwnd,
                                       (HMENU) IDC_SERVLIST,
                                       hInstance,
                                       NULL);
            if (hListView == NULL)
                MessageBox(hwnd, _T("Could not create List View."), _T("Error"), MB_OK | MB_ICONERROR);

            (void)ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT |
                    /*LVS_EX_GRIDLINES |*/ LVS_EX_HEADERDRAGDROP);

            lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH  | LVCF_FMT;
            lvc.fmt  = LVCFMT_LEFT;

            /* Add columns to the list-view */

            /* name */
            lvc.iSubItem = 0;
            lvc.cx       = 150;
            LoadString(hInstance, IDS_FIRSTCOLUMN, szTemp,
                sizeof(szTemp) / sizeof(TCHAR));
            lvc.pszText  = szTemp;
            (void)ListView_InsertColumn(hListView, 0, &lvc);

            /* description */
            lvc.iSubItem = 1;
            lvc.cx       = 240;
            LoadString(hInstance, IDS_SECONDCOLUMN, szTemp,
                sizeof(szTemp) / sizeof(TCHAR));
            lvc.pszText  = szTemp;
            (void)ListView_InsertColumn(hListView, 1, &lvc);

            /* status */
            lvc.iSubItem = 2;
            lvc.cx       = 55;
            LoadString(hInstance, IDS_THIRDCOLUMN, szTemp,
                sizeof(szTemp) / sizeof(TCHAR));
            lvc.pszText  = szTemp;
            (void)ListView_InsertColumn(hListView, 2, &lvc);

            /* startup type */
            lvc.iSubItem = 3;
            lvc.cx       = 80;
            LoadString(hInstance, IDS_FOURTHCOLUMN, szTemp,
                sizeof(szTemp) / sizeof(TCHAR));
            lvc.pszText  = szTemp;
            (void)ListView_InsertColumn(hListView, 3, &lvc);

            /* logon as */
            lvc.iSubItem = 4;
            lvc.cx       = 100;
            LoadString(hInstance, IDS_FITHCOLUMN, szTemp,
                sizeof(szTemp) / sizeof(TCHAR));
            lvc.pszText  = szTemp;
            (void)ListView_InsertColumn(hListView, 4, &lvc);



/* ======================== Create Status Bar ============================== */

		    hStatus = CreateWindowEx(0,
                                     STATUSCLASSNAME,
                                     NULL,
                                     WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP,
                                     0, 0, 0, 0,
                                     hwnd,
                                     (HMENU)IDC_STATUSBAR,
                                     hInstance,
                                     NULL);
            if(hStatus == NULL)
			    MessageBox(hwnd, _T("Could not create status bar."),
                           _T("Error!"), MB_OK | MB_ICONERROR);

		    SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths);


/* ======================== Create Popup Menu ============================== */

            hShortcutMenu = LoadMenu(hInstance, MAKEINTRESOURCE (IDR_POPUP));
            hShortcutMenu = GetSubMenu(hShortcutMenu, 0);




/* ================= populate the list view with all services =================== */

		    RefreshServiceList();

	    }
	    break;

	    case WM_SIZE:
	    {
		    RECT rcTool;
		    int iToolHeight;

		    RECT rcStatus;
		    int iStatusHeight;

		    int lvHeight;
		    RECT rcClient;

		    /* Size toolbar and get height */
            hTool = GetDlgItem(hwnd, IDC_TOOLBAR);
		    SendMessage(hTool, TB_AUTOSIZE, 0, 0);

		    GetWindowRect(hTool, &rcTool);
		    iToolHeight = rcTool.bottom - rcTool.top;

		    /* Size status bar and get height */
		    hStatus = GetDlgItem(hwnd, IDC_STATUSBAR);
		    SendMessage(hStatus, WM_SIZE, 0, 0);

		    GetWindowRect(hStatus, &rcStatus);
		    iStatusHeight = rcStatus.bottom - rcStatus.top;

		    /* Calculate remaining height and size list view */
		    GetClientRect(hwnd, &rcClient);

		    lvHeight = rcClient.bottom - iToolHeight - iStatusHeight;

		    hListView = GetDlgItem(hwnd, IDC_SERVLIST);
		    SetWindowPos(hListView, NULL, 0, iToolHeight, rcClient.right, lvHeight, SWP_NOZORDER);
	    }
	    break;

	    case WM_NOTIFY:
        {
            NMHDR* nm = (NMHDR*) lParam;

            switch (nm->code)
            {
	            case NM_DBLCLK:
                    OpenPropSheet(hwnd);
			    break;

			    case LVN_COLUMNCLICK:

                break;

			    case LVN_ITEMCHANGED:
			    {
			        LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
			        ENUM_SERVICE_STATUS_PROCESS *Service = NULL;
			        HMENU hMainMenu;

                    /* get handle to menu */
                    hMainMenu = GetMenu(hMainWnd);

                    /* activate properties menu item, if not already */
                    if (GetMenuState(hMainMenu, ID_PROP, MF_BYCOMMAND) != MF_ENABLED)
                        EnableMenuItem(hMainMenu, ID_PROP, MF_ENABLED);

                    /* activate delete menu item, if not already */
                    if (GetMenuState(hMainMenu, ID_DELETE, MF_BYCOMMAND) != MF_ENABLED)
                    {
                        EnableMenuItem(hMainMenu, ID_DELETE, MF_ENABLED);
                        EnableMenuItem(hShortcutMenu, ID_DELETE, MF_ENABLED);
                    }


                    /* globally set selected service */
			        SelectedItem = pnmv->iItem;

                    /* alter options for the service */
			        SetMenuAndButtonStates();

			        /* get pointer to selected service */
                    Service = GetSelectedService();

			        /* set current selected service in the status bar */
                    SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)Service->lpDisplayName);

                    /* show the properties button */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?