您的位置:首页 > 其它

Windows API 函数学习(13)---进程函数示例

2007-04-09 16:36 357 查看
 // ProcEnum.cpp : Defines the entry point for the application.
//本程序演示了如何列举系统进程,并且更改进程的优先级,结束进程
//控件:ListView,TrackBar控件的使用示例,其中资源是添加了两个对话框模板

#include "stdafx.h"
#include "resource.h"
#include <stdio.h>
#include <commctrl.h>
#include <Tlhelp32.h>
#include <stdlib.h>
#include <winbase.h>
#define BELOW_NORMAL_PRIORITY_CLASS 0x00004000;//定义两个优先级的级别
#define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000;

HINSTANCE hInst;
DWORD ProcPri;
char temp[32];
HWND hProcList;
HWND hSlider;
DWORD dwPriority;
BOOL DlgProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK DlgProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void DisplayRuningProcess();
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
 INITCOMMONCONTROLSEX icex;
 icex.dwSize = sizeof(INITCOMMONCONTROLSEX);//初始化ListView控件
 icex.dwICC  = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&icex);
    hInst=hInstance;
 DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,(DLGPROC)DlgProc,(IDD_DIALOG1));
 return 0;
}
BOOL DlgProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 int lowID;
 char psTest[256];
 int index;
 char ProcID[16];
 HANDLE hProcess;
 switch (uMsg)
 {
      case WM_INITDIALOG:
         hProcList=CreateWindowEx (LVS_EX_FULLROWSELECT,WC_LISTVIEW, "",
   WS_VISIBLE|WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
   10, 10, 340, 400,
   hWnd, (HMENU) ID_LISTVIEW, hInst, NULL); //创建ListView控件
   LVCOLUMN lvco;
   lvco.mask=LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH;
   lvco.pszText=psTest;
   lvco.cx=80;
   lvco.fmt=LVCFMT_CENTER;
   lvco.iSubItem=0;
         LoadString(hInst, IDS_ID, psTest, sizeof(psTest)); //设置表头文本

   ListView_InsertColumn(hProcList,0,&lvco);
         lvco.iSubItem=1;
  
   LoadString(hInst, IDS_PRI, psTest, sizeof(psTest));
   ListView_InsertColumn(hProcList,1,&lvco);
   lvco.iSubItem=2;
   lvco.cx=180;
   LoadString(hInst,IDS_PROCNAME,psTest,sizeof(psTest));
   ListView_InsertColumn(hProcList,2,&lvco);
   DisplayRuningProcess();
   break;
 case WM_COMMAND:
  lowID=LOWORD(wParam);
     switch(lowID)
  {
  case IDOK:
      EndDialog(hWnd,FALSE);
      break;
  case IDC_REFRESH:
   DisplayRuningProcess(); //刷新进程列表
   break;
  case IDC_KILLPROCESS:
           
   index=ListView_GetSelectionMark(hProcList);
   if(index==-1)
   {
    MessageBox(hWnd,"请选择要结束的进程","错误!",MB_OK);
    return 0;
   }
   ListView_GetItemText(hProcList,index,0,ProcID,sizeof(ProcID));
   hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,atoi(ProcID));
   TerminateProcess(hProcess,0);
   DisplayRuningProcess();
   break;
  case IDC_SET:   //更改优先级
      index=ListView_GetSelectionMark(hProcList);
   
            if(index==-1)
   {
    MessageBox(hWnd,"请选择要结束的进程","错误!",MB_OK);
    return 0;
   }
   ListView_GetItemText(hProcList,index,0,ProcID,sizeof(ProcID));
   hProcess=OpenProcess(PROCESS_SET_INFORMATION,FALSE,atoi(ProcID));
   if(IDOK==DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG2),hWnd,(DLGPROC)DlgProc2))
   {
    if(!SetPriorityClass(hProcess,dwPriority))
    {
     MessageBox(hWnd,"更改优先级失败!","错误!",MB_OK);
     break;
    }
    DisplayRuningProcess();
   }
    
   break;
  }
     break;
 case WM_CLOSE:
  EndDialog(hWnd,FALSE);
  break;
 default:
  return FALSE;
 }
 return TRUE;
}

void DisplayRuningProcess()
{

 LVITEM lvI;
 char temp[50];
 int j;
 int CurItemIndex=0;
 HANDLE hSnapShot;
 PROCESSENTRY32 pe;
 
 DWORD retval;
 hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 retval=Process32First(hSnapShot,&pe);
    ListView_DeleteAllItems(hProcList);
 lvI.mask = LVIF_TEXT ;
 do
    {      
  lvI.iItem = CurItemIndex;
  lvI.iSubItem =0;
  lvI.pszText="";
  ListView_InsertItem(hProcList, &lvI);//先插入空行,然后进行填写数据
  for(j=0;j<3;j++)
  { 
   switch(j)
   {
   case 0:
       sprintf(temp ,"%d",pe.th32ProcessID);
    break;
   case 1:
    sprintf(temp,"%d",pe.pcPriClassBase);
    break;
   case 2:
    sprintf(temp ,"%s",pe.szExeFile);
    break;
   }
   ListView_SetItemText(hProcList,CurItemIndex,j,temp);//增加一行内容
          }
  CurItemIndex++;
 }while(Process32Next(hSnapShot,&pe));
    CloseHandle(hSnapShot);
}

LRESULT CALLBACK DlgProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message)
 {
 case WM_INITDIALOG:
  INITCOMMONCONTROLSEX icex;
  icex.dwSize = sizeof(INITCOMMONCONTROLSEX);//初始化TrakBar控件
  icex.dwICC= ICC_BAR_CLASSES;
  InitCommonControlsEx(&icex);
        hSlider=CreateWindowEx(0,TRACKBAR_CLASS,NULL,    //创建TrackBar控件       
   WS_CHILD | WS_VISIBLE | TBS_AUTOTICKS|TBS_VERT,  
   10, 10, 20, 200, hWnd,(HMENU)IDC_SLIDER, hInst, NULL);
  SendMessage(hSlider,TBM_SETRANGE,TRUE,MAKELONG(0,5));//设置范围
  SendMessage(hSlider,TBM_SETPOS,TRUE,3);//设置默认值
  dwPriority=NORMAL_PRIORITY_CLASS;
  break;
 case WM_VSCROLL://利用这个消息返回当前设置的优先级
  DWORD dwPos;
  dwPos=SendMessage((HWND)lParam,TBM_GETPOS,0,0);
  switch(dwPos)
  {
 
  case 0:
   dwPriority=REALTIME_PRIORITY_CLASS;
   break;
  case 1:
   dwPriority=HIGH_PRIORITY_CLASS;
   break;
  case 2:
   dwPriority=ABOVE_NORMAL_PRIORITY_CLASS;
   break;
  case 3:
   dwPriority=NORMAL_PRIORITY_CLASS;
   break;
  case 4:
   dwPriority=BELOW_NORMAL_PRIORITY_CLASS;
   break;
  case 5:
   dwPriority=IDLE_PRIORITY_CLASS;
  } 
  SendMessage(hSlider,TBM_SETPOS,TRUE,(LPARAM)dwPos);
  break;

 case WM_COMMAND:
  if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  {
   EndDialog(hWnd, LOWORD(wParam));
   return TRUE;
  }
 }
    return FALSE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息