ComboBox 文本到 GetAsyncKeyState

ComboBox text to GetAsyncKeyState

我正在尝试将文本从组合框传递到 GetAsyncKeyState。

组合框中的文本可以是:

std::string keys[7] = { "VK_XBUTTON1", "VK_XBUTTON2", "VK_CONTROL", "VK_SPACE", "0x45", "0x46", "0x47" };

我得到这样的文本:

char key[MAX_PATH];
GetDlgItemText(hWnd, IDC_COMBO1, M1::Threads::Inst().key, sizeof(M1::Threads::Inst().key));

和 GetAsyncKeyState:

(GetAsyncKeyState((int)M1::Threads::Inst().key) & 0x8000)

我尝试了很多东西,但都无法正常工作。 是的,我用过搜索

Ty.

我认为您来自一种语言,其中字符串 "CONSTANT" 可用于表示变量 CONSTANT。 C++ 不这样做。您将需要一些代码将字符串转换为实际常量值。

有几种方法可以做到这一点。最天真的方法是做大量的字符串比较:

if (_tstrcmp(dlgItemText, _T("VK_XBUTTON1")) == 0)
    vk = VK_XBUTTON1;

但是,如果您的组合框中条目的顺序永远不会改变,那么有一个更好的方法:保持一个虚拟键代码数组与您的组合框中条目的顺序相同,并使用当前的索引所选项目以引用该列表:

int vkeys[7] = {
    VK_XBUTTON1,
    VK_XBUTTON2,
    VK_CONTROL,
    VK_SPACE,
    0x45,
    0x46,
    0x47,
};
// ...
LRESULT item = SendMessage(GetDlgItem(...), CBM_GETCURSEL, 0, 0);
if (item != CB_ERR)
    if ((GetAsyncKeyState(vkeys[item]) & 0x8000) != 0)
        // ...
// note: error checking omitted for expository purposes

关于您期望的行为:对于虚拟键代码(以及 Windows API 中的大多数常量),常量名称是 预处理器宏 ,创建于

#define NAME replacemnt-text

例如,

#define VK_XBUTTON1       0x05    /* NOT contiguous with L & RBUTTON */

这些名称永远不会到达 C++ 编译器:它们由称为 预处理器 的东西处理,它处理 #include 之类的东西。预处理器将用替换文本替换任何 #define,然后 然后 将结果交给编译器。编译器永远不会看到 VK_XBUTTON1;它只会看到 0x05。所以你想做的事根本不可能!