导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

新手,,没有分,紧急求助,盼好心人帮助,CE软键盘的问题

youyou6115 2009-08-31 04:57:30
我用evc4.0写了一个软键盘程序,是基于对话框的,单击按钮模拟按键消息keybd_event,在模拟器上调试一切正常,可拿到2440板子上一试问题就出现了,我的程序A需要输入,可点击软键盘,模拟字符输出a-z,正常应该是两个keydown和keyup,可程序A只接收到一个消息,所以编辑框里没有接收到字符。还有一个问题,模拟数字键,对应的键值是VK_NUMPAD0- VK_NUMPAD9,可在程序A里收到的键值是97-107。但其他的功能键是正常的,比如退格键,回车键,CapsLK等的,真是很奇怪,左思右想就是不知道问题在哪里,下面我把关键代码贴出来,大家帮我看看问题在哪里,多谢了。
BOOL CNumKeyboardDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
//如果当前激活窗口不是本程序的窗口
if(wnd != this->m_hWnd)
{
//激活窗口发生了改变
if(m_hFocus != wnd)
{
if(IsWindow(m_hFocus))
{
//释放本进程和gFocus线程的联系
// AttachThreadInput(
// GetWindowThreadProcessId(m_hWnd,NULL),
// GetWindowThreadProcessId(m_hFocus,NULL),
// FALSE);
m_hFocus = ::GetFocus();
}

m_hFocus = wnd;
//使本进程和激活窗口的进程联系起来,接收本进程的按键消息
// AttachThreadInput(
// GetWindowThreadProcessId(m_hWnd,NULL),
// GetWindowThreadProcessId(m_hFocus,NULL),
// TRUE);
}
}
}

return CDialog::PreTranslateMessage(pMsg);
}

void CNumKeyboardDlg::ReleaseFocus()
{
//释放焦点
if(IsWindow(m_hFocus))
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd == m_hFocus)
{
return;
}
}
//设置保存的焦点窗口处于激活状态
::SetForegroundWindow(m_hFocus);
::SetFocus(m_hFocus);
}

}

void CKeyboardDlg::SendKeyMessage(int vk_code)
{
ReleaseFocus();
if(vk_code >= 'A' && vk_code <= 'Z')
{
/* SHORT nTmp = GetAsyncKeyState(VK_CAPITAL);
if(!(GetKeyState(VK_CAPITAL) && 0xFF))
if(nTmp < 0)
{
keybd_event(VK_CAPITAL,0,0,0);
keybd_event(VK_CAPITAL,0,KEYEVENTF_KEYUP,0);
}
*/
if(m_bPressKeyShift)
keybd_event(VK_SHIFT, 0, 0, 0);

if(!m_bCapsLK)
vk_code += 32;//lowercase
keybd_event(vk_code, 0, KEYEVENTF_SILENT, 0);
keybd_event(vk_code, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);

if(m_bPressKeyShift)
{
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
m_bPressKeyShift = FALSE;
m_KeyShift.ChangeColor(WHITE_COLOR);
GetDlgItem(IDC_KEY_SHIFT)->SetWindowText(_T("SHIFT"));
}

}
else if(vk_code == VK_LPARENTHESIS || vk_code == VK_RPARENTHESIS)
{
keybd_event(VK_SHIFT , 0, 0, 0);
keybd_event(vk_code, 0, 0, 0);
keybd_event(vk_code, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT , 0, KEYEVENTF_KEYUP, 0);
}
else if(vk_code == VK_SHIFT)
{
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

m_KeyShift.ChangeColor(PALEGREEN_COLOR);
m_bPressKeyShift = TRUE;
//m_KeyShift.
}
else if(vk_code == VK_CAPITAL)
{
keybd_event(vk_code, 0, 0, 0);
SHORT ntmp = GetKeyState(VK_CAPITAL); //只能得到VK_CAPITAL 的触发状态,0为大写状态,1为小写状态
keybd_event(vk_code, 0, KEYEVENTF_KEYUP, 0);
char text;
CString strText;
if(ntmp == 0)
{
m_bCapsLK = TRUE;
for(int id = IDC_KEY_A; id <= IDC_KEY_Z; id++)
{
text = 'A' + (id - IDC_KEY_A);
strText = text;
GetDlgItem(id)->SetWindowText(strText);
}
}
else if(ntmp == 1)
{
m_bCapsLK = FALSE;
for(int id = IDC_KEY_A; id <= IDC_KEY_Z; id++)
{
text = 'A' + (id - IDC_KEY_A) + 32;
strText = text;
GetDlgItem(id)->SetWindowText(strText);
}
}

}
else//VK_BACK,,VK_COMMA,VK_PERIOD,VK_ESCAPE,VK_SEMICOLON,VK_SLASH,VK_SPACE,VK_RETURN
{
keybd_event(vk_code, 0, 0, 0);
keybd_event(vk_code, 0, KEYEVENTF_KEYUP, 0);
}
ReleaseFocus();
}
...全文
25 点赞 收藏 回复
写回复
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

还没有回复,快来抢沙发~

发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……