【问题标题】:Understanding when user pressed Up/Down Arrow了解用户何时按下向上/向下箭头
【发布时间】:2012-04-20 16:46:17
【问题描述】:

此代码在按下回车按钮后打印出用户键入的内容。

main()
{

HANDLE         stdinInput = 0;
DWORD          numEvents = 0;
DWORD          numEventsRead = 0;
DWORD          numReceivedRecords = 0;
DWORD          fdwSaveOldMode;
DWORD          fdwMode;


char   dataBuffer[100];
int    bufferLen = 0;


stdinInput = GetStdHandle(STD_INPUT_HANDLE);

if (stdinInput == INVALID_HANDLE_VALUE) 
        perror("GetStdHandle");

if (! GetConsoleMode(stdinInput, &fdwSaveOldMode) ) 
        perror("GetConsoleMode");

fdwMode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT;
if (! SetConsoleMode(stdinInput, fdwMode) ) 
        perror("SetConsoleMode"); 


for(; ; )
{


   GetNumberOfConsoleInputEvents(stdinInput, &numEvents);

   if (numEvents != 0) {

       INPUT_RECORD eventBuffer;

      ReadConsoleInputA(stdinInput, &eventBuffer, 1, &numEventsRead);


        if (eventBuffer.EventType == KEY_EVENT) {

            if(eventBuffer.Event.KeyEvent.bKeyDown)
            {
                if(eventBuffer.Event.KeyEvent.uChar.UnicodeChar != 0)
                {
                    printf("%c",eventBuffer.Event.KeyEvent.uChar.UnicodeChar);
                    dataBuffer[bufferLen++] = eventBuffer.Event.KeyEvent.uChar.UnicodeChar;
                    dataBuffer[bufferLen]  = '\0';            

                    if ( dataBuffer[bufferLen] == 99 || eventBuffer.Event.KeyEvent.uChar.UnicodeChar == '\r' ) {
                    printf("User Wrote: %s\n",dataBuffer);

                    memset(dataBuffer,0,sizeof(dataBuffer));
                    bufferLen = 0;
                    }
                }


            }
        }

    }
}

}

现在我想让它检测用户何时按下向上/向下箭头并打印出“按下向上/向下箭头”而无需按 Enter。

想过用 GetKeyState() 使用虚拟键码,但无法完成。

关于如何实现这样的目标的任何想法。

提前致谢。

【问题讨论】:

    标签: c windows


    【解决方案1】:

    注意虚拟键码。像这样:

        if (eventBuffer.EventType == KEY_EVENT) {
            if(eventBuffer.Event.KeyEvent.bKeyDown) {
                switch (eventBuffer.Event.KeyEvent.wVirtualKeyCode) {
                    case VK_DOWN: printf("Down arrow pressed\n"); break;
                    case VK_UP:   printf("Up arrow pressed\n"); break;
                    default: {
                        // Rest of your code...
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2017-10-21
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多