文章

滴水-day41-子窗口-消息处理函数-子消息回调函数定位

子窗口

按钮窗口,创建按钮窗口时需要指定父窗口的句柄,表示该子窗口附加在父窗口上,

HWND buuton = CreateWindowW(
		TEXT("BUTTON"),
		TEXT("按钮"),
		WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON | BS_TEXT,
		10,10,80,20,
		hwnd,
		(HMENU)1001,
    hInst,
		nullptr
	);

需要给子窗口指定一个父窗口,否则子窗口无法正确的依赖在父窗口上也就无法正确的处理子窗口消息。

类似于这种的系统预定义的类窗口,消息处理函数由系统调用,系统处理完成该函数后会把消息发送到WM_COMMAND中再由用户进行处理。

其中hMenu属性是该窗口的编号,后续想要处理这个窗口,都需要用到这个编号。

子窗口消息回调定位

在定位到WndPorc函数后,需要观察子窗口消息的时候,就需要对WndProc的第二个参数(message)和第三个参数(wParam)的高位进行条件断点。

[esp+0x8] == WM_COMMAND && [esp+0xc]== 3EA

就像这样。

MessageBox函数

为什么设置第一个参数为主窗口的句柄的时候,用户就无法点击主窗口了,而是必须等待子窗口关闭? 设置 MessageBox 的第一个参数为主窗口句柄时,之所以用户无法点击主窗口,必须等子窗口(消息框)关闭后才能继续操作,是因为 模态对话框 的设计。

详细原因:

  1. 模态对话框:当调用 MessageBox 并传递主窗口句柄时,系统会创建一个模态对话框。这意味着这个对话框阻止用户与其父窗口(主窗口)进行交互,直到对话框关闭。模态对话框的作用就是“阻塞”用户的操作,迫使用户先处理这个对话框。

  2. 父子窗口关系:当 MessageBox 的第一个参数为主窗口的句柄时,系统会将 MessageBox 与主窗口建立父子窗口关系。父窗口会失去焦点并被锁住,直到子窗口(即 MessageBox)被关闭。这是 Windows 系统管理窗口焦点的一种方式,确保用户必须处理模态对话框。

  3. 事件循环的影响:模态对话框会“拦截”事件循环,阻止父窗口接收和处理用户的输入事件(如鼠标点击和键盘输入),直到模态对话框被关闭。这是通过 Windows 消息系统来实现的。系统暂时暂停主窗口的消息处理,直到模态对话框关闭时才恢复。

  4. 非模态对话框的对比:如果第一个参数传递的是 nullptr,那么 MessageBox非模态的,它不会与任何特定的窗口建立父子关系。在这种情况下,用户可以继续操作主窗口和其他窗口,因为 MessageBox 不会阻止主窗口接收事件。

License:  CC BY 4.0