C 编辑控件上未触发回调

C 编辑控件上未触发回调,c,winapi,C,Winapi,我正在尝试将回调事件处理程序附加到windows控件。我的代码如下: URLInput.c #include <windows.h> #define ID_EDITCHILD 100 LRESULT CALLBACK URLInputWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) // Breakpoint set here never

我正在尝试将回调事件处理程序附加到windows控件。我的代码如下:

URLInput.c

#include <windows.h>

#define ID_EDITCHILD 100

LRESULT CALLBACK URLInputWndProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch (uMsg) // Breakpoint set here never fires
    {
        ...
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

HWND URLInput(HWND hwnd)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    WNDCLASSW wc = { 0 };

    wc.lpszClassName = L"Edit Control";
    wc.lpfnWndProc  = URLInputWndProc;
    wc.hInstance    = hInstance;

    RegisterClassW(&wc);

    hwnd = CreateWindowExW(
        0,
        L"EDIT",
        NULL,
        WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL, 
        0,
        0,
        100,
        100,
        hwnd,
        (HMENU) ID_EDITCHILD,
        (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
        NULL
    );

    if (hwnd == NULL) {
        return 0;
    }

    return hwnd;
}
#include <windows.h>

#define ID_EDITCHILD 100

static WNDPROC oldURLInputProc = 0;

LRESULT CALLBACK URLInputWndProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch (uMsg)
    {
        /* Do something with messages */
    }

    return CallWindowProc(oldURLInputProc, hwnd, uMsg, wParam, lParam);
}

HWND URLInput(HWND hwnd)
{
    return CreateWindowExW(
        0,
        L"EDIT",
        NULL,
        WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL, 
        0,
        0,
        100,
        100,
        hwnd,
        (HMENU) ID_EDITCHILD,
        (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
        NULL
    );
}

void setOldURLInputProc(WNDPROC wndProc)
{
    oldURLInputProc = wndProc;
}
天气转晴。但是,如果我在第11行
switch(uMsg)
上设置一个断点,它永远不会中断。例如,我希望在创建窗口时它会断开。或者,在输入中输入文本时。但这并没有发生

我已经查看了MSDN文档,尽管我找不到任何关于将
WNDCLASS
与控件一起使用的内容


你知道我哪里出错了吗?

谢谢@Thomas在评论中的帮助。我解决了将创建的组件子类化的问题

URLInput.c

#include <windows.h>

#define ID_EDITCHILD 100

LRESULT CALLBACK URLInputWndProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch (uMsg) // Breakpoint set here never fires
    {
        ...
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

HWND URLInput(HWND hwnd)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    WNDCLASSW wc = { 0 };

    wc.lpszClassName = L"Edit Control";
    wc.lpfnWndProc  = URLInputWndProc;
    wc.hInstance    = hInstance;

    RegisterClassW(&wc);

    hwnd = CreateWindowExW(
        0,
        L"EDIT",
        NULL,
        WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL, 
        0,
        0,
        100,
        100,
        hwnd,
        (HMENU) ID_EDITCHILD,
        (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
        NULL
    );

    if (hwnd == NULL) {
        return 0;
    }

    return hwnd;
}
#include <windows.h>

#define ID_EDITCHILD 100

static WNDPROC oldURLInputProc = 0;

LRESULT CALLBACK URLInputWndProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch (uMsg)
    {
        /* Do something with messages */
    }

    return CallWindowProc(oldURLInputProc, hwnd, uMsg, wParam, lParam);
}

HWND URLInput(HWND hwnd)
{
    return CreateWindowExW(
        0,
        L"EDIT",
        NULL,
        WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL, 
        0,
        0,
        100,
        100,
        hwnd,
        (HMENU) ID_EDITCHILD,
        (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
        NULL
    );
}

void setOldURLInputProc(WNDPROC wndProc)
{
    oldURLInputProc = wndProc;
}
Microsoft文档有助于:


一切正常。

已经很久了,但是
CreateWindowExW
L“EDIT”
)中的类名不应该与注册回调的类名匹配吗(
L“EDIT Control”
)?我也这么认为。我用
L“编辑”
尝试了这两种方法。如果我这样做,根本不会渲染。这里的示例:使用相同的名称。啊,是的,但这是主窗口。我在文档的某个地方读到,当为控件创建窗口时,必须指定控件类。比如这里:我认为你需要做一些类似的事情。