Using GetKeyState()
Using GetKeyState()
本文关键字:GetKeyState Using 更新时间:2023-10-16
我希望在按键时有一个布尔事件切换。特别是,s的键。有人向我介绍了GetKeyState()函数,它应该在Win32 API下工作。我知道字母s的ASCII代码是115,所以我的代码如下:
if (GetKeyState(115) == 1)
{
<EVENT>
}
然而,这是行不通的。为什么?以下是MSDN参考资料:http://msdn.microsoft.com/en-us/library/ms646301%28v=vs.85%29.aspx。。。"如果低位为1,则切换键"
据我所知,您需要做的是:
if( GetKeyState(115) & 0x8000 )
{
<EVENT>
}
如果按键被按下,最高位告诉。最低的告诉键是否被切换(比如,如果帽锁被打开)。
由于SHORT是有符号的,所以高阶位等于符号位。
因此,要测试是否按下了给定的键,只需测试GetKeyState()
返回的值是否为负:
if (GetKeyState('S') < 0) {
// The S key is down.
} else {
// The S key is up.
}
此外,115是"s"的ASCII码。我认为,你应该使用大写83来测试"S"键。
我使用全局变量bool altgr
示例:
void Editor::HandleKey(char car) {
bool shift = false;
//bool altgr = false;
bool printable = false;
if (car == 27) SendMessage(hwnd, WM_DESTROY, 0, 0);
if ((GetKeyState(VK_CAPITAL) & 0x0001) == 1) shift = true;
if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000) shift = true;
// if(GetKeyState(VK_RMENU) & 0x80000000 == 0x80000000) altgr = true;
if (car == 18) altgr = true;
有时您想要使用键的组合。
为了避免键组合(例如:VK_SHIFT和VK_LEFT)满足两个条件的情况:
std::cout << "Shift RIGHT pressed" << std::endl;
std::cout << "LEFT key pressed" << std::endl;
只需使用Sleep(...);
和GetAsyncKeyState(VK_...)
GetKeyState()与GetAsyncKeyState[()与getch()?
#include <windows.h>
...
while (1)
{
if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(VK_LEFT) & 0x8000))
{
Sleep(200);
std::cout << "Shift LEFT pressed" << std::endl;
}
if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(VK_RIGHT) & 0x8000))
{
Sleep(200);
std::cout << "Shift RIGHT pressed" << std::endl;
}
if (GetAsyncKeyState(VK_RIGHT))
{
std::cout << "RIGHT key pressed" << std::endl;
}
if (GetAsyncKeyState(VK_LEFT))
{
std::cout << "LEFT key pressed" << std::endl;
}
}
这有点晚,但高位是0x80000000,而不是0x8000,更改此项,它将正常工作。
另一点——毫无用处——它的作用就像你在按下LSHIFT时按下了CAPS LOCK。
相关文章:
- "using namespace std;"在C++的作用是什么?
- vector<vector<double>> to mxArray using memcpy
- Using C++ CryptAPI:CNG Create CSR
- STLPort using C++11
- 函数中的 c++ using 语句,后跟函数名称(对于 ADL?
- Using getchar_unlocked()
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 嵌套命名空间的"using"指令,但需要命名内部命名空间
- 为什么"using System;"不被视为不良做法?
- 为什么我需要做'using namespace std'而不是"使用 std::cout"?
- 'using namespace'实现细节的便捷方法(仅标头库)?
- 在 if 语句中使用 GetKeyState 时,它会跳过条件
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 如何区分C++中的"using declaration"和"using directive"?
- C++ "using tcp=x"到"namespace tcp=x"有什么区别
- 如何为流输出运算符提供重载<<模板'using'类型别名?
- Using PrimitiveBatch::DrawIndexed with ID3D11DeviceContext::
- 如何创建一个 while 循环,继续循环,直到在C++中输入'using streams'键?
- Using GetKeyState()