首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

DLL中怎么拦截窗口消息

2013-12-29 
DLL中如何拦截窗口消息我们负责一个用VC6开发的DLL,由上层一个带主窗口的主程序调用。我们没有主程序的代码

DLL中如何拦截窗口消息
我们负责一个用VC6开发的DLL,由上层一个带主窗口的主程序调用。我们没有主程序的代码。
主程序传递给DLL主窗口的指针CWnd *,我们也不知道主窗口的派生类。

DLL中凭借得到的CWnd *窗口指针,想要拦截其WM_DEVICECHANGE消息,该如何实现?最好有示例。
[解决办法]
子类化

//通过传递过来的CWnd *获取窗口句柄
HWND hWnd=pWnd->m_hWnd;
//子类化 hProc是一个全局变量
hProc=SetWindowLong(hWnd,GWL_WNDPROC,(LONG)&NewProc);
//新的窗口过程
LRESULT CALLBACK NewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DEVICECHANGE:
//这就是你要的消息了
break;
}
return CallWindowProc(hProc,hWnd, message, wParam, lParam);
}

[解决办法]
也可以用

LRESULT CALLBACK MyCallWndProc(
  __in  int nCode,
  __in  WPARAM wParam,
  __in  LPARAM lParam
)
{
// lParam Pointer to a CWPSTRUCT structure that contains details about the message
}
SetWindowsHookEx(WH_CALLWNDPROC,MyCallWndProc,GetModuleHandle("yourdll.dll"), 0);


[解决办法]
dll 在 exe 内存里的话  直接   getwindowlong 得到  窗体的 消息处理过程
然后 setwindowlong 注册新的 代替原来的, 实现拦截后 记得要 调用原来的 过程
[解决办法]
引用:
也可以用

LRESULT CALLBACK MyCallWndProc(
  __in  int nCode,
  __in  WPARAM wParam,
  __in  LPARAM lParam
)
{
// lParam Pointer to a CWPSTRUCT structure that contains details about the message
}
SetWindowsHookEx(WH_CALLWNDPROC,MyCallWndProc,GetModuleHandle("yourdll.dll"), 0);



引用:
dll 在 exe 内存里的话  直接   getwindowlong 得到  窗体的 消息处理过程
然后 setwindowlong 注册新的 代替原来的, 实现拦截后 记得要 调用原来的 过程

lz
可以结贴了

热点排行