简体   繁体   中英

CallWindowProc - strange behavior

It definetly works, but in a strange way.

I'm replacing RichEdit control's procedure with

    WNDPROC g_OrigREditText = 
(WNDPROC)SetWindowLongPtr( g_hwnd_RichEdit, GWLP_WNDPROC, (LONG_PTR)REditWndProc);

Then, I SendMessage to RichEdit control using EM_REPLACESEL msg, and the text appears in the RichEdit control as it should. But when I replace standard procedure with my own, and process EM_REPLACESEL in mine own procedure, then the following scenario happens. Here's the code:

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;

}

Ok, I send an EM_REPLACESEL message to the RichEdit as usual and it works well, cos I catch operation pointer in "case EM_REPLACESEL" block.

Then CallWindowProc should do its job by passing parameters to the next procedure in the chain, but instead nothing happens, the text doesn't appear in a RichEdit control. Looks like something prevent the message to be passed to old procedure, but! if I replace g_OrigREditText with REditWndProc, then I catch the same UINT msg again, so it definetely pass parameters further, like it should.

So what's wrong with CallWindowProc or with my code, where should I dig to fix the problem?

The whole thing is called "subclassing" and this can be useful .

usually there are more events that occurs in relating with one message so change your code to 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 );
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM