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 + -
显示快捷键?