hur.cn - 华软网

 热门搜索

对话框的编辑框为何收不到我的WM_KEYDOWN 消息

  作者:未知    来源:网络    更新时间:2011/8/12
目前已有一个对话框,其中的一个EDIT 有焦点,光标在闪,等待输入,用键盘输入当然没问题。问题是  主框架中有一个事情,事件来后,想发送keydown 消息给当前活动框口用作输入。

当主框架中有事件来时:  ::PostMessage(::GetForegroundWindow(),WM_KEYDOWN, 'A','A' );   

在对话框中 BOOL CNameEidtDlg::PreTranslateMessage(MSG* pMsg)
{

return CDialog::PreTranslateMessage(pMsg);

}  可以跟踪得到事件发过来的消息,但编辑框没反应,为何 PreTranslateMessage ()没有将WM_KEYDOWN 转化成WM_CHAR 传给EDIT控制呢?    如何事件直接用::PostMessage(::GetForegroundWindow(),WM_CHAR, 'A','A' );发送消息 是可以,但我这里情况太多,这里不能这么做。
---华软 网友回答---
用SPY++跟踪看了。
---华软网友回复---
EDIT应该是接到WM_CHAR消息才响应的吧,估计是EDIT控件没有响应KEYDOWN消息
---华软网友回复---
//使用OnKeyDown之后还不能捕捉到键盘消息,重载PreTranslateMessage使OnKeyDown有效
BOOL CLineMap::PreTranslateMessage(MSG* pMsg)
{
SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);//重载后添加语句
return CFormView::PreTranslateMessage(pMsg);
}
---华软网友回复---
C++">
BOOL CAsuka_EEPROMDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
}

if (pMsg->message == WM_CHAR)
{
SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
}
return CDialog::PreTranslateMessage(pMsg);
}

楼主在PreTranslateMessage里面转发下WM_CHAR,OnChar()就可以响应了
---华软网友回复---
对不起楼主,我看错你的意思了。当我没说啊,囧
---华软网友回复---
引用 2 楼 mudunke775 的回复:
EDIT应该是接到WM_CHAR消息才响应的吧,估计是EDIT控件没有响应KEYDOWN消息

为何没收到呢,键盘上敲进去它就行呢,自己发消息过去又不行呢?


增加 “SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam); 是可以,但左移键的现像是EDIT里的字符全部选中,有点像SHIFT+左移 效果,光标不是单个单个字符移动的,奇怪.

---华软网友回复---
PostMessage(::GetForegroundWindow(),WM_KEYDOWN, 'A','A' );  时,最后一个参数Lparam ,这个是不是有问题,它有什么意义?对比了一下键盘和我发送的消息,就这个参数不一样。
---华软网友回复---
换个想法

str1 = getwindowtext()
str1 += "1";
setwindowstext()
---华软网友回复---
::PostMessage(::GetForegroundWindow(),WM_KEYDOWN, 'A','A' );  
-----------------------------------------
你确定这个WM_KEYDOWN消息发送到了CNameEidtDlg对话框了?
---华软网友回复---
问题是 主框架中有一个事情,事件来后,想发送keydown 消息给当前活动框口用作输入。


楼主思路错了,应该是主框架有消息,然后设置焦点就行了。


为Edit Control添加变量m_edit;
主框架有消息m_edit->setFocus();//那么Edit Control自然就会出现光标,用作输入了。
---华软网友回复---
1、如何是想然后Edit Control 添加keydonw消息,那么需要重写CEdit
添加类CMyEdit继承CEdit,然后添加消息WM_KEYDOWN,就可以处理wm_keydown消息了



2、如果焦点在Edit Control 但又想主窗口响应WM_KEYDOWN方法如下:
   a、添加类CMyEdit继承CEdit,然后添加消息WM_KEYDOWN,就可以处理wm_keydown消息了
    b、CMyEdit 添加 class (主窗口类,也是父窗口)
    c、在MyEdit.cpp 添加主窗口头文件
    d、在Edit Control 的WM_KEYDOWN消息函数中去调用父窗口的OnKeydown()消息
---华软网友回复---
//使用OnKeyDown之后还不能捕捉到键盘消息,重载PreTranslateMessage使OnKeyDown有效
BOOL CLineMap::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_KEYDOWN )
{
::PostMessage( GetDlgItem(IDC_XXXX)->m_hWnd, WM_KEYDOWN, pMsg->wParam, pMsg->lParam  );

}return CFormView::PreTranslateMessage(pMsg);
}

好像父窗口的消息不能流向子窗口吧。
---华软网友回复---
引用 8 楼 mudunke775 的回复:
换个想法

str1 = getwindowtext()
str1 += "1";
setwindowstext()

的确,至少在 CNameEidtDlg中的pretranslatemessage 断点中可以看得到
---华软网友回复---
引用 9 楼 visualeleven 的回复:
::PostMessage(::GetForegroundWindow(),WM_KEYDOWN, 'A','A' );  
-----------------------------------------
你确定这个WM_KEYDOWN消息发送到了CNameEidtDlg对话框了?

的确,至少在 CNameEidtDlg中的pretranslatemessage 断点中可以看得到      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。