ComboBox文本到GetAsyncKeyState

时间:2015-01-17 23:32:15

标签: winapi visual-c++

我正在尝试将文本从组合框传递到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)

我尝试过很多东西但无法让它发挥作用。 是的,我使用了搜索。

1 个答案:

答案 0 :(得分:1)

我认为你来自一种语言,其中字符串"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中的大多数constn),常量名称是预处理器宏,用

创建
#define NAME replacemnt-text

例如,

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

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