CallWindowProc - 奇怪的行为

时间:2018-02-17 09:18:05

标签: c++ winapi subclassing

它确实有效,但是以一种奇怪的方式。

我用

替换RichEdit控件的过程
    WNDPROC g_OrigREditText = 
(WNDPROC)SetWindowLongPtr( g_hwnd_RichEdit, GWLP_WNDPROC, (LONG_PTR)REditWndProc);

然后,使用EM_REPLACESEL消息将SendMessage发送到RichEdit控件,文本将显示在RichEdit控件中。但是当我用自己的程序替换标准程序,并在我自己的程序中处理EM_REPLACESEL时,则会发生以下情况。这是代码:

LRESULT CALLBACK REditWndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
    switch( msg )
    {

    case EM_REPLACESEL:
    {
        int sdfsdf = 0;

        CallWindowProc( (WNDPROC)g_OrigREditText, hwnd, msg, wp, lp );
        break;
    }


    default:
        return DefWindowProc( hwnd, msg, wp, lp);
        break;
    }

    return 0;

}

好的,我像往常一样向RichEdit发送EM_REPLACESEL消息并且效果很好,因为我在"案例中捕获了操作指针EM_REPLACESEL"块。

然后CallWindowProc应该通过将参数传递给链中的下一个过程来完成它的工作,但是没有任何反应,文本不会出现在RichEdit控件中。看起来像阻止消息传递给旧程序的东西,但是!如果我用REditWndProc替换g_OrigREditText,那么我再次捕获相同的UINT消息,所以它定义地进一步传递参数,就像它应该的那样。

那么CallWindowProc或我的代码有什么问题,我应该在哪里解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

整个事情被称为“子类化”,this可能很有用。

通常在与一条消息相关的事件中会发生更多事件,因此请将代码更改为

LRESULT CALLBACK REditWndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
    if( msg == EM_REPLACESEL)
    {
        // whatever you want
        return TRUE;// comment this 
                    // if you want to give it to the original proc.
    }

    return CallWindowProc( g_OrigREditText, hwnd, msg, wp, lp );
}