【问题标题】:Holding a key down for an uncertain time在不确定的时间内按住一个键
【发布时间】:2014-12-14 16:09:16
【问题描述】:

我试图在不确定的时间内按住箭头键并在此之后释放它。 伪代码:

SendKey(VK_RIGHT, KEY_DOWN);

// Do something

SendKey(VK_RIGHT, KEY_UP)

我使用 Visual Studio 2012 和 Windows 7-64 位。 我已经搜索了很多时间并尝试了这样的事情:

#include <Windows.h>
#include <WinUser.h>
using namespace std;

[...]

INPUT Event = {0};
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = 0;
Event.ki.wScan = ::MapVirtualKey(VK_RIGHT, MAPVK_VK_TO_VSC);
Event.ki.time = 2000;                                   // hold 2 sek. ?
Event.ki.dwExtraInfo = 0;
Event.ki.wVk = VK_RIGHT;                                    // (Right-Arrow)

SendInput(1, &Event, sizeof(Event));        // hold
Sleep(1000);                                // do something (waiting in this case)
Event.ki.dwFlags = KEYEVENTF_KEYUP;         // release 
SendInput(1, &Event, sizeof(Event));

但这并没有达到预期的效果,我不知道出了什么问题。 键被正确按下,但未按住。 提前致谢。

【问题讨论】:

  • 只是一个观察,你真的应该使用 VK_ 符号而不是幻数。

标签: c++ c winapi io output


【解决方案1】:

根据documentationtime 字段是时间戳而不是持续时间(请参阅here)。由于某种原因,该文档实际上并未说明时间戳的格式。我一直只使用0 作为这个值,让系统选择适当的时间戳。

我也相信你需要设置:

Event.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
...
Event.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY;

使箭头键代码起作用。

另外,就像船长提到的那样,使用适当的VK_ 宏 (VK_LEFT)。请注意,0x27 实际上定义为VK_RIGHT,这可能是您代码中的另一个问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2012-03-04
  • 2013-04-10
  • 2018-07-31
  • 2012-09-23
  • 2021-12-04
相关资源
最近更新 更多