Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于Ctrl+的GetAsynchKeyState;B怎么用?_C#_C++ - Fatal编程技术网

C# 用于Ctrl+的GetAsynchKeyState;B怎么用?

C# 用于Ctrl+的GetAsynchKeyState;B怎么用?,c#,c++,C#,C++,我正在使用 public static bool IsKeyPushedDown(Keys vKey) { return 0 != (GetAsyncKeyState((int)vKey) & 0x8000); } 但是我不知道如何组合两个键。类似于if(IsKeyPushedDown('B')&IsKeyPushedDown(VK_控制))也许 正如其他人在评论中所述,使用事件WM_KEYDOWN或WM_CHAR检查“某人按下键”确实是“当某人按下键时我想调用函数”的“正确”解

我正在使用

public static bool IsKeyPushedDown(Keys vKey)
{
   return 0 != (GetAsyncKeyState((int)vKey) & 0x8000);
}
但是我不知道如何组合两个键。

类似于
if(IsKeyPushedDown('B')&IsKeyPushedDown(VK_控制))
也许


正如其他人在评论中所述,使用事件WM_KEYDOWN或WM_CHAR检查“某人按下键”确实是“当某人按下键时我想调用函数”的“正确”解决方案。然而,你特别问“我正在使用……一些代码……我不知道如何组合两个键”,上面的答案肯定是正确的

您可以捕获WM_KEYDOWN,将传入的键与“B”进行比较,然后使用GetAsyncKeyState检查CTRL键的状态(就像现在一样)。或者,您可以使用加速器表:一般来说,
GetAsyncKeyState
是一个坏主意,因为它忽略了诸如typeahead之类的内容。您应该使用线程的当前密钥状态,而不是异步密钥状态。理想情况下,您只需听2的
WM_CHAR
(表示Ctrl+B的ASCII码)。这将允许您使用虚拟键盘。是的,这应该是可行的。但是,对于user2026052,您应该记住,只要按住CTRL+B,此条件将为真,因为GetAsyncKeyState获取键的当前状态,而不仅仅是在第一次按下键时。如果您只想捕获按下CTRL+B的第一个实例(因此您只需要处理B以前未按下但现在正在按下的情况),那么您可能需要自己维护按键状态。如果((IsKeyPushedDown(Keys.B)和&IsKeyPushedDown(Keys.Control))不起作用,看起来如果没有额外的线程,func就不能完成。在这种情况下,“不能工作”意味着什么?请[在原问题中更倾向于]解释你试图实现的目标。听起来你好像在问一个XY问题——你想做X,你的想法是通过使用Y来实现的,所以你问如何做Y。不幸的是,我们不知道X是什么,所以不能给出适当的建议,如何最好地解决你的问题。我已经回答了Y问题[我相信是正确的]。X:我想通过按例如:Ctrl+B Y作为可能开始调用函数解决方案:GetAsynchKeyState Z作为问题:Y不会捕捉到一对键,至少对我来说-我只能捕捉到一个键。我不能做linebrak…我已经编辑了我的答案。如果你希望我删除答案,因为我回答了你的实际问题,那好吧。请说吧!