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