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

模拟多个按钮点击SendMessage 中断,该如何解决

2012-04-02 
模拟多个按钮点击SendMessage中断我做了一个循环 循环里 模拟多个按钮的点击 我用sendmessage 和postmessa

模拟多个按钮点击SendMessage 中断
我做了一个循环 循环里 模拟多个按钮的点击 我用sendmessage 和postmessage 都不行 都是执行完第一个按钮后就没反应了
为什么呢 我知道sendmessage是需要应答后才继续 postmessage是不用等应答就继续,可是我改成postmessage也是不行啊

但是当我在两个按钮执行中间 放个AfxMessageBox("随便一句"); 随便输出一句 我手动点确定后就回继续走下去 为什么呢?
代码如下

C/C++ code
while(!m_pRecordset->adoEOF)      { ::SendMessage(m_btn_goto.m_hWnd, BM_CLICK,0,0);            AfxMessageBox("执行KAISHI!");  //加上一个提示就能继续执行了 ,不加的话就停了      ::SendMessage(m_btn_loginin.m_hWnd, BM_CLICK,0,0);        AfxMessageBox("执行第2步!");   //加上一个提示就能继续执行了 ,不加的话就停了     ::SendMessage(m_btn_loginout.m_hWnd, BM_CLICK,0,0);        AfxMessageBox("执行第3步!");   //加上一个提示就能继续执行了 ,不加的话就停了     m_pRecordset->MoveNext();      } 


都改成postMessage也不行。。。。
到底要怎么样才可以一直循环啊 不用加那个提示语句。

[解决办法]
BN_CLICKED通知是通过WM_COMMAND消息传递的,WM_COMMAND消息是发送给按钮的父窗口的
HWND hButton = xxx; // 这个按钮的HWND窗口句柄
UINT nId = GetDlgCtrlID(hButton);
PostMessage(GetParent(hButton), WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hButton);
[解决办法]
你的这个是函数是在消息循坏里面吗?

如果是的话, while 循环阻断了消息循环。
[解决办法]
我是这个意思

MessageBox有个特点就是里面有消息循环,能够分发消息
如果你的浏览器的工作需要消息循环才能进行,则MessageBox起到了这个作用

你试一下把MessageBox换成
{
MSG msg;
while(PeekMessage(&msg,0,0,0,PM_REMOVE));
}
[解决办法]
while死循环把消息给堵了
[解决办法]
你把messagebox换成
{
MSG msg;
while(PeekMessage(&msg,0,0,0,PM_REMOVE));
}试试
[解决办法]
{
MSG msg;
while(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

[解决办法]
{
MSG msg;
while(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
[解决办法]
::SendMessage(m_btn_goto.m_hWnd, BM_CLICK,0,0);
----------
直接调用按钮消息函数OnBtnGoto就可以了,不用再发消息这么麻烦,又不是多线程。
[解决办法]
既然能执行到AfxMessageBox,说明第一个SendMessage完成了(可能成功,可能失败),
检查一下OnBtnGoto函数、OnBtnloginin、OnBtnlogout干了什么,可能造成死锁。
[解决办法]
我测试了一下

三个按钮 其中两个绘图 另一个模拟消息 是可以的啊

你的按钮响应函数中做了什么

void CTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码

MessageBox(L"ff");

CWnd* pWnd = GetDlgItem(IDC_STATIC_MY1);

CDC* pDC = pWnd->GetDC();

CRect rc;
pWnd->GetClientRect(&rc);

CBrush b;
b.CreateSolidBrush(RGB(255,0,255));
pDC->FillRect(rc, &b);



}

void CTestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码

CWnd* pWnd = GetDlgItem(IDC_STATIC_MY);

CDC* pDC = pWnd->GetDC();

CRect rc;
pWnd->GetClientRect(&rc);

CBrush b;
b.CreateSolidBrush(RGB(255,255,0));
pDC->FillRect(rc, &b);
}

void CTestDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码

::SendMessage(m_btn1.m_hWnd, BM_CLICK,0,0);



::SendMessage(m_btn2.m_hWnd, BM_CLICK,0,0);

}

热点排行