高分求助,关于消息捕获,UP有分

wj59 2003-07-16 09:55:47
我创建了一个COM,有一个方法(HWND参数)用 peekmessage 捕获HWND的消息

STDMETHODIMP CPMsg::BeginEdit(long hWnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

m_hWnd = (HWND)hWnd;

DoTest();
// AfxBeginThread (MyThread,this);
return S_OK;
}

void CPMsg::DoTest();
{
m_bDO = TRUE;

MSG msg;
while ( m_bDO )
{
while ( ::PeekMessage( &msg, m_hWnd, 0,0 ,PM_REMOVE) )
{
//.....
}
}

UINT MyThread( LPVOID pParam )
{
CPMsg *pLV = (CPMsg *)pParam;

pLV->DoTest ();

return 0;
}

问题是:在COM里直接调用DoTest()是可以的(但一直循环,系统挂起),于是我另起了一个线程MyThread()来调用DoTest(),这时就捕获不到任何消息了,why?

如有其他好办法,望给出源码
UP有分
...全文
35 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
wj59 2003-07-18
  • 打赏
  • 举报
回复
这里有没有人知道?
xdyanzg 2003-07-17
  • 打赏
  • 举报
回复
up
wj59 2003-07-17
  • 打赏
  • 举报
回复
To ukyoking(累):

你的意思我明白了,但问题是主窗口句柄可以是由VB程序创建的,怎么Post Message呀
ukyoking 2003-07-17
  • 打赏
  • 举报
回复
STDMETHODIMP CPMsg::BeginEdit(long hWnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

m_hWnd = (HWND)hWnd;

DoTest();
// AfxBeginThread (MyThread,this);
return S_OK;
}


你传入得窗口句柄hWnd应该是主窗口句柄,这样消息已经被主窗口过程截获了,线程自然收不到消息,解决办法是修改BeginEdit函数
m_hWnd = ::CreateWindow(...)创建一个消息窗口,为组件添加一个方法例如叫
HWND CPMsg::GetSafeHwnd()
{
return m_hWnd;
}
并修改主窗口过程
LRESULT CYourMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
//假设你的组建为CPMsg cpmsg;
PostMessage(cpmsg.GetSafeHwnd(),message,wParam,lParam);

return CFrameWnd::WindowProc(message, wParam, lParam);
}

这个方法颇显麻烦,你大可以改用PostThreadMessage向线程发送消息
wj59 2003-07-17
  • 打赏
  • 举报
回复
To jiangsheng(蒋晟.Net) :

已经有对象的hWnd了,还要用hook吗?
蒋晟 2003-07-17
  • 打赏
  • 举报
回复
HOOK
wj59 2003-07-17
  • 打赏
  • 举报
回复
To ukyoking(累) :
是用AfxBeginThread (MyThread,this);

To realdreamer(楼主英明,贫僧久仰大名,特来拜见) & Analyst() :
你们是如何在COM里(不是OCX)获得由VB程序窗口的任何消息?
chinacao 2003-07-17
  • 打赏
  • 举报
回复
up
flyycyu 2003-07-17
  • 打赏
  • 举报
回复
up
luogucai 2003-07-17
  • 打赏
  • 举报
回复
线程之间不能传递某些MFC对象,如CWnd,但是可以传递window对象,我感觉你应该将
AfxBeginThread (MyThread,this);
改为
AfxBeginThread (MyThread,this->m_hWnd);
,

但对于你的程序,即使这样也不能达到要求.

我认为你应该为m_hWnd创建一个窗口过程的钩子函数,截获窗口的消息.处理你需要处理的消息,根本不需要用到线程.


wj59 2003-07-17
  • 打赏
  • 举报
回复
还有人知道吗?
ukyoking 2003-07-17
  • 打赏
  • 举报
回复
To wj59(wj59):
同样很不幸,我vb不熟,看来是爱莫能助了
wj59 2003-07-17
  • 打赏
  • 举报
回复
To ukyoking(累):

很不幸,要产生窗口消息循环
ukyoking 2003-07-17
  • 打赏
  • 举报
回复
那么你的组件一定需要产生窗口消息循环吗,你可能是想在接受到某个消息时做相应得处理,这样得话只需要在vb事件中调用组件提供得方法
双杯献酒 2003-07-17
  • 打赏
  • 举报
回复
GZ
bager 2003-07-16
  • 打赏
  • 举报
回复
UP
zhaolaoxin 2003-07-16
  • 打赏
  • 举报
回复
在你的线程中并没有给m_hWnd赋值
zhaolaoxin 2003-07-16
  • 打赏
  • 举报
回复
在你的线程中并没有给m_hWnd赋值
wj59 2003-07-16
  • 打赏
  • 举报
回复
有人知道吗??
wj59 2003-07-16
  • 打赏
  • 举报
回复
一个线程想要获得一个窗口的消息, 要求窗口必须是这个线程创建的?

但我这里的HWND是由VB创建并传入COM里的,并在COM里直接调用DoTest()是可以的,只是在COM的线程就不行了……
加载更多回复(8)

15,471

社区成员

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

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