不忘初心,护天下安全!

学习使用的书籍:《C++黑客编程揭秘与防范》

0x01 初识Windows消息

发送消息可以用来打开记事本的进程、关闭笔记本的进程、获取窗口的标题和设置窗口的标题。程序的具体代码为:

void CMsgTestDlg::OnClose() { HWND hWnd = ::FindWindow("Notepad",NULL); if(hand == NULL) { AfxMessageBox("没有找到记事本"); return; } ::SendMessage(hWnd,WM_CLOSE,NULL,NULL); } void CMsgTestDlg::ONExec() { WinExec("notepad.exe",SW_SHOW); } void CMsgTestDlg::OnEditWnd() { HWND hWnd=::FindWindow(NULL,"无标题 - 记事本"); if(hand == NULL) { AfxMessageBox("没有找到记事本"); return; } char *pCaptionText = "消息测试"; ::SendMessage(hWnd,VM_SETTEXT,(WPARAM)0,(LPARAM)pCaptionText); } void CMsgTestDlg::OnGetWnd() { HWND hWnd=::FindWindow("Notepad",NULL); if(hand == NULL) { AfxMessageBox("没有找到记事本"); return; } char pCaptionText[MAXBYTE]={0}; ::SendMessage(hWnd,VM_SETTEXT,(WPARAM)0,(LPARAM)pCaptionText); AfxMessageBox(pCaptionText); }

FindWindow()功能是通过指定的窗口名返回窗口句柄,其有两个参数,lpClassName为窗口类名,通常使用第二个长处lpWindowName指定窗口的名称。当函数找到该窗口时,会返回它的窗口句柄。

SendMessage()函数根据指定窗口句柄将消息发送给指定的窗口。三个参数分别是HWND对象要接受消息的窗口的窗口句柄、UINT对象要发送消息的消息类型,第三个参数WPARAM对象和第四个参数LPARAM对象是消息的两个附加参数。第二个参数分别是:

           

不忘初心,护天下安全!

使用FindWindow()函数时,通常使用第二个参数,获取窗口的类名称常用Spy++。

0x02 Windows消息机制的处理

不忘初心,护天下安全!

Windows应用程序执行流程非常复杂,可以看到主程序和窗口过程没有直接的调用关系,它们之间使用系统程序模块进行连接。主程序是用来注册窗口类、获取消息和分发消息的,窗口过程中定义了需要处理的消息,会根据不同的消息执行不同的动作,而不需要程序处理的消息则会交给默认的系统进程进行处理。

不忘初心,护天下安全!

这里学习到一个比较简单的例子:

WinMain()函数的定义如下:

int WINAPI WinMain( HINSTANCE hInstance, //应用程序的实例句柄,即为程序装入内存后的起始地址 HINSTANCE hPrevInstance, //同一文件创建的上一个实例的实例句柄 LPSTR lpCmdLine, //主函数的参数,用于程序启动时给进程传递参数 int nCmdShow //进程显示的方式,可以使最大化显示、最小化显示或者隐藏等 );

因为主函数要完成的任务是注册一个窗口类,创建一个窗口并显示创建的窗口,然后不停的获取属于自己的消息并分发给自己的窗口过程,直到收到WM_QUIT消息后推出消息循环结束进程:

不忘初心,护天下安全!

使用了MyRegisterClass函数,传递实例句柄作为参数,首先填充WNDCLASSEX结构体,然后调用RegisterClassEx函数进行注册。见下:

不忘初心,护天下安全!

不忘初心,护天下安全!

其中,lpfnWndProc是最重要的字段,保存窗口过程的地址。注册窗口类的重点是在后面的代码中可以根据该窗口类创建该种类型的窗口。代码中,在定义窗口类时指定了背景色、鼠标指针和窗口图表等,则使用该窗口类创建的窗口都具有相同的窗口类型。

创建主窗口并显示更新的代码为:

不忘初心,护天下安全!

窗口函数是由操作系统进行调用的,代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgsxj.html