C++ 在控制台mfc程序中检测escape按键
我正在VisualStudio11Beta中编写一个小程序,它是一个控制台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
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。我在寻找一个更简单的解决方案。谢谢你的回复,巴德罗斯。我在寻找一个更简单的解决方案。