【问题标题】:Detect function keys in c++ console.在 C++ 控制台中检测功能键。
【发布时间】:2015-09-30 18:53:49
【问题描述】:

我想检测功能键,例如 f1 以保存 f2 以使用 c++ 在控制台中刷新,这样我就可以添加更多功能。

【问题讨论】:

  • 这非常依赖于操作系统,但通常像功能键这样的特殊键使用多个字符发送。此外,不能确定控制台窗口是否捕获了某些按键,其他程序可能会在控制台程序有机会接收它们之前拦截它们(例如,在某些键盘上的多媒体键上)。
  • C++ 语言本身对功能键一无所知。 C++ 程序可以(并且确实)在没有键盘或屏幕的计算机上运行。因此,像这样的功能是由操作系统提供的,它通常提供一些特殊的(非标准)C 头文件,您可以在 C++ 中使用。

标签: c++ function key


【解决方案1】:

检查这个例子:

#include <conio.h>

using namespace std;

int main()
{
    cout << "Press any key! CTRL-D to end" << endl;
    while(1)
    {
        unsigned char x = _getch();
        if (0 == x)
        {
            printf("Function key!\n");
            x = _getch();
        }
        printf("key = %02x\n", x);
        if (x == 4) break;
    }
    return 0;
}

当您按下功能键时,您会得到一个零,后跟另一个代码。 使用该代码确定您获得了哪个 F 键。

【讨论】:

  • 对于 OP 应该注意的是,这仅适用于具有非标准 &lt;conio.h&gt; 标头和非标准函数 _getch 的系统,就我现在而言只有 Windows .
【解决方案2】:

如果你在 windows 控制台,你可以使用ReadConsoleInput() 来检测和处理键盘事件。

所有键都映射为虚拟键。 F 功能键映射为VK_F1VK_F12

下面是控制台键盘处理的实现。

#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;


void save();
void refresh();


int main(){
    DWORD        mode;          /* Preserved console mode */
    INPUT_RECORD event;         /* Input event */
    BOOL         QUIT = FALSE;  /* Program termination flag */

    /* Get the console input handle */
    HANDLE hstdin = GetStdHandle( STD_INPUT_HANDLE );

    /* Preserve the original console mode */
    GetConsoleMode( hstdin, &mode );

    /* Set to no line-buffering, no echo, no special-key-processing */
    SetConsoleMode( hstdin, 0 );


    while (!QUIT){           


        if (WaitForSingleObject( hstdin, 0 ) == WAIT_OBJECT_0){  /* if kbhit */

            DWORD count;  /* ignored */

            /* Get the input event */
            ReadConsoleInput( hstdin, &event, 1, &count );
            cout<<"Key Code   = "<<event.Event.KeyEvent.wVirtualKeyCode <<" \n";

        }

            /* Only respond to key release events */
            if ((event.EventType == KEY_EVENT)
            &&  !event.Event.KeyEvent.bKeyDown){        


                    switch (event.Event.KeyEvent.wVirtualKeyCode){

                        case VK_ESCAPE:
                           QUIT = TRUE;
                         break;


                        case VK_F1:
                                  save();
                         break;


                       case VK_F2:
                                  refresh();
                         break;


                       case VK_F5:

                         break;


                       case VK_F8:

                         break;


                    }//switch

                   event.Event.KeyEvent.wVirtualKeyCode=-1;             

        }
    }

 return 0; 
}



void save(){

}


void refresh(){

}

更多按键映射:https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

【讨论】:

    【解决方案3】:

    F1-F12 与this solution 跨平台工作。

    在 Windows 上,F11 在命令提示符下切换全屏模式,因此无法检测为按键。

    【讨论】:

      【解决方案4】:

      试试这个:

      #include <iostream>
      #include <system.h>
      int main(){
      while(true){
      Sleep(10);
      if(GetKeyState('R') & 0x8000){
      std::cout << "R Pressed";
      }
      }
      return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 2012-08-28
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多