子窗口的窗口回调函数的查找

通过消息断点查找子窗口的窗口过程

在这里插入图片描述

子窗口的消息处理过程:当点击子窗口时,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时(下一个条件断点),就找到了子窗口的消息处理函数一直单步就可以了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值