写了一个简单程序,工具栏里放3个按钮,按钮的onclick里就弹一个messagebox来说明哪一个按钮被按到了。用远程hook 可以获得该程序里工具栏按钮点击后的wm_command消息。然后自己用sendmessage发按钮的wm_command后也能hook到。可是界面却没有弹出messagebox!
疑问:sendmessage按钮的wm_command不会触发onclick事件吗?他们之间的关系是怎样的?mousedown,mouseup和他们的关系又如何?谢谢
疑问:sendmessage按钮的wm_command不会触发onclick事件吗?他们之间的关系是怎样的?mousedown,mouseup和他们的关系又如何?谢谢
{
MessageBox("button1 clicked");
}void CBtnClickDlg::OnButton2()
{
GetDlgItem(IDC_BUTTON1)->SendMessage(WM_LBUTTONDOWN ,0,0);
GetDlgItem(IDC_BUTTON1)->SendMessage(WM_LBUTTONUP ,0,0);
}
下面是钩子里的程序: if (pMsg->message == WM_COMMAND)
{
if (pMsg->lParam == (long)ghwndToolBar)
{
itoa(pMsg->wParam,temp,20);
SendMessage(ghwndTEdit,WM_SETTEXT,NULL,(LPARAM)temp);
nBbb+=100;
}
}程序中的测试过程是按照lingxiao66说的。sendmessage了WM_LBUTTONDOWN和WM_LBUTTONUP后,正确执行了目标按钮click函数。同时收到2次wm_command消息,也就是说,被按下的按钮和sendmessage的目标按钮的wm_command消息都产生了。to xsgluozi:
想知道这个消息响应函数(onclick)和哪个消息绑定的。to tr0j4n:
程序里判断过,的确是没有问题to heksn:
是的,可以肯定。我把hook里的代码附在上面。麻烦大家再帮我想想,这个onclick到底是和哪个消息绑定了的,谢谢!
======================
你弄错了一个问题,WM_COMMAND消息并不是发向工具栏的,而是但用户点击按钮时,由工具栏发送出的消息,也就是说,你点击按钮,产生WM_LBUTTONDOWN之类的消息,然后工具栏向父窗口发送WM_COMMAND消息,而父窗口对这个消息做出反应。你向工具栏发WM_COMMAND有什么用呢?
SendMessage(ghwndMainWin,WM_COMMAND,MAKEWPARAM(i,BN_CLICKED),(long)ghwndToolBar);
我还做了个实验就是把我通过点击按钮后hook得到的wm_command的msg,提取参数再次用sendmessage发出,这样理论上会出现一个死循环,测试结果是虽然没死,但是他一下子循环了35次左右。但是messagebox还是只有1个弹出。LRESULT CALLBACK HookProc2(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT *pMsg = (CWPSTRUCT *)lParam;
if (pMsg->message == WM_COMMAND)
{
if (pMsg->lParam == (long)ghwndToolBar)
{
SendMessage(ghwndMainWin,WM_COMMAND,pMsg->wParam,pMsg->lParam);
nBbb+=100;
}
}
}