询问者
PeekConsoleInput无法取得KEY_EVENT事件?

问题
-
唔。我使用这个的原因是想弄一个快捷键,按下escape键可以返回主菜单。(控制台应用程序)
因此,我开了两个线程,一个线程做程序操作,另一个线程检测键盘输入。
我试过了ReadConsoleInput ,这个函数用以下代码工作的很好。。但是程序操作的线程输入时有些时候是无效的。。我认为两个线程在争夺键盘的输入。
因此,我将该函数换为了PeekConsoleInput,意图解决这个问题,但我很惊讶的发现,这个函数在使用时,根本就没有捕获到KEY_EVENT事件。我下了断点,但一点用的没有。
请诸位帮助。
code:
INPUT_RECORD keyRec; DWORD state = 0, res=0; HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); while(1) { PeekConsoleInput(hIn, &keyRec, 1, &res); if(keyRec.EventType==KEY_EVENT&&keyRec.Event.KeyEvent.bKeyDown) { switch(keyRec.Event.KeyEvent.wVirtualKeyCode) { case VK_ESCAPE: thrmanage(); exit(0); break; } } }
全部回复
-
http://msdn.microsoft.com/en-us/library/ms684344(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms685035(v=VS.85).aspx
我看了一下MSDN的说明,它的意思是Read那个函数会把Console的缓冲的东西读出来删掉,这样的话你要是在两个线程中调用这个函数,那么可能另一个线程就收不到了。
建议你换一种方式,只在一个线程中调用Read,然后读到ESC时设置一个Event,然后在另一个线程处理这个Event.
0xBAADF00D -
http://msdn.microsoft.com/en-us/library/ms684344(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms685035(v=VS.85).aspx
我看了一下MSDN的说明,它的意思是Read那个函数会把Console的缓冲的东西读出来删掉,这样的话你要是在两个线程中调用这个函数,那么可能另一个线程就收不到了。
建议你换一种方式,只在一个线程中调用Read,然后读到ESC时设置一个Event,然后在另一个线程处理这个Event.
0xBAADF00D
不使用您提到的方式的原因是,我希望在“任意”时刻按下esc就可以回到主菜单,而这个方式的编程太过繁琐。