c - 了解用户何时按下向上/向下箭头

标签 c windows

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

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() 使用虚拟键码,但无法完成。

关于如何实现这样的事情的任何想法。

提前致谢。

最佳答案

注意虚拟键码。像这样:

    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...
                }

关于c - 了解用户何时按下向上/向下箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10250249/

相关文章:

c - For 循环程序返回 [value]i 而不是 [value]

c++ - C 和 C++ 编译器如何实现 float 的相等性判定?

c - 如何列出 C 目录中目录中的文件?

c - 我怎样才能得到 Markdown 来正确格式化这段代码?

c - 在 c 中,如何使 1200/500 = 3

windows - Matlab加载函数超时

windows - CMake 内部错误 (TEST_BIG_ENDIAN)

python - 将目录永久添加到 PYTHONPATH?

c - 使用 zend 读取 php.ini for PHP 扩展(不是 PHP 语言)

windows - 由于 Beyond Trust privman64.dll,VirtualBox V5.1.24 r1170 无法运行 Windows 7