【问题标题】:SendInput on c++ doesn't take Ctrl and Shift in accountC++ 上的 SendInput 不考虑 Ctrl 和 Shift
【发布时间】:2020-02-21 17:55:29
【问题描述】:

我正在尝试在使用 Embarcadero 编写的 C++ 应用程序中向控件发送 CTRL+SHIFT+END 击键。我正在使用下面的代码:

tagINPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;

// Appui sur Ctrl
ip.ki.wVk = VK_CONTROL;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));

// Appui sur Shift
ip.ki.wVk = VK_SHIFT;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));

// Appui sur End
ip.ki.wVk = VK_END;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));

Application->ProcessMessages();

// Relacher End
ip.ki.wVk = VK_END;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));

// Relacher Shift
ip.ki.wVk = VK_SHIFT;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));

// Relacher Ctrl
ip.ki.wVk = VK_CONTROL;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));

但是,如果 CTRLSHIFT 键上没有任何操作,它似乎可以正常工作。

我错过了什么?

【问题讨论】:

  • sendinput 不是标准 c++ 的一部分,您应该在问题中包含更多标签,如果您这样离开,您应该将代码包含到该 sendinput 函数中,但我猜您没有没有,不是每个使用 c++ 的人都使用 Embarcadero。
  • 老实说,我使用的是来自项目的 SendInput,包含在一个 win32.h 文件中。这是由不再在我公司的其他人完成的,因此我无法准确了解它的作用。
  • 用于合成击键
  • 好的,我明白了。现在,尽管我在问题中包含的代码中编写了 SendInput,为什么它会合成击键,就好像没有按下 Ctrl 和 Shift 一样?
  • 您不应进行多次SendInput() 调用,而应在单个 SendInput() 调用中传递一个包含您要发送的所有输入的数组。

标签: c++ winapi sendinput


【解决方案1】:

问题是,VK_END 键是扩展键。所以你应该在标志中声明这一点:

eip.ki.dwFlags = 0;
ip.ki.wVk = VK_END;
ip.ki.dwFlags = 0;
ip.ki.dwFlags = ip.ki.dwFlags || 1;
SendInput(1, &ip, sizeof(INPUT));

Application->ProcessMessages();

// Relacher End
ip.ki.wVk = VK_END;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
ip.ki.dwFlags = ip.ki.dwFlags || 1;
SendInput(1, &ip, sizeof(INPUT));

请注意,我使用 1 来设置标志,因为我不知道您是否在 C++ 中定义了一个常量,但假设某处有一个常量。

【讨论】:

  • 非常感谢,我敢打赌这正是我需要的答案 :) 我很快就会尝试并告诉它是否有效(我认为它肯定很好)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2011-09-07
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多