You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何接收CreateWindow()创建的按钮向父窗口发送的消息?

手动创建Win32按钮的消息处理问题

你使用以下代码创建了按钮:

HWND hwndButton = CreateWindow(
        "BUTTON",  // Predefined class;
        "Options",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
        250,         // x position 
        0,         // y position 
        50,        // Button width
        30,        // Button height
        hwnd,     // Parent window
        NULL,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE),
        NULL);

你提到可视化创建对话框按钮时,可通过父窗口过程的WM_COMMAND消息+控件ID(如IDC_BUTTON)来处理按钮事件,但手动创建时没有预设的控件ID,想知道按钮按下时发送的消息。


解答

手动创建的按钮按下时,同样会向父窗口发送WM_COMMAND消息,核心是你需要给按钮指定自定义控件ID:

  1. 设置控件ID:CreateWindow的第7个参数(hMenu)对于子控件来说实际是控件ID,你之前传的是NULL,可以替换成自定义的数值(建议选1000以上,避免和系统预设ID冲突):
// 先定义自定义控件ID
#define IDC_OPTIONS_BUTTON 1001

HWND hwndButton = CreateWindow(
        "BUTTON",
        "Options",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        250, 0, 50, 30,
        hwnd,
        (HMENU)IDC_OPTIONS_BUTTON, // 这里传入自定义控件ID
        (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE),
        NULL);
  1. 处理WM_COMMAND消息:在父窗口的窗口过程中,通过LOWORD(wParam)获取控件ID,结合通知码判断按钮事件:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_COMMAND:
            // LOWORD(wParam) 是控件ID,HIWORD(wParam) 是通知码(BN_CLICKED表示按钮被点击)
            if(LOWORD(wParam) == IDC_OPTIONS_BUTTON && HIWORD(wParam) == BN_CLICKED)
            {
                // 这里写按钮按下后的处理逻辑
                MessageBox(hwnd, "Options按钮被按下", "提示", MB_OK);
            }
            break;
        
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
            
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

额外说明:因为你给按钮设置了BS_DEFPUSHBUTTON样式,用户按下回车键时,也会触发这个按钮的WM_COMMAND消息。


内容的提问来源于stack exchange,提问作者bugger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:51:28