gh0st源码笔记 详解.docx
- 文档编号:7046413
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:18
- 大小:26.99KB
gh0st源码笔记 详解.docx
《gh0st源码笔记 详解.docx》由会员分享,可在线阅读,更多相关《gh0st源码笔记 详解.docx(18页珍藏版)》请在冰豆网上搜索。
gh0st源码笔记详解
免费的!
MICROSOFTSPEECHSDK5.1\INCLUDE
MICROSOFTSPEECHSDK5.1\LIB
以上两个目录是教程里面提到的,可以不使用,一样可以编译
第一节课
新建MFC工程,单文档模式,基类用CListView,其余默认即可
打开gh0stView.cpp找到voidCGh0stView:
:
OnInitialUpdate()函数
新建一个结NONCLIENTMETRICSncm;
NONCLIENTMETRICS这个结构就包含了非客户区的一些属性
对ncm变量进行初始化memset(&ncm,0,sizeof(NONCLIENTMETRICS));
对这个结构的成员函数进行设置
ncm.cbSize=sizeof(NONCLIENTMETRICS);//指定了ncm的大小
使用宏
VERIFY(:
:
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&ncm,0));
其目的是方便调试,在Debug版本中,如果计算的表达式为0则中断程序,并打印出错误信息,如果在Release版本中,出现表达式为0的时候,则不做任何的处理,当没有发生
:
:
SystemParametersInfo调用系统函数,查询或是设置系统参数,或是修改用户的一个外观,返回值是一个BOOL类型
第一个参数是获取非客户区参数
第二个参数是整个的非客户区结构的大小
第三个参数是将获得到的信息保存在ncm这个地址中
第四个参数由于是为了获取信息写0即可,如果是设置信息为目的,就需要换成其它
参考MSDN
第二节课
在gh0stView.h中声明一个私有成员变量
公有成员可以被所有类访问
受保护成员只能在类内部或其子类可以访问
私有成员只能在类内部访问,其子类是不可以访问的
private:
CListCtrl*m_pListCtrl;
私有的列表控件的指针,为什么要声明这个呢,我们之前提到了基类是CListView,因此在这个里声明了一个指针
CPP是执行文件,H是头文件
接下来对我们在CPP文件中声明的私有成员变量进行赋值
m_pListCtrl=&GetListCtrl();
GetListCtrl()这个函数的原型是
CListView:
:
GetListCtrl
CListCtrl&GetListCtrl()const;得到一个和视图相关联的一个列表控件的引用
引用的使用方法:
引用相当于是一个别名,周瑜和周公谨是一个人,引用和变量也相当于是一个东西
intm;
int&n=m;//为变量m定义了一个引用n,m是被引用,对n的操作就相当于对m来进行操作了,这里n既不是m的一个拷贝,又不是指向m的一个指针,而n就是m,作用就是用于函数的型参和返回值上,引用也是使用了一个地址传递的方式,比值传递的速度要快
指针与引用的区别:
主要是吴国的水军大都督是周瑜,那么这个吴国的水军大都督可看成是一个指针,引用被创建的时候是必须要进行初始化的,而指针是在任何时候被初始化的
另一个引用不可以是NULL,必须有一个合法的存储单位和引用相关联,而指针是可以有NULL的。
第三个区别是引用一旦被初始化了,就不能改变引用的关系了,可指针可以随便改变所指向的对象
使用GetListCtrl()这个函数实际上是为这个列表控件找了一个别名,以后对这个引用的操作,实际上就是对这个列表控件的操作了
地址符号和引用符号是相同的,都是&
m_pListCtrl=&GetListCtrl();这句的意思就是这个指针变量指向了这个引用,因为给指针赋值的话,就是将地址赋给指针,也可以理解为让周公瑾担任了吴国的水军大都督
接下来,我们声明了一个局部的变量
HIMAGELIST这是个WIN32的基本的数据类型,代表的是图像列表的句柄,表示的是软件上线的肉鸡的小图标
Shell_GetImageLists这是一个没有公开的API函数在SHELL32.dll中,返回操作系统图像列表的一个句柄,与SystemParametersInfo的作用基本上是相同的,这个函数适用于所有的WINDOWS版本
用法:
Shell_GetImageLists(NULL,&hImageListSmall);将获得到的保存在了这个地址当中
接下来将得到的这个系统图像列表设置到我们这个程序当中来
通过一个宏ListView_SetImageList()
这个宏的目的就是将得到的操作系统的图像列表控件分配给程序的视图控件
ListView_SetImageList(m_pListCtrl->m_hWnd,hImageListSmall,LVSIL_SMALL);
第一个参数是指列表视图控件的一个句柄
第二个参数是指要分配的图像列表的句柄
第三个参数是指图像列表的一个类型
接下来调用一个列表视图控件的一个成员函数来设置它为一个扁平风格和全选风格
m_pListCtrl->SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT);
声明列表项的一个结构在gh0stView.cpp中
typedefstruct
{
char*title;
intnWidth;
}COLUMNSTRUCT;//这个结构体名字叫COLUMNSTRUCT
接下来,我们再定义一个结构体的数组,保存各个列的标题和宽度
COLUMNSTRUCTg_Column_Data[]=
{
{"ID",48},
{"WAN",102},
{"LAN",102},
{"计算机名/备注",107},
{"操作系统",128},
{"CPU",55},
{"Ping",40},
{"摄像头",51},
{"区域",100}
}
这里我们多写了一列{"区域",100},其中的这一列是隐藏的,是IP地址定位的数据库,需要和程序一个目录下有一个QQwry.dat这样的文件存在
这样的话就需要有一个变量来进行判断这个文件是不是存在,我们在头文件gh0st.h中进行声明,在类classCGh0stApp下声明一个全局的成员变量m_bIsQQwryExist,是BOOL类型
接下来在构造函数中CGh0stApp:
:
CGh0stApp()
声明一个句柄HANDLEhFile;来接收下面函数的返回值
hFile=CreateFile("QQwry.dat",0,0,NULL,OPEN_EXISTING,NULL);
第一个参数是要访问的文件名,是一个常量宽字符串的指针
第二个参数是授予的访问级别,0代表可以查询是否存在
第三个参数指向了一些标志,如何被共享,因为没涉及到共享,0代表文件不共享
第四个参数指定这个句柄是否能被子进程继承,使用NULL代表不继承
第五个参数是对这个指定的文件有什么动作,我们的目的是判断这个文件是否存在,我们需要指定的参数应该选择OPEN_EXISTING
第六个参数指定了这个文件的属性和标志,对查询没有什么关联,设置为0
第七个参数是当权限为只读时起作用,这里设置为NULL代表和查询没有关系
这个函数失败的时候,返回值为INVALID_HANDLE_VALUE
接下来我们对上面函数的返回值进行判断
if(hFile!
=INVALID_HANDLE_VALUE)
{
m_bIsQQwryExist=TRUE;
}
else
{
m_bIsQQwryExist=FALSE;
}
接下来我们在gh0stView.cpp中进行这个BOOL类型变量的判断
我们声明一个变量,作为远程控制软件的列表列的个数intg_Column_Count;
这个变量的值为
(sizeof(g_Column_Data)/8)-!
((CGh0stApp*)AfxGetApp())->m_bIsQQwryExist;
sizeof的返回值是字节
AfxGetApp()这个函数的原型是CWinApp*AfxGetApp();返回值是应用程序的单一的CWinApp对象的一个指针,再将这个指针转换成CGh0stApp*类型,因为这两个类一个是基类一个是子为的关系,也就是这样的操作实际上就得到了CWinApp类的一个指针,再用这个指针调用这个类里面的成员变量
接下来再定义一个变量来定义软件的总界面宽度,在gh0stView.cpp中
intg_Column_Width=0;
接下来回到函数voidCGh0stView:
:
OnInitialUpdate()上来
设置
CListCtrl:
:
InsertColumn()
intInsertColumn(intnCol,constLVCOLUMN*pColumn);
intInsertColumn(intnCol,LPCTSTRlpszColumnHeading,intnFormat=LVCFMT_LEFT,intnWidth=-1,intnSubItem=-1);
第二种用法,第一个参数,列的索引号
第二个参数,是一个字符串的地址,这个地址包含了字符串的内容
m_pListCtrl->InsertColumn(i,g_Column_Data[i].title);
SetColumnWidth()这个函数的目的是改变列表视图控件的列的宽度,原型为
BOOLSetColumnWidth(intnCol,intcx);
第一个参数是要修改的列的索引号
第二个参数是要我们具体的将列设置成多大
m_pListCtrl->SetColumnWidth(i,g_Column_Data[i].nWidth);
g_Column_Width+=g_Column_Data[i].nWidth;设置软件界面的宽度是几个列的累加宽度
for(inti=0;i { m_pListCtrl->InsertColumn(i,g_Column_Data[i].title); m_pListCtrl->SetColumnWidth(i,g_Column_Data[i].nWidth); g_Column_Width+=g_Column_Data[i].nWidth; } 接下来,我们还需要调用一个函数PostMessage来发送一个消息,windows程序是以事件为驱动,以消息机制为基础的 是不是只有操作系统才能发送这样的一个消息呢,实际上不是,自己编写的程序也是可以的 CWnd: : PostMessage BOOLPostMessage(UINTmessage,WPARAMwParam=0,LPARAMlParam=0); PostMessage(WM_MYINITIALUPDATE); 这个函数的作用是将一个消息放到窗口的消息队列当中,不等待执行就返回,这个窗口就是指这个远控软件的进程,在我们程序中如果要接收到这个发送过来的消息的话,需要用到GetMessage或者PeekMessage这两个函数 在发送之前,我们需要自定义一个消息 ON_MESSAGE宏来进行消息的映射 这个宏要写在BEGIN_MESSAGE_MAP和END+MESSAGE_MAP之间,在gh0stView.cpp中去写入,写这个宏的目的是将消息和这个消息响应函数关联在一起 自己定义的消息应该在WM_USER和0x7FFF之间 #defineWM_MYINITIALUPDATE(WM_USER+101)//宏定义时名字与括号间要有空格 ON_MESSAGE的两个参数,一个是消息,我们已经自定义了,另一个就是消息响应函数,我们可以在头文件gh0stView.h中声明一个私有的成员函数 afx_msgLRESULTOnMyInitialUpdate(WPARAM,LPARAM); afx表示定义的是应用程序框架,表示的是消息响应函数 LRESULT代表的是32位的一个返回值 WPARAM和LPARAM都是一个指针,在LPARAM中高字节存储的是消息,低字节存储的,是事件的ID,而WPARAM中一般存储的都是句柄 所以上面的消息映射函数应写成 ON_MESSAGE(WM_MYINITIALUPDATE,OnMyInitialUpdate) 接下来就是需要对这个消息向应函数进行编写,写在gh0stView.cpp中的CGh0stViewmessagehandlers注释下面 在函数体中 CGh0stView*pView=this; 再写入一个返回return0;表示这个函数执行完成 声明一个类的指针,this表示的是CGh0stView类,这就是给这个this类取个名字 接下来就是对CMainFrame这个类进行编写 DOC这个类是存放数据的,程序中所使用的所有数据都是存在这个DOC文档当中的 VIEW这个类是用来画图或者是打印的 MainFrm这个类是窗口的一个框架,一般是作为主窗口出现的,用来包含各种窗口,或都是处理菜单和工具档的一些命令,这个类就涉及到程序主界面的编写 框架类中的OnCreate函数是用来创建程序的主窗口 状态栏也可以看作是一个窗口,以官方程序为例,这个状态栏分成了四个窗格 状态栏分为两类,一类是提示行,第二类是以窗格的形式来进行排列的显示,成为状态的指示器 在这个MainFrm.cpp中的OnCreate函数中我们会发现有这个m_wndToolBar变量,很明显这是个工具栏,而在远控中我们是看不到工具栏的,所在我们要去掉有关工具栏的编程,首先我们在头文件中去掉,这个变量的声明CToolBarm_wndToolBar; 接下来在CPP执行文件中去掉和工具栏编程相关联的部分代码 if(! m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP |CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|| ! m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate } 以及 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); 接下来我们说明一下CStatusBar: : Create这个函数的作用是在它的父窗口中创建一个窗口 m_wndStatusBar.Create(this)这个函数就是在主窗口中创建了一个状态栏 m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)) 设置指示器的ID,把ID设置成这个函数的第一个参数 所以在导入之前,我们需要在资源文件StringTable中将这个ID写进去 我们发现indicators在上面有声明是一个数组 staticUINTindicators[]= { ID_SEPARATOR,//statuslineindicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; 这里面的ID_SEPARATOR在StringTable中是可以找到的,我们就是要将新的ID加进去修改为 staticUINTindicators[]= { ID_STAUTSTIP, ID_STAUTSTSPEED, ID_STAUTSTPORT, ID_STAUTSTCOUNT, }; 并在相应的StringTable中进行添加标题 这样的话,就可以在状态栏中将这四个窗口栏显示出来 第五节课 我们通过一个成员变量m_wndStatusBar来调用相应的状态栏的成员函数SetPaneInfo设置窗格信息的,主要是设置窗格的宽度 这个函数是设置指示器窗格的新的ID,样式和宽度 第一个参数是设置的窗格索引号,0代表第一个窗格 第二个参数是ID号,m_wndStatusBar.GetItemID(0)的意思指的就是ID_STAUTSTIP,这里的0指的是索引号 第三个参数是指指示器新的一个风格SBPS_STRETCH,意思是没有使用的区域就会扩展这个窗格,几个窗格中只能有一个窗格可以设置成这个,本程序指定的是第一个窗格 第四个参数指示的具体的宽度 SBPS_NORMAL风格指的是普通的风格 完整的设置为 m_wndStatusBar.SetPaneInfo(0,m_wndStatusBar.GetItemID(0),SBPS_STRETCH,NULL); m_wndStatusBar.SetPaneInfo(1,m_wndStatusBar.GetItemID (1),SBPS_NORMAL,160); m_wndStatusBar.SetPaneInfo(2,m_wndStatusBar.GetItemID (2),SBPS_NORMAL,70); m_wndStatusBar.SetPaneInfo(3,m_wndStatusBar.GetItemID(3),SBPS_NORMAL,80); 接下来我们要设置程序界面的高度和宽度,我们需要重写这样一个函数PreCreateWindow,在头文件中,我们发现这个函数声明为了一个公共的成员函数,且是一个虚函数,可以用来重载,这个函数的参数是CREATESTRUCT类型的,这是一个结构体 更改窗口的宽度,实际上需要更改cs它的一些成员变量 指定新窗口的宽度,像素为单位 cs.cx=646; 同时还要考虑如果存在9列的时候,程序的宽度应该是有变化的 if(((CGh0stApp*)AfxGetApp())->m_bIsQQwryExist) { cs.cx+=100; } 最后设置软件的高度即可,cs.cy=310; 接下来,修改程序的标题 单文档的应用程序当中,有一个窗口的缺省的类型,只要修改了这个类型就可以了 把文档的类型添加到窗口的标题,是有一个叫FWS_ADDTOTITLE是我们窗口的一个缺省的类型,我们要做的是去掉,也就是我们要在窗口的样式中把这个类型去掉,我们的操作是 cs.style&=~FWS_ADDTOTITLE;意思是将这个类型对非之后,再与原来的样式取与操作,就达到了去掉的目的,而后再使用cs.lpszName="Gh0stRATBeta3.6";将窗口的标题进行设置即可,如果不去掉那个类型的话,那个类型就会自动的将窗口的标题进行覆盖。 接下来修改图标,先找到图标的资源文件,在到源代码中找到资源文件,将Icon文件夹下面的IDR_MAINFRAME删除掉,再右键选择Insert功能下的import将刚才找到的图标导入进来,并修改名字为IDR_MAINFRAME即可 接下来是选项卡程序的编写,首先要为这个工程填加新的类,选择工具栏->新建类 名字使用CTabSDIFrameWnd,基类使用CFrameWnd就可以了,这个类就是要作为选项卡来使用的 接下来我们要把CMainFrm的基类声明成CTabSDIFrameWnd这个类,创建的方法如下: 第一步: 在MainFrm.h这个文件中,包含一个头文件#include"TabSDIFrameWnd.h",之后我们使用#defineCFrameWndCTabSDIFrameWnd将这两个类等同起来,这样一来我们就将CMainFrm的基类修改为了CTabSDIFrameWnd这个类 接下来,就是对CTabSDIFrameWnd这个类进行编写,我们来到CTabSDIFrameWnd这个类的头文件TabSDIFrameWnd.h,首要的是我们要为这个类添加一个受保护的成员变量m_wndTab,这个变量作为我们编写的选项卡的成员变量来使用 protected: CCustomTabCtrlm_wndTab; CCustomTabCtrl这个类我们一会儿会讲到,现在还没有这个类 接下来,我们填加CCustomTabCtrl这个类,方法是在官方的原代码中找到文件CustomTabCtrl.cpp、CustomTabCtrl.h、ThemeUtil.cpp、ThemeUtil.h、Tmschema.h这样5个文件到我们的源代码当中。 之后我们就在工程中添加这几个文件了,因为这几个文件实际上是之前有人编写的一些插件,里面包含了控件的外观、风格、以及控件的一些操作,当我们用这到插件中的某一个函数的时候,我们再进行讲解说明。 HeaderFiles->右键->AddFilestoFolder…三个头文件 SourceFiles->右键->AddFilestoFolder…二个执行文件 其中CustomTabCtrl.cpp和CustomTabCtrl.h两个文件调用了其它的三个文件,所以都要包含进来,这些控件的目的就是一些主题相关的 接下来我们在TabSDIFrameWnd.h文件中包含一个头文件#include"CustomTabCtrl.h",这个头文件中有CCustomTabCtrl这个类的声明和定义 接下来,我们回到MainFrm.h文件当中,就可以直接使用在TabSDIFrameWnd.h当中的受保护的成员变量m_wndTab,这是因为CMainFrm是由CFrameWnd类派生的,CFrameWnd这个类又是和CTabSDIFrameWnd等价的,通过#defineCFrameWndCTabSDIFrameWnd实现 接下来,我们回来MainFrm.cpp,对成员变量m_wndTab进行设置,进行操作,也就是对我们程序界面上的选项卡的设置和操作 对于这样一个选项卡控件来讲,如果说我们需要使用它,那么我们首先需要创建一个控件所对应的成员变量,也就是说我们还是要创建一个控件,我们如何来创建呢? 就是通过m_wndTab这样一个类的对象来创建它所对应的这个控件,方法如下: 在OnCreate这个函数当中加入 m_wndTab.Create() 这里的Create函数就是新加入的头文件中的函数,而不是MSDN能查到的,对于导入的控件我们直接导入就可以了,不用再自己去编写相应的功能,很方便 Create(UINTdwStyle,constCRect&rect,CWnd*pParentWnd,UINTnID) 第一个参数指的是选项卡的风格 第二个参数是CRect结构的常量的一个指针,指定了我们选项卡的大小和位置 第三个参数是指定的是选项卡的父窗口,选项卡的上一级窗口是什么 第四个参数是一个无符号的整形,表示的是控件的ID returnCWnd: : Create(CustomTabCtrl_CLASSNAME,_T(""),dw
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- gh0st源码笔记 详解 gh0st 源码 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)