【问题标题】:Getting user input from Win32 C++. WPARAM casted as int?从 Win32 C++ 获取用户输入。 WPARAM 转换为 int?
【发布时间】:2010-12-23 11:18:20
【问题描述】:

我正在处理一个预先存在的代码库,我希望用户在代码运行期间的任何时间键入任何 1-2 位数字,然后按 Enter 键,并将该数字传递给函数。目前,用户输入的处理方式如下:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;

    switch (message)
    {
    case WM_KEYDOWN:
        Engine::GetInstance()->GetInput()->GetKeyboard()->SetKeyPressed(static_cast<int>(wParam));
        break;
        //snip

现在,我不确定一些事情,

  • a) 为什么按键被传递为整数而不是字符?

  • b) 在这种情况下发送“F1”会是什么结果aaand

  • c) 我如何使用它来读取 1-2 位数字并仅在按下回车时传递?

【问题讨论】:

  • 您是否有理由需要使用 WM_KEYDOWN 执行此操作?对于熟键盘输入,WM_CHAR 将是一个更好的选择——它可以处理数字键盘和其他奇怪的输入。

标签: c++ winapi input keyboard


【解决方案1】:

a) 这里发送的值是虚拟键码,不一定是字符。

b) 查看虚拟键代码列表here(在评论中给出)。 F1 将由 VK_F1 (0x70) 表示。

c) 当按下一个数字时,将其添加到包含按下的最后一个数字的字符串中。当按下任何其他键时,清除字符串。回车时,根据字符串值进行操作。

编辑:这在WM_KEYDOWN 中会有点复杂,因为您需要同时处理普通数字键和数字键盘键。处理 WM_CHAR 消息会更容易,它接收 wParam 中的字符代码。

【讨论】:

  • 那么我是否需要为每个代表 0-9 的虚拟键进行切换?好像应该可以直接输入吧?
  • 不需要开关,可以使用类似:if (key&gt;='0' &amp;&amp; key&lt;='9') digitsPressed += (char)key;对于数字,虚拟键码与ASCII码相同
  • 实际上,我的最后一条评论无法正确处理数字键盘键 - 请参阅我编辑的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 2013-04-14
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多