高分求助,关于消息捕获,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有分
...全文
6 点赞 收藏 28
写回复
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的线程就不行了……
回复 点赞
发动态
发帖子
进程/线程/DLL
创建于2007-09-28

6376

社区成员

4.9w+

社区内容

VC/MFC 进程/线程/DLL
社区公告
暂无公告