一个进程查看器的sdk实现[1]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

进程查看器,改自《delphi下深入Windows核心编程》74页。

用sdk编程时主要注意几点:
1.用属性表作主界面,可调用PropertySheet函数,该函数只有一个参数:指向PROPSHEETHEADER结构的指针。它的作用相当于创建模态对话框函数DialogBox。调用PropertySheet函数会生成一个属性表对话框,不过它没有对话框过程,只有一个回调函数。一般不用定义该回调函数,除非你要做一些初始化工作,比如这里就为属性表添加一个最小化按钮(属性表默认只有一个关闭按钮和帮助按钮)。属性表中每个属性页通过定义PROPSHEETPAGE来实现。每个属性页相当于一个无模态对话框,都有各自的对话框过程,编程方法同一般的对话框是一样的。我们主要的工作都是在这些对话框过程中完成的。
下面的典型代码就创建了一个标题名为“进程管理器”的属性表,有一个SheetProc回调函数;它里面有两个属性表,分别名为“进程”和“窗口”,分别对应ProcessPageDlgProc对话框过程和WindowPageDlgProc对话框过程。

    PROPSHEETPAGE psp[2];
    PROPSHEETHEADER psh;

    psp[0].dwSize = sizeof(PROPSHEETPAGE);
    psp[0].dwFlags = PSP_USEICONID | PSP_USETITLE;//|PSP_USECALLBACK;
    psp[0].hInstance = g_hinst;
    psp[0].pszTemplate = MAKEINTRESOURCE(IDD_TABSHEET1);
    psp[0].pszIcon = 0;//MAKEINTRESOURCE(IDI_FONT);
    psp[0].pfnDlgProc =(DLGPROC)ProcessPageDlgProc;//进程页的对话框过程
    psp[0].pszTitle = "进程";
    psp[0].lParam = 0;
    psp[0].pfnCallback = NULL;

    psp[1].dwSize = sizeof(PROPSHEETPAGE);
    psp[1].dwFlags = PSP_USEICONID | PSP_USETITLE;//|PSP_USECALLBACK;
    psp[1].hInstance = g_hinst;
    psp[1].pszTemplate = MAKEINTRESOURCE(IDD_TABSHEET2);
    psp[1].pszIcon =0;// MAKEINTRESOURCE(IDI_BORDER);
    psp[1].pfnDlgProc = (DLGPROC)WindowPageDlgProc;//窗口页的对话框过程
    psp[1].pszTitle ="窗口";
    psp[1].lParam = 0;
    psp[1].pfnCallback = NULL;

    psh.dwSize = sizeof(PROPSHEETHEADER);
    psh.dwFlags = PSH_USEICONID | PSH_PROPSHEETPAGE|PSH_USECALLBACK;
    psh.hwndParent = hwndOwner;
    psh.hInstance = g_hinst;
    psh.pszIcon =0;// MAKEINTRESOURCE(IDI_CELL_PROPERTIES);
    psh.pszCaption = (LPSTR) "进程管理器";
    psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
    psh.nStartPage = 0;
    psh.ppsp = (LPCPROPSHEETPAGE) &psp;
    psh.pfnCallback =(PFNPROPSHEETCALLBACK)SheetProc;//属性表的回调函数

    PropertySheet((LPCPROPSHEETHEADER)&psh);

2.查看系统的进程可以调用CreateToolhelp32Snapshot创建进程快照,再分别调用Process32First和Process32Next就可以遍历所有的系统进程。一般我们把找到的进程信息先保存到我们自己定义的一个结构中,再把该结构的指针放到一个链表里,组成一个指针动态链表,以后我们就可以从该链表取得把我们想要的进程的部分或全部信息,如进程名字等,再显示到列表框。Delphi中有一个现成的TList类(其实它应该是个动态数组),mfc也有现成的类可用,可是我们现在只能用sdk,一种解决的方法是使用std标准库的std::list,可惜我还不懂:(。难道要我自己编码实现一个链表?那就头大了,好像也不值得阿。不过且慢,不是有一个listbox控件吗,其实我们也可以把它当作链表来用的。具体见代码。
另外还要注意一点,listbox不能通过只添加WS_HSCROLL风格来增加水平滚动条,还要发送一条LB_SETHORIZONTALEXTENT消息才行,该消息的WPARAM参数是水平滚动条的像素宽度。

源代码:
////////////////////////////////////////////
//ProceeVier.cpp
//改自《delphi下深入Windows核心编程》74页
//作者 hlq
//2005年8月23日
////////////////////////////////////////////
#include <windows.h>
#include <windowsx.h>
#include "CmnHdr.h"
#include <commdlg.h>
//#include <commctrl.h>

#include "resource.h"
#include <Tlhelp32.h>
#include "prsht.h"

//属性表是通用控件,必须告诉linker链接comctl32.lib
#pragma comment(lib,"comctl32.lib")

LRESULT CALLBACK SheetProc(HWND hwnd, UINT uMsg, LPARAM lParam);
LRESULT CALLBACK ProcessPageDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam,

LPARAM lParam);
LRESULT CALLBACK WindowPageDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam,

LPARAM lParam);

HINSTANCE g_hinst;

///////////////////////////////////////////////////////////////
//
//对话框模版结构
//
//用于SheetProc回调函数改变属性表对话框的风格。这里只是给属性表
//加上最小化按钮
///////////////////////////////////////////////////////////////
//
#pragma pack (push, 1)
typedef struct DLGTEMPLATEEX
{
    WORD dlgVer;
    WORD signature;
    DWORD helpID;
    DWORD exStyle;
    DWORD style;
    WORD cDlgItems;
    short x;
    short y;
    short cx;
    short cy;
} DLGTEMPLATEEX, *LPDLGTEMPLATEEX;
#pragma pack (pop)


/////////////////////////////////////////////////////////////
//
//进程信息结构
//
////////////////////////////////////////////////////////////
//
typedef struct TProcessInfo
{
 char* ExeFile;
 DWORD ProcessID;
} TProcessInfo,*ProcessInfo;

本文关键:一个进程查看器的sdk实现
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top