它确实有效,但是以一种奇怪的方式。
我用
替换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或我的代码有什么问题,我应该在哪里解决这个问题呢?
答案 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 );
}