使用如下代码保存输入的字符//接收到消息的回调函数
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);
}这样做每次输入一次字符都会朗读两次,而且只能在当前窗口被激活的时候才可以用,怎么做才能做到只朗读一次,而且可以捕获任何的输入
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);
}这样做每次输入一次字符都会朗读两次,而且只能在当前窗口被激活的时候才可以用,怎么做才能做到只朗读一次,而且可以捕获任何的输入
这样也是不行的,依然是读了两次,有时候还会读四次的,真是奇怪了~~
当前串口不被激活就是想获得其他窗口输入的字符,这应该是可以实现的吧,不是很多程序都是隐藏起来然后可以捕获输入
你的SCharMsg是个什么咚咚,SCharMsg *g_CurMsg = new SCharMsg();会不会再次产生WM_CHAR?
,而且可以捕获任何的输入
------
做一个全局的键盘钩子来捕获所有程序的键盘输入
{
BOOL m_blsDbChar;//是否是一个双字节的字
WPARAM m_WParam1;
LPARAM m_LParam1;
int m_nLastTime1;
WPARAM m_WParam2;
LPARAM m_LParam2;
int m_nLastTime2;
};
这样一个结构体会产生另一个WM_CHAR???
我也是做了全局的键盘钩子,但是SetWindowsHookEx的时候不是要提供窗口句柄吗?
全局钩子是怎么个用法呢?
2.捕获任何的输入,需要做成全局钩子就可以了