*请教* 只知道窗口句柄 如何获取窗口大小改变消息(wm_size)!!!!

allenjiao 2010-09-30 03:02:24
本人开发的动态库dll供别人使用;
使用dll只给我传了窗口句柄 在dll需要捕捉窗体改变大小消息

有没有什么办法?????????
我网上查了下 ;钩子可以实现吗?

...全文
737 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenjiao 2010-10-04
  • 打赏
  • 举报
回复
HHOOK IEHook; //全域

LRESULT CALLBACK HookIECallBack(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
CWPSTRUCT* data= (CWPSTRUCT*)lParam;
if (data->message == WM_SIZE)
{
//处理message
}
}
return CallNextHookEx(IEHook, nCode, wParam, lParam);
}

IEHook = ::SetWindowsHookEx(WH_CALLWNDPROC,HookIECallBack,::GetModuleHandle(NULL),0);


//释放
UnhookWindowsHookEx(IEHook);
sunlin7 2010-10-03
  • 打赏
  • 举报
回复
以下几种办法:
1、子类化窗口。使用SetWindowLong(GWL_WNDPROC, ...)将窗口过程改为自己的窗口过程,这其中拦截WM_SIZE消息。
2、进程内消息hook,使用SetWindowsHookEx(WH_CALLWNDPROC,...)来捕获窗口消息,在其中过滤WM_SIZE.
3、(楼下补充)
allenjiao 2010-10-03
  • 打赏
  • 举报
回复
谢谢大家的回复

我试试后 给分
再次感谢
yann2 2010-10-03
  • 打赏
  • 举报
回复
10楼的方法挺不错 简单 易懂

你可以创建个线程来实时监控 如果这个CRect的成员的大小发生变化那不就捕捉到了
tfzxyinhao 2010-10-01
  • 打赏
  • 举报
回复
10楼是正解
Applic 2010-10-01
  • 打赏
  • 举报
回复
这样设计不当吧
zhouyongku 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhouyongku 的回复:]

老大,一个函数就搞定了!!!
::MoveWindow(窗口句柄,位置...)
[/Quote]
上面是改变窗口大小

下面是获取窗口大小

BOOL GetWindowRect( HWND hWnd, LPRECT lpRect);
超Easy
zhouyongku 2010-09-30
  • 打赏
  • 举报
回复
老大,一个函数就搞定了!!!
::MoveWindow(窗口句柄,位置...)
psbeond 2010-09-30
  • 打赏
  • 举报
回复
如果hWnd和你是一个进程,你可以用SetWindowLong(hWnd,GWL_WNDPROC, (LONG)(WndProc));
来子类化窗口。这样就可以处理hWnd的所有消息了。
如果hWnd和你不是一个进程,你必须写个dll,用CreateRemoteThread的方法,把你写的dll注入到对方进程,然后再按上面说的子类化hWnd.
Eleven 2010-09-30
  • 打赏
  • 举报
回复
HOOK WM_SIZE
jacky_qiu 2010-09-30
  • 打赏
  • 举报
回复
钩子可以,特别假如窗口句柄是其他进程的,就非钩子不可啦。

用SetWindowLong替换窗口过程也可以,就是子类化啦。


WNDPROC OLDWNDPROC;
LRESULT CALLBACK MyWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_SIZE:
{

}
break;

default:
return ::CallWindowProc(OLDWNDPROC, hWnd, message, wParam, lParam);
}
return 0;
}

//创建窗口函数
void CreateWnd()
{
HWND hWnd=CreateWindowEx(WS_EX_TOPMOST,_T("#32770"), _T("Hello"),
WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,200,200,NULL,NULL,NULL,NULL);

//把hWnd的默认窗口过程替换为kkWndProc,返回默认函数过程的函数指针
OLDWNDPROC=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC, (LONG) (MyWndProc));
}
allenjiao 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tiger9991 的回复:]
钩子当然是可以的,你可以尝试下这个
PretranslateMessage

BOOL CtestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg == WM_SIZE)
{

}
retur……
[/Quote]

我试试这个方法
allenjiao 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 weiym 的回复:]
2种方案:
1. Subclass窗口
2. 让别人再改变窗口大小Move你的窗口,或是让他通知你
[/Quote]

第二种方法可以实现
这方法不太友好 但有没有更好的方法
QQ_456 2010-09-30
  • 打赏
  • 举报
回复
xuexi
weiym 2010-09-30
  • 打赏
  • 举报
回复
2种方案:
1. Subclass窗口
2. 让别人再改变窗口大小Move你的窗口,或是让他通知你
傻X 2010-09-30
  • 打赏
  • 举报
回复
pMsg.message
傻X 2010-09-30
  • 打赏
  • 举报
回复
钩子当然是可以的,你可以尝试下这个
PretranslateMessage

BOOL CtestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg == WM_SIZE)
{

}
return CDialog::PreTranslateMessage(pMsg);
}

不知道可以么,推荐楼主尝试啊

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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