gpt4 book ai didi

c++ - Win32 消息循环中的键盘输入

转载 作者:太空宇宙 更新时间:2023-11-04 15:41:02 24 4
gpt4 key购买 nike

有没有办法在消息循环中检测键盘输入。这是我在下面尝试过的东西:

LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
// WM_DESTROY is sent when the window is being destroyed.
case WM_DESTROY:
PostQuitMessage(0);
return 0;

case WM_KEYDOWN:
BYTE keyboardState[256];

if (keyboardState[DIK_W]) {
OutputDebugStringW(L"W Button Pressed\n");
}

if (keyboardState[DIK_A]) {
OutputDebugStringW(L"A Button Pressed\n");
}

if (keyboardState[DIK_S]) {
OutputDebugStringW(L"S Button Pressed\n");
}

if (keyboardState[DIK_D]) {
OutputDebugStringW(L"D Button Pressed\n");
}
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}

问题是它似乎返回所有键盘状态:输出如下...

W Button Pressed
A Button Pressed
S Button Pressed
D Button Pressed

我如何实现它,以便它只检测按下的键输入。我是新手,所以这可能是一个愚蠢的实现:)

最佳答案

您永远不会在按下某个键时设置元素。

您还将 keyboardState 数组用作局部变量。您必须将其设为全局或静态,因为每次调用 MsgProc 函数时,keyboardState 都会分配在堆栈上,并且无法保证其内容,可能有已被使用相同内存空间的先前函数调用修改。

在您的代码中,keyboardState 的每个元素基本上都有 255/256 的概率为非零,并且您正在检测那个而不是真正的按键。

如果您不从外部访问键盘状态,请不要理会数组 - 只需使用 MsgProc 函数的 wParam 参数即可:

 case WM_KEYDOWN:

if (wParam == DIK_W) {
OutputDebugStringW(L"W Button Pressed\n");
}

if (wParam == DIK_A) {
OutputDebugStringW(L"A Button Pressed\n");
}

if (wParam == DIK_S) {
OutputDebugStringW(L"S Button Pressed\n");
}

if (wParam == DIK_D) {
OutputDebugStringW(L"D Button Pressed\n");
}
return 0;

(假设您的 DIK_ 键值与 WinAPI 的 VK_ 键码相同)

关于c++ - Win32 消息循环中的键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23082004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com