VC中怎么用PostMessage传送一个按钮被按下的消息?怎样用PreTranslateMessage来屏蔽F1消息却不出现帮助框

这个问题是我最想知道的,所以拿出了100分!希望神牛们能够给个完美解答!先谢过了!
谢谢大家,整合了大家的智慧,我解决了问题,因为是大家的帮助,所以发起投票!非常感谢大家!我用PreTranslateMessage然后用::PostMessage(hWnd,WM_COMMAND,控件ID,NULL)和重载WN_OnHelpInfo函数!实现了我想要的功能!谢谢大家!

控件(包含按钮)消息、菜单按下消息发送WM_COMMAND消息就可以了。消息的wParam参数标识了菜单或控件ID。
PreTranslateMessage无法屏蔽F1消息不出现帮助框,F1是系统热键,要屏蔽只能用全局钩子。——不要追问我什么是全局钩子。

同时销毁2个对话框,在能正常销毁的对话框中向另一个对话框发送消息就可以了。追问

谢谢,大致理解了您的意思,但是可以详细么?HOOK可以达到功能。但是重载OnHelpInfo函数会更优秀哦!消息发送WM_COMMAND消息怎么发送呢?定义一个消息结构体,然后将ID号写入WPARAM中再用PostMessage将消息投递出去么?

追答

BOOL PostMessage( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
PostMessage(hWnd,WM_COMMAND,控件ID,NULL)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-04
1,先定义一个消息,如#define UM_BUTTON1DOWN WM_USER+1
2,在类中添加响应函数 afx_msg void OnClick();
3,增加消息映射 ON_MESSAGE(UM_BUTTON1DOWN,OnClick);
4,实现void CMainFrame::OnClick(){}
5,在需要发送消息的地方放入PostMessage(UM_BUTTON1DOWN);

BOOL 类名::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class

CString m_OfferPrice;
GetWindowText(m_OfferPrice);

if (pMsg->message==WM_CHAR)
{
if ((pMsg->wParam<7)||(pMsg->wParam>57)||(pMsg->wParam>8&&pMsg->wParam<45/*&&pMsg->wParam!=43*/)||( pMsg->wParam==45)||(pMsg->wParam==47)) //屏蔽所有的字符键
return TRUE;
}
return CEdit::PreTranslateMessage(pMsg);
}
F1的wParam是几你自己找下吧追问

你好,我是在基于对话框的程序,并且按钮的消息响应已经建立完全了,想要的是按另外的键也可以达到响应,就是两个键都会响应一个按钮,另外PreTranslateMessage的这种方法屏蔽不了按F1会出现帮助框哦,要用别的方法!我就是这样写的,结果只有F1会有问题!谢谢你的回答咯!VK_F1 到 VK_F12表示键盘上 “ F1 ”到“ F12 ”键。

第2个回答  2011-06-04
是MFC的基于对话框的程序吗?
如果是的话:
修改下面的语句,这样F1就不会弹出帮助。
这个在另一个CPP文件里。。
ON_COMMAND(ID_HELP, CWinApp::OnHelp)

重载下PreTranslateMessage。 写个例子给你
下面的是防止ESC键销毁并推出窗口。
PreTranslateMessage(MSG *pMsg) // 为了防止按ESC键退出窗口
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
return TRUE;
return CDialog::PreTranslateMessage(pMsg);
}追问

谢谢!但是第一个问题!就是怎么样才能投递一个已经建立好的按键消息到消息队列?就是按键的ID,消息响应函数都是已知的!怎么样才能投递到消息队列呢?BroadcastSystemMessage ,PostMessage ,PostThreadMessage,SendMessageTimeout ,SendNotifyMessage ,SendMessageCallback应该用哪个才能达到呢?销毁对话框应该用什么函数?

追答

那个,你问的问题是如何传送一个按钮被按下是吧?传给谁?传给自己的程序,还是传给其他程序?
其实说起来,MFC还真麻烦。说起来,我也好久没用MFC了。。

追问

就是已经建立了一个按键的消息响应,要想在程序中~不等按键被按下~就用程序控制的方法投递到消息队列使其响应。投递给自己的程序!谢谢你!

追答

给你例子给你。。
::SendMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDC_BUTTON1,BN_CLICKED),0);

第3个回答  2011-06-04
1 用PostMessage传送一个被按钮按下的消息:
#define WM_MY_MESSAGE WM_USER + 11  //自定义消息
afx_msg void OnMyMsg();           //自定义消息响应函数名  
ON_MESSAGE(WM_MY_MESSAGE, OnMyMsg) //写入消息映射

void CMyDlg::OnMyMsg()           //为该函数写入内容
{
MessageBox("Begin post message!");
}

void CMyDlg::OnButton1()
{
PostMessage(WM_MY_MESSAGE);//在按钮函数中调用这个自定义的消息
}

2、用PreTranslateMessage来屏蔽F1消息

重载OnHelpInfo函数
BOOL CMyDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
// TODO: Add your message handler code here and/or call default
return false;
//return CDialog::OnHelpInfo(pHelpInfo);
}

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN){
switch(pMsg->wParam)
{
case VK_F1:
HELPINFO * pHelp = NULL;
OnHelpInfo(pHelp);//调用这个重载的函数
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}