通过消息断点查找子窗口的窗口过程
win32中 通过DialogBox函数创建一个对话框
``
// src.cpp : Defines the entry point for the application.
//
#include “stdafx.h”
#include “resource.h”
#define REGISTER_FALD -0x10 //窗口类注册失败
BOOL CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int APIENTRY WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,WindowProc);
return 0;
}
BOOL CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
TCHAR szUserName[100];
TCHAR szPassword[100];
HWND hUser=0;
HWND hPass=0;
switch(uMsg)
{
case WM_LBUTTONDOWN:
return true;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDOK:
hUser=GetDlgItem(hwnd,IDC_USERNAME);
GetWindowText(hUser,szUserName,50);
hPass=GetDlgItem(hwnd,IDC_PASSWORD);
GetWindowText(hPass,szPassword,50);
if(!strcmp(szUserName,TEXT("yxp1991")))
{
MessageBox(hwnd,TEXT("正确的密码"),TEXT("hip"),0);
}
else
MessageBox(hwnd,TEXT("错误的密码"),TEXT("error"),0);
return true;
case IDCANCEL:
EndDialog(hwnd,0);
return true;
return false;
}
}
}
return false;
}
为主窗口提供一个窗口消息处理函数。而窗口内的各种控件不需要写处理函数,系统已经写好。
要找到自己写的空间处理程序需要两步。第一步,截获子窗口的WM_LBUTTONUP消息 以确定是哪一个控件。
第二步 ,截获WM_COMMAND消息 因为子窗口的消息会转换成WM_COMMAND消息发送给主窗口。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190124232407407.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDkwODcz,size_16,color_FFFFFF,t_70)
像这个程序中OK按钮的回调函数怎么找呢?
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190124232614115.png)
打开OD 点击W 找到button下消息断点 WM_LBUTTONUP 然后再点击m 在.text代码段下一个内存访问断点。
程序继续运行就会断在应用程序的代码段观察堆栈窗口 当消息类型为111时(下一个条件断点),就找到了子窗口的消息处理函数一直单步就可以了。