callwindowproc-奇怪的行为

CallWindowProc - strange behavior

本文关键字:callwindowproc-      更新时间:2023-10-16

它明确地工作,但以一种奇怪的方式。

我正在用

替换Richedit Control的过程
    WNDPROC g_OrigREditText = 
(WNDPROC)SetWindowLongPtr( g_hwnd_RichEdit, GWLP_WNDPROC, (LONG_PTR)REditWndProc);

然后,我使用em_replacesel msg将其发送到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消息,并且效果很好,cos我在" case em_replacesel"块中捕获操作指针。

然后,CallwindowProc应该通过将参数传递到链中的下一个过程来完成其作业,但是没有发生任何事情,文本不会出现在富裕的控件中。看起来有些阻止消息传递给旧过程,但是!如果我用reditwndproc替换g_origredittext,那么我再次捕获相同的uint msg,因此它可以像应该一样进一步传递参数。

那么CallwindowProc或我的代码有什么问题,我应该在哪里挖掘解决问题?

整个事物称为"子类",这很有用。

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

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 );
}