使用如下代码保存输入的字符//接收到消息的回调函数
LRESULT WINAPI InputMessageProc(int nCode, WPARAM wparam, LPARAM lparam)
{
if(nCode >= 0)
{
MSG* pMsg = (MSG*)lparam;
if(pMsg == NULL)
return CallNextHookEx(g_hHook, nCode, wparam, lparam);
//只截获系统的WM_CHAR消息
if(pMsg->message == WM_CHAR)
{
if(g_lsDbCharSecond)
{
//将此消息放入当前消息结构
g_CurMsg.m_WParam2 = pMsg->wParam;
g_CurMsg.m_LParam2 = pMsg->lParam;
g_CurMsg.m_nLastTime2 = pMsg->time;
//将截获的消息发送给应用程序
SendMessage(g_hDspWnd, WM_CHAR,(WPARAM)g_CurMsg.m_WParam1,(LPARAM)g_CurMsg.m_WParam2);
g_lsDbCharSecond = FALSE;
}
else
{
//判断是否是双字节字
if((int)pMsg->wParam > 127)
{
g_CurMsg.m_blsDbChar = TRUE;
g_CurMsg.m_WParam1 = pMsg->wParam;
g_CurMsg.m_LParam1 = pMsg->lParam;
g_CurMsg.m_nLastTime1 = pMsg->time;
//暂存该消息,等下一个消息,即双字节的后一个字节
g_lsDbCharSecond = TRUE;
}
else
{
g_CurMsg.m_blsDbChar = FALSE;
g_CurMsg.m_WParam1 = pMsg->wParam;
g_CurMsg.m_LParam1 = pMsg->lParam;
g_CurMsg.m_nLastTime1 = pMsg->time;
//将截获的输入发送给应用程序
SendMessage(g_hDspWnd, WM_CHAR,(WPARAM)g_CurMsg.m_WParam1,(LPARAM)0);
}
}
}
}
//消息要投递回系统的消息流中
return CallNextHookEx(g_hHook, nCode, wparam, lparam);
}然后在一个MFC程序中使用如下捕获输入并朗读LRESULT CReadHelp::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
// TODO: Add your specialized code here and/or call the base class
if(WM_CHAR == message)
{
isRead = TRUE;
SCharMsg *g_CurMsg = new SCharMsg();
if((LPARAM)0 == lParam)
{
g_CurMsg->m_blsDbChar = FALSE;
g_CurMsg->m_WParam1 = wParam;
}
else
{
g_CurMsg->m_blsDbChar = TRUE;
g_CurMsg->m_WParam1 = wParam;
g_CurMsg->m_WParam2 = (WPARAM)lParam;
}
if(isRead)
Sound(g_CurMsg);
message = 0;
isRead = FALSE;
}
return CDialog::WindowProc(message, wParam, lParam);
}这样做每次输入一次字符都会朗读两次,而且只能在当前窗口被激活的时候才可以用,怎么做才能做到只朗读一次,而且可以捕获任何的输入

解决方案 »

  1.   

    if(pMsg->message == WM_CHAR) and ((lParam & 0x8000000) == 0) 不知道行不行如果当前窗口不被激活如何输入字符?
      

  2.   

    to:gust2012 
    这样也是不行的,依然是读了两次,有时候还会读四次的,真是奇怪了~~
    当前串口不被激活就是想获得其他窗口输入的字符,这应该是可以实现的吧,不是很多程序都是隐藏起来然后可以捕获输入
      

  3.   

    这样做每次输入一次字符都会朗读两次,
    你的SCharMsg是个什么咚咚,SCharMsg *g_CurMsg = new SCharMsg();会不会再次产生WM_CHAR?
    ,而且可以捕获任何的输入
    ------
    做一个全局的键盘钩子来捕获所有程序的键盘输入
      

  4.   

    struct SCharMsg
    {
    BOOL m_blsDbChar;//是否是一个双字节的字
    WPARAM m_WParam1;
    LPARAM m_LParam1;
    int m_nLastTime1;
    WPARAM m_WParam2;
    LPARAM m_LParam2;
    int m_nLastTime2;
    };
    这样一个结构体会产生另一个WM_CHAR???
    我也是做了全局的键盘钩子,但是SetWindowsHookEx的时候不是要提供窗口句柄吗?
    全局钩子是怎么个用法呢?
      

  5.   

    1.做两次是因为键盘的按下与释放你都会相应,所以你只要在键盘按下的时候相应就行了,貌似和if(pMsg->message == WM_CHAR) and ((lParam & 0x8000000) == 0) 差不多,具体你查一下
    2.捕获任何的输入,需要做成全局钩子就可以了
      

  6.   

    if(pMsg->message == WM_CHAR&&(lParam & 0x80000000)==0)表示键盘被按下
      

  7.   

    全局hook怎么用你看一下这个视频吧http://www.enet.com.cn/eschool/zhuanti/vc++/102/
      

  8.   

    if(pMsg->message == WM_CHAR&&(lParam & 0x80000000)==0)还是读了两次,而且在文本框中输入中文的话好像读出来字都不一样了~~