天天看點

vs2010: 寫了一個服務監控程式

用vs寫了一個服務監控程式,一個ListCtrl顯示所有的系統服務。兩個按鈕分别控制所點選的服務開始和結束。

建立了一個新線程監控服務的狀态變化、中間碰到兩個問題 糾結了好久。

一個是  控件選擇問題。

首先用的是 ListBox控件,但是發現ListBox 太不好定位了 要顯示第二列的 服務狀态,太不容易了。其實listbox 控件也可以多列顯示  但是它是從第一列開始  一個一個的顯示過來的。而且  第一列沒有填充完成  是設定不了第二列的值的。是以 很蛋疼。糾結了好久 隻好換控件,換成listCtrl    多列顯示

第二個問題是  ListCtrl  控件沒有設定report風格。   

ListCtrl控件沒有設定report屬性就導緻  無論怎麼插入資料都值顯示第一列。 後來我試了 設定為Icon 或者report都可以,但是 設定為small Icon 或者List風格就不可以。  Small Icon 隻顯示第一列  List風格隻顯示第一列的第一個資料    

其實前面我是設定了report風格的,但是設定了運作便報錯。(編譯可以通過)一串的包含這個關鍵字winCtrl2   不知道是什麼原因  如果以後解決了 一定要回頭來看看。。       後來通過m_list1.ModifyStyle(0,LVS_REPORT);設定風格為report就 可以了 。這時候我把這句代碼注釋掉  再重新在屬性視窗設定 View屬性為report。   就可以運作了

還有個問題有待解決:

怎麼樣 實作  像任務管理器的  輕按兩下某列的label ,使該列的服務排序 (需要資料綁定)

vs2010: 寫了一個服務監控程式

主要代碼

vs2010: 寫了一個服務監控程式
vs2010: 寫了一個服務監控程式

将程式圖示加入工作列,就像一個用戶端:

用到結構體NOTIFYICONDATA 

NOTIFYICONDATA *notifyIconData=new NOTIFYICONDATA;

notifyIconData->cbSize=sizeof(NOTIFYICONDATA);//結構體記憶體空間

notifyIconData->hWnd=AfxGetMainWnd()->m_hWnd;//關聯主視窗句柄

notifyIconData->uID=IDI_SERVEMANAGE;              //圖示ID号

notifyIconData->uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;//存儲

notifyIconData->uCallbackMessage=WM_SHOWTASK;//回調函數的消息

notifyIconData->hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_SERVEMANAGE));

TCHAR app_name[100]=TEXT("服務管理程式");//滑鼠附上去顯示的程式名稱

memcpy(notifyIconData->szTip,app_name,sizeof(app_name));

發送添加到工作列圖示的消息用到  Shell_NotifyIcon函數

Shell_NotifyIcon(NIM_ADD,notifyIconData);

其次:  還要添加WM_SHOWTASK函數

C***Dlg.h中添加afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam);  消息映射函數聲明

C***Dlg.cpp中添加ON_MESSAGE(WM_SHOWTASK,&CServerManageDlg::OnShowTask)消息映射

并實作 LRESULT OnShowTask(WPARAM wParam,LPARAM lParam)函數

LRESULT CServerManageDlg::OnShowTask(WPARAM wParam,LPARAM lParam)

{

if(wParam!= IDI_SERVEMANAGE)

{

return 1;

}

switch(lParam)

{

case WM_RBUTTONUP:

{//這個括号一定要加,是限制menu這個變量的作用域的,如果不加,會報變量定義被case标簽跳過的錯誤

LPPOINT  lpoint=new tagPOINT;

::GetCursorPos(lpoint);

CMenu menu;

menu.CreatePopupMenu();

//menu.AppendMenu(MF_STRING,WM_SIZE,TEXT("關閉"));

menu.AppendMenu(MF_STRING,WM_DESTROY,TEXT("退出"));

menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this,FALSE);

HMENU hmenu=menu.Detach();

menu.DestroyMenu();

delete lpoint;

break;

}

case WM_LBUTTONDBLCLK:

this->ShowWindow(SW_SHOWNORMAL);

break;

default:

break;

}

return 0;

}

實作最大化視窗和最小化視窗

void CServerManageDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else if(nID==SC_MINIMIZE)

{

ShowWindow(SW_HIDE);

}

else if(nID==SC_MAXIMIZE)

{

ShowWindow(SW_MAXIMIZE);

}

else

{

CDialogEx::OnSysCommand(nID, lParam);

}

}

以下來自:http://bbs.csdn.net/topics/360246955

對于解決   vs2010找不到系統菜單的最大化最小化 按鈕設定   代碼解決

你的對話框類添加處理WM_CREATE消息,在OnCreate函數中加入類似下面的代碼即可:

C/C++ code ?

1 2 3 4 5 6 7 8 9

int

CXXXXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 

{

if

(CDialog::OnCreate(lpCreateStruct) == -1)

return

-1;

// TODO: Add your specialized creation code here

ModifyStyle(0, WS_MAXIMIZEBOX | WS_MINIMIZEBOX, SWP_FRAMECHANGED);

return

0;

}