我正在尝试将文本从组合框传递到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)
我尝试过很多东西但无法让它发挥作用。 是的,我使用了搜索。
泰
答案 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
。所以你想做的事情甚至不可能!