关于获得键盘状态的有关问题,大家来帮忙看看
关于获得键盘状态的问题,大家来帮忙看看
我的程序里有一段这样的代码
获得键盘状态
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan=0;
ToAscii(wParam,scan,ks,&w,0);
ch =char(w);
我用 POSTMESSAGE来检测,可是发出来的信息,我键盘输入的是A,可是显示的是1
HWND now=GetFocus();
::PostMessage(now,WM_KEYDOWN,VK_BACK,NULL);
我又用MESSAGEBOX来检测,第一个字母显示的是正确的,显示的是我打出来的字符,可是后面跟着一堆类似中文的乱码,为什么哦,如何解决这个问题?
我想让他我打 A,他就显示 A
::AfxMessageBox(&ch,NULL,NULL);
------解决方案--------------------
在GetKeyboardState(ks);之前加一局
memset(ks, 0, sizeof(ks));
------解决方案--------------------
大概了解楼主想干什么了,不过这样似乎比较麻烦啊,首先你只能显示出可显示字符,另外因为是VK_KEY,没有A和a的区别哦,
顺便改一下你的code;
AfxMessageBox(&ch,NULL,NULL); 我不知道你ch哪里定义的,应该是个char[]吧。在ch=char(w)之前,每次最好先清0一下。
------解决方案--------------------
ch =char(w); // 看来ch是char型的。否则编译不过。:)
::AfxMessageBox(&ch,NULL,NULL); //ch后面没有\0,所以有乱码。把char当作char[]用,汗!
--------------------
char buf[4] = {0};
buf[0] = ch;
::AfxMessageBox(buf,NULL,NULL);
------解决方案--------------------
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg-> message == WM_KEYDOWN)
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w,ch;
UINT scan=0;
ToAscii(pMsg-> wParam,scan,ks,&w,0);
ch =char(w);
CString strTest;
strTest.Format( "%c ",ch);
TRACE( "\r\nInput=%s ",strTest);
}
return CDialog::PreTranslateMessage(pMsg);
}
上面测试代码,输入wust后运行结果:
Input=w
Input=u
Input=s
Input=t
正常。
我的程序里有一段这样的代码
获得键盘状态
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan=0;
ToAscii(wParam,scan,ks,&w,0);
ch =char(w);
我用 POSTMESSAGE来检测,可是发出来的信息,我键盘输入的是A,可是显示的是1
HWND now=GetFocus();
::PostMessage(now,WM_KEYDOWN,VK_BACK,NULL);
我又用MESSAGEBOX来检测,第一个字母显示的是正确的,显示的是我打出来的字符,可是后面跟着一堆类似中文的乱码,为什么哦,如何解决这个问题?
我想让他我打 A,他就显示 A
::AfxMessageBox(&ch,NULL,NULL);
------解决方案--------------------
在GetKeyboardState(ks);之前加一局
memset(ks, 0, sizeof(ks));
------解决方案--------------------
大概了解楼主想干什么了,不过这样似乎比较麻烦啊,首先你只能显示出可显示字符,另外因为是VK_KEY,没有A和a的区别哦,
顺便改一下你的code;
AfxMessageBox(&ch,NULL,NULL); 我不知道你ch哪里定义的,应该是个char[]吧。在ch=char(w)之前,每次最好先清0一下。
------解决方案--------------------
ch =char(w); // 看来ch是char型的。否则编译不过。:)
::AfxMessageBox(&ch,NULL,NULL); //ch后面没有\0,所以有乱码。把char当作char[]用,汗!
--------------------
char buf[4] = {0};
buf[0] = ch;
::AfxMessageBox(buf,NULL,NULL);
------解决方案--------------------
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg-> message == WM_KEYDOWN)
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w,ch;
UINT scan=0;
ToAscii(pMsg-> wParam,scan,ks,&w,0);
ch =char(w);
CString strTest;
strTest.Format( "%c ",ch);
TRACE( "\r\nInput=%s ",strTest);
}
return CDialog::PreTranslateMessage(pMsg);
}
上面测试代码,输入wust后运行结果:
Input=w
Input=u
Input=s
Input=t
正常。