VC中怎么用PostMessage传送一个按钮被按下的消息?怎样用PreTranslateMessage来屏蔽F1消息却不出现帮助框
这个问题是我最想知道的,所以拿出了100分!希望神牛们能够给个完美解答!先谢过了!谢谢大家,整合了大家的智慧,我解决了问题,因为是大家的帮助,所以发起投票!非常感谢大家!...
这个问题是我最想知道的,所以拿出了100分!希望神牛们能够给个完美解答!先谢过了!
谢谢大家,整合了大家的智慧,我解决了问题,因为是大家的帮助,所以发起投票!非常感谢大家!我用PreTranslateMessage然后用::PostMessage(hWnd,WM_COMMAND,控件ID,NULL)和重载WN_OnHelpInfo函数!实现了我想要的功能!谢谢大家! 展开
谢谢大家,整合了大家的智慧,我解决了问题,因为是大家的帮助,所以发起投票!非常感谢大家!我用PreTranslateMessage然后用::PostMessage(hWnd,WM_COMMAND,控件ID,NULL)和重载WN_OnHelpInfo函数!实现了我想要的功能!谢谢大家! 展开
4个回答
展开全部
控件(包含按钮)消息、菜单按下消息发送WM_COMMAND消息就可以了。消息的wParam参数标识了菜单或控件ID。
PreTranslateMessage无法屏蔽F1消息不出现帮助框,F1是系统热键,要屏蔽只能用全局钩子。——不要追问我什么是全局钩子。
同时销毁2个对话框,在能正常销毁的对话框中向另一个对话框发送消息就可以了。
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,先定义一个消息,如#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是几你自己找下吧
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 ”键。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是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);
}
如果是的话:
修改下面的语句,这样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了。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
}
#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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询