【问题标题】:SendInput() for keyboard - only uppercase键盘的 SendInput() - 仅大写
【发布时间】:2012-07-11 10:14:21
【问题描述】:

很有趣。几分钟前我刚刚在这里问过SendInput() for keyboard - only lowercase,如何发送大写字母。解决方案是在信件之前发送班次。但是打开shift之后就关不掉了……

我正在努力使用这样的 KEYEVENTF_KEYUP 标志:

INPUT Input = { 0 };
Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = VK_LSHIFT;
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = 'A';
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = VK_LSHIFT;
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = 'A';
SendInput( 1, &Input, sizeof( INPUT ) );

但它似乎根本不起作用。它总是发送 AA。

谢谢。

【问题讨论】:

  • 左移键不是 KEYEVENTF_EXTENDEDKEY。 A也不是。
  • 此外,您向A 发送了两次“down”。

标签: winapi keyboard sendinput


【解决方案1】:

问题出在

Input.mi.dwFlags

应该是

Input.ki.dwFlags

感谢罗德里戈。

另一种方法是使用 KEYEVENTF_SCANCODE 标志。然后我们必须使用 VkKeyScan() - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85).aspx 扫描我们的字符,它会为我们提供低字节的虚拟键码和高字节的状态(shift、ctrl 等)。

由于使用扫描码,我们必须使用 MapVirtualKey() 和 MAPVK_VK_TO_VSC 值将我们的虚拟代码映射到扫描码,MS​​DN 说:

uCode 是一个虚拟键码,被翻译成扫描码。如果它 是一个不区分左右键的虚拟键码 右手键,返回左手扫码。如果没有 翻译,函数返回0。

然后将其传递给 Input.ki 结构的 wScan 字段,因为根据 MSDN,如果我们使用扫描代码,它会忽略 wVk 并使用 wScan,MSDN 说:

如果指定,wScan 会识别密钥并忽略 wVk。

因此代码可能如下所示:

INPUT Event = { 0 };

const SHORT key = VkKeyScan('a');
const UINT mappedKey = MapVirtualKey( LOBYTE( key ), 0 );

// Press shift key
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = MapVirtualKey( VK_LSHIFT, 0 );
SendInput( 1, &Event, sizeof( Event ) );

// upper case 'A' (press down)
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );

//  release 'A'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );

// Release shift key
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = MapVirtualKey( VK_LSHIFT, 0 );
SendInput( 1, &Event, sizeof( Event ) );

const SHORT key1 = VkKeyScan('a');
const UINT mappedKey1 = MapVirtualKey( LOBYTE( key1 ), 0 );

// lower case 'a' (press down)
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );

// release 'a'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );

如果我说错了,请纠正我。

【讨论】:

  • 你错过了 SendInput 的全部要点,即放入不能被真实输入事件中断的输入事件数组
  • 您忘记在释放“a”时输入一元或 KEYEVENTF_KEYUP。 @tobi,检查我的编辑
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 2018-03-03
  • 2010-11-25
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多