一个简单的子类化的问题:

xrbeck 2001-03-14 06:43:00
各位大虾:小弟用以下的代码怎么好象不行啊?怎么回事?
WNDPROC WndProc=NULL;
HWND hBegin;
LRESULT CALLBACK MyApp(HWND ,UINT,WPARAM,LPARAM);
//---------------------------------------------------------------------------

LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{

//WndProc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);

switch(message)
{
case WM_LBUTTONDOWN:
ShowMessage("haha");
break;

case WM_RBUTTONDOWN:
ShowMessage("heihei");
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);//1处
// return CallWindowProc(WndProc,hwnd,message,wParam,lParam);//2处。

}

return 0;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// HWND hTool=FindWindow("Shell_TrayWnd",0);
// HWND hBegin=GetWindow(hTool,GW_CHILD);

hBegin=FindWindow(NULL,"qwe");
::WndProc=(WNDPROC)SetWindowLong(唊tton2->Handle,GWL_WNDPROC,(LONG)MyApp);

SetWindowPos(hBegin,HWND_TOP,50,50,50,22,SWP_ASYNCWINDOWPOS|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED);
}

其实也就是想设置别的进程的消息处理函数。但因为属不同进程。所以要用SETWINDOWPOS。不知这样用对不对。而且在1处我用2替代也不行。(编译出错。
说类型不匹配)。
谢谢?位大虾的指点。
...全文
201 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xrbeck 2001-03-21
  • 打赏
  • 举报
回复
哎呀。。结帐了。。。呵呵
xrbeck 2001-03-18
  • 打赏
  • 举报
回复
to In355Hz(好象一条狗):
顺便帮我看看ID=78666。“两个内核对象的问题”。。
很想听听你的看法。。。
谢谢。。
xrbeck 2001-03-17
  • 打赏
  • 举报
回复
to In355Hz(好象一条狗):
恩。我现在想想可能是。应该不可以直接这样用。。
我想用钩子解决。。可是你提到要”把自己不处理的消息发送给窗口原来的消息处理函数处理“
如果用GETWINDOWLONG来解决:
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
CallWindowProc((FARPROC)oldproc,hBegin,msgtemp->message,msgtemp->wParam,msgtemp->lParam);
好象会出错。。这个是放到DLL中的钩子处理函数中。应该不会啊。。。
怎么跑起来就跟发生进程越界的错误样的。。。。?
 
xrbeck 2001-03-17
  • 打赏
  • 举报
回复
啊。。不会吧。。那这个功能有这么弱吗。?
别的进程也不可以?
这句话不就跟在那句出错的下面吗?
In355Hz 2001-03-16
  • 打赏
  • 举报
回复
这句话并不是说你用了SetWindowPos就可以设置其他进程中的窗口,它的意思是你如果用SetWindowLong修改了窗口参数,你修改后的效果将暂时无效,直到你使用SetWindowPos函数重置窗口。
xrbeck 2001-03-16
  • 打赏
  • 举报
回复
关注啊。关注。
xrbeck 2001-03-16
  • 打赏
  • 举报
回复
to In355Hz(好象一条狗):
可是你好象没看到下面说的:Certain window data is cached, so changes you make using SetWindowLong will not take effect until you call the SetWindowPos function.
也就是说可以通过SETWINDOWPOS来使他执行。应该可以不用钩子啊。好象没那么麻烦啊。
我估计就是点小毛病。。。呵呵。不知对不对。
请指教。。。

xrbeck 2001-03-16
  • 打赏
  • 举报
回复
to In355Hz(好象一条狗):
可是你好象没看到下面说的:Certain window data is cached, so changes you make using SetWindowLong will not take effect until you call the SetWindowPos function.
也就是说可以通过SETWINDOWPOS来使他执行。应该可以不用钩子啊。好象没那么麻烦啊。

In355Hz 2001-03-14
  • 打赏
  • 举报
回复
此外,你可以看看Jeffrey Richter的Window核心编程,你面有个例子,就是用钩子子类化其他进程窗口的。
这里有这本书下载:
ftp://ftp.dlut.edu.cn/pub1/books/UML/Windows/
In355Hz 2001-03-14
  • 打赏
  • 举报
回复
MSDN原话:
The SetWindowLong function fails if the window specified by the hWnd parameter does not belong to the same process as the calling thread.
如果调用SetWindowLong的线程和窗口不在同一进程中,调用将失败。
要子类化其他进程窗口,应该用全局钩子(一般是消息钩子WH_GETMESSAGE)把你的子类化代码(如WindowProc)和钩子函数放到同一dll中,从而将代码嵌入其他进程,再通过发送某种全局自定义消息激活其他进程中钩子函数,在钩子函数中响应此消息完成子类化工作。
此外,你是用子类化吗?子类化最好在结束时把自己不处理的消息发送给窗口原来的消息处理函数处理(不然原来窗口的特性被破坏)。所以先得得到窗口原来的消息处理函数并保存起来。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧