如何在C ++中读取键盘输入

时间:2016-01-15 11:49:06

标签: c++ visual-studio-2015 directx-11

这是我尝试移动使用DirectX 11 / C ++绘制的简单三角形:

int DrawAndMovePlayer(Renderer renderer)
{
    Triangle triangle1(renderer);
    float p1, p2, p3, p4, p5, p6;
    float x, y;
    x = 0.0f;
    y = 0.0f;

    if (GetAsyncKeyState(0x58))
    {
        x = 1.0f;
    }

    //top
    p1 = x + 0.0f;
    p2 = y + 0.05f;
    //Bottom Right
    p3 = x + 0.05f;
    p4 = y - 0.05f;
    //Top
    p5 = x - 0.05f;
    p6 = y - 0.05f;
    //Triangle triangle2(renderer);
    triangle1.draw(renderer,p1,p2,p3,p4,p5,p6);
    //triangle2.draw(renderer, -0.5f);
    return 0;
}

我尝试了getch()函数和GetAsyncKeyState()函数,但是,三角形从不改变其位置。三角形围绕中心点(xy)绘制。

4 个答案:

答案 0 :(得分:0)

我发现GetAsyncKeyState的{​​{3}}有点令人困惑。我认为official documentation可以更好地解释GetAsyncKeyState的工作原理:

  

GetAsyncKeyState返回一个16位有符号值。当键的当前实时状态指示它被按下时,高位被设置。

     

当键从释放状态转换为按下状态时(如第一次按下该键时),设置低位。虽然MSDN文档表明这不可靠。

     

应假设所有其他位的值为“未定义”,您应该丢弃它们。我不建议假设它们是0,因为它们可能不是未来的版本。

     

那说......你不应该寻找绝对的回报值。 IE:检查-32767是错误的。相反,你应该掩盖你感兴趣的位:

if(GetAsyncKeyState(x) & 0x8000)
{
    // high bit is set.  Key is currently held down.
}
if(GetAsyncKeyState(x) & 0x0001)
{
    // low bit is set.  Key just transitioned from released to pressed.
}

因此,此建议与评论中@MikeCAT给出的建议相匹配:您应该使用GetAsyncKeyState(0x58) & 0x8000来查看 X 键是否被按下。

答案 1 :(得分:0)

你走了!我花了一些时间在Microsoft Visual Studio 2015上看到这个,但这里是: MSG message; message.message = WM_NULL; while (message.message != WM_QUIT) { while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { //make a class file for this or somthing so when it's HUGE it won't be obtrusive... i mean REALLY. if (message.message == WM_KEYDOWN) { if (GetAsyncKeyState(0x51) == 0x0001); { OutputDebugString("key pressed \n"); pressed = true; } } if (message.message == WM_KEYUP) { if (GetAsyncKeyState(0x51) != 0x0000); { OutputDebugString("key unpressed"); pressed = false; } } DispatchMessage(&message); }

这里的密钥是'q'或virtual key code 0x51。这就是你创建一个窗口并进行设置之后的全部内容。如果您需要完整的代码,请发表评论或与我联系。

答案 2 :(得分:0)

更多当前有效的代码VS2017

INT_PTR CALLBACK myModalessWindow(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
        case WM_CHAR: //case sensitive
            if ((char)wParam == 'A') Beep(2000, 250);
            if ((char)wParam == 'b') Beep(2000, 250);

        break;

        case WM_KEYDOWN: 
            {
                if (GetKeyState('A') & 0x8000/*Check if high-order bit is set (1 << 15)*/) 
                    Beep(2000, 250);

                if (wParam == 'S')  Beep(2000, 250); //Not case sensitive.

            }
        break;
    }
}

答案 3 :(得分:0)

您可以使用allegro或sfml库,但需要一种快速解决方案:

#include iostream
using namespace std;

int main() {
    char input;
    cin >> input;

    if (input == f) 
    {
        //do something
    }

    return 0;
}

或者,如果您需要更多关键选项,则始终可以将if语句替换为switch语句。 如果您希望某些东西可以在整个程序中运行(例如,如果在程序执行过程中的任何时间,某人按下某些东西,将会发生某些事情,则需要了解多线程处理-请查看sfml)。