簡體   English   中英

C++ 按下鍵

[英]C++ getting the key pressed

我正在制作一個程序,我希望它能夠讀取按鍵。 它做得很好,但是當我嘗試獲取按下的鍵的名稱時遇到了一些麻煩。 代碼只是在程序中間停止,對於運行的部分,它沒有給出預期的輸出。 這是我的代碼。

#include <iostream>
#include <Windows.h>

#pragma comment(lib, "User32.lib")

using std::cout;
using std::endl;
using std::wcout;

void test(short vk)
{
    WCHAR key[16];
    GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR), key, _countof(key));
    wcout << "Key: " << key << endl;
}

int main()
{
    cout << "Running...." << endl;

    test(0x44); // Key: D
    test(0x45); // Key: E
    test(0x46); // Key: F

    return 0;
}

這給我的輸出是

Running....
Key:

我期待的輸出是

Running....
Key: D
Key: E
Key: F

或者至少是非常接近的東西。 它應該顯示這三個十六進制數代表 D、E 和 F。

測試功能是我用來測試將虛擬鍵代碼轉換為它們所代表的鍵但迄今為止未成功的功能。 任何幫助表示贊賞!

閱讀文檔。 MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR)不是有效輸入GetKeyNameTextW()作為要映射的虛擬鍵碼為一個字符,但GetKeyNameTextW()需要一個硬件掃描代碼,而不是(在其他標志),諸如從LPARAM一個的WM_KEY(DOWN|UP)消息。

如果GetKeyNameTextW()失敗,您也不能確保您的key[]緩沖區以空值終止,因此您可能會冒險將垃圾傳遞給std::wcout

在這種情況下,虛擬鍵碼0x44 .. 0x46可以按MapVirtualKeyW()輸出,一旦被MapVirtualKeyW()轉換,就不需要對它們使用GetKeyNameTextW() ,例如:

void test(short vk)
{
    UINT ch = MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR);
    if (ch != 0) {
        wcout << L"Key: " << (wchar_t)ch << endl;
    }
    else {
        wcout << L"No Key translated" << endl;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM