通过消息断点查找子窗口的窗口过程
子窗口的消息处理过程:当点击子窗口时,LBUTTONDOWN消息会转换成WM_COMMAND消息发送给父窗口。
在父窗口的WM_COMMAND中处理消息, 1001是创建窗口时自定义的一个ID值。
查找子窗口处理函数思路
在父窗口的窗口处理函数中下一个条件断点, WM_COMMAND==[esp+8] 。[esp+8]是参数消息类型。
这样点击子窗口就会在父窗口的处理函数中断下来。
再通过[esp+c] 就可以确定是哪一个子控件的消息。
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,
LPSTR 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消息 以确定是哪一个控件。
为什么是截获LBUTTONDOWN呢? 因为控件的消息也有非常多,都会经过系统的默认窗口处理程序,所以需要使用条件来过滤.
系统的控件,例如button,系统已经提供好了处理函数,在dll中.所以相同类型的控件的处理函数是一样的.
消息处理的先后顺序是 消息先走系统提供的winproc,然后再传递给用户自定义的消息处理.
第二步 ,截获WM_COMMAND消息 因为子窗口的消息会转换成WM_COMMAND消息发送给主窗口。
因为子窗口的消息传递到父窗口的时候是以WM_COMMAND消息传递的.
像这个程序中OK按钮的回调函数怎么找呢?
打开OD 点击W 找到button的窗口处理程序下消息断点 WM_LBUTTONUP 然后再点击m 在.text代码段下一个内存访问断点。
程序继续运行就会断在应用程序的代码段观察堆栈窗口 当消息类型为111时(下一个条件断点),就找到了子窗口的消息处理函数一直单步就可以了。