Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在控制台mfc程序中检测escape按键_C++_Visual Studio_Mfc_Console Application - Fatal编程技术网

C++ 在控制台mfc程序中检测escape按键

C++ 在控制台mfc程序中检测escape按键,c++,visual-studio,mfc,console-application,C++,Visual Studio,Mfc,Console Application,我正在VisualStudio11Beta中编写一个小程序,它是一个控制台mfc应用程序。我以前从未为这种环境编程过,我正试图找出如何检测控制台中的Escape键按下。我已经广泛地查看了在线资源,并尝试了许多不同的东西,但都没有弄明白 这就是我想看的,我是否能让它工作 printf("Press Escape to exit."); bool maxReached = true; while (maxReached) { if(WM_COMMAND == IDCANCEL) // Tri

我正在VisualStudio11Beta中编写一个小程序,它是一个控制台mfc应用程序。我以前从未为这种环境编程过,我正试图找出如何检测控制台中的Escape键按下。我已经广泛地查看了在线资源,并尝试了许多不同的东西,但都没有弄明白

这就是我想看的,我是否能让它工作

printf("Press Escape to exit.");
bool maxReached = true;
while (maxReached)
{
    if(WM_COMMAND == IDCANCEL) // Tried many different things here, like WM_KEYDOWN == VK_ESCAPE. no luck
    {
        maxReached = false;
    }
}
exit(-1);
任何帮助都将不胜感激

Kamal

您可以使用

if (getch() == 0x1B) // escape detected
{
  maxReached = false;
}
您可以使用

if (getch() == 0x1B) // escape detected
{
  maxReached = false;
}

您始终可以安装键盘挂钩并检查是否按下了ESC键。 以下是方法:

首先,安装挂钩

HHOOK hhkLowLevelKybd;    
HINSTANCE hInstance = GetModuleHandle(NULL);

// Install the low-level keyboard hook
hhkLowLevelKybd  = SetWindowsHookEx(WH_KEYBOARD_LL,
                LowLevelKeyboardProc,
                hInstance,
                NULL );
接下来,让LowLevelKeyboardProc执行例程以响应ESC键控:

_declspec(dllexport) LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
         PKBDLLHOOKSTRUCT p = ( PKBDLLHOOKSTRUCT ) lParam;
         switch (wParam)
         {
            case WM_KEYUP:
            case WM_SYSKEYUP:
                switch (p->vkCode)
                {
                   case 0x1B: //OR VK_ESCAPE
                       maxReached = false;
                       break;
                   default:
                       break;
                }
                break;
            default:
                break;
         }
     }
     return(CallNextHookEx( NULL, nCode, wParam, lParam ));
}

您始终可以安装键盘挂钩并检查是否按下了ESC键。 以下是方法:

首先,安装挂钩

HHOOK hhkLowLevelKybd;    
HINSTANCE hInstance = GetModuleHandle(NULL);

// Install the low-level keyboard hook
hhkLowLevelKybd  = SetWindowsHookEx(WH_KEYBOARD_LL,
                LowLevelKeyboardProc,
                hInstance,
                NULL );
接下来,让LowLevelKeyboardProc执行例程以响应ESC键控:

_declspec(dllexport) LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
         PKBDLLHOOKSTRUCT p = ( PKBDLLHOOKSTRUCT ) lParam;
         switch (wParam)
         {
            case WM_KEYUP:
            case WM_SYSKEYUP:
                switch (p->vkCode)
                {
                   case 0x1B: //OR VK_ESCAPE
                       maxReached = false;
                       break;
                   default:
                       break;
                }
                break;
            default:
                break;
         }
     }
     return(CallNextHookEx( NULL, nCode, wParam, lParam ));
}

谢谢Ed。您的解决方案经过简单的修改就可以工作。必须:包括和,而不是getch使用_getch@Kamal很高兴听你这么说。这是一个简单的方法,通常用于退出命令控制台应用程序。谢谢Ed。你的解决方案经过简单的修改就成功了。必须:包括和,而不是getch使用_getch@Kamal很高兴听到这个消息。这是一个简单的方法,通常用于退出命令控制台应用程序。谢谢你的回复,Baderous。我在寻找一个更简单的解决方案。谢谢你的回复,巴德罗斯。我在寻找一个更简单的解决方案。