如何伪造键盘移位按。 Qt,Windows 10

时间:2018-03-12 08:03:31

标签: c++ windows qt point-cloud-library

我为基于触摸的平板电脑开发了一些软件。该设备没有键盘,只有一个触摸屏(触摸屏模拟鼠标)。操作系统是Windows 10,我们使用Qt作为图形用户界面框架。

我们依赖于一个类库Point Cloud库,该库具有一个组件,当我们单击鼠标左键时,该组件需要按下SHIFT键才能生成某些内容。

我需要让底层软件组件相信已按下SHIFT键。

我试图通过“Qt手段”将按键事件发送到Qt小部件,但假的SHIFT按键似乎没有到达底层的sw。零件。可能因为它与Qt在一个不相关的类库中,并且该软件类库可能以不同方式检查关键事件(例如通过OS调用,c ++ std方式或类似方法)。

尝试“Qt方式”时似乎没有用:

QKeyEvent key_press(QEvent::KeyPress, Qt::Key_Shift, Qt::ShiftModifier);
QApplication::sendEvent(ui->qvtkWidget, &key_press);

因此,我可能需要使用操作系统方法伪造SHIFT键按下。

问题: 如何从Qt执行OS系统调用或类似操作,以使底层软件组件认为已按下并保持SHIFT键(同时用户按下鼠标左键)。

1 个答案:

答案 0 :(得分:0)

您想要的不是伪造一个shift键输入,而是禁用交互级别的班次检查。绝对是一个XY问题。

vtk InteractorStyle类负责处理用户输入事件。您可以在pcl_visualizer.cpp的line 506

中看到
boost::signals2::connection
pcl::visualization::PCLVisualizer::registerPointPickingCallback (boost::function<void (const pcl::visualization::PointPickingEvent&)> callback)
{
  return (style_->registerPointPickingCallback (callback));
}

回调在PCLVisualizerInteractorStyle类中注册。

您可以在构建PCLVisualizer时传递自己的自定义交互器样式,这样您就可以安全地覆盖它。要使用的构造函数是one

PCLVisualizer (int &argc, char **argv, const std::string &name="", PCLVisualizerInteractorStyle *style=PCLVisualizerInteractorStyle::New(), const bool create_interactor=true) 

初始化默认的交互器样式时,PointPickingCallback类作为鼠标回调正在added automatically。因此,为了覆盖此行为,您需要从PCLVisualizerInteractorStyle派生自己的类并覆盖Initialize()方法,并在构建时将此新的交互器样式传递给PCLVisualizer

PointPickingCallback内的Execute方法是检查shift键的位置。

void
pcl::visualization::PointPickingCallback::Execute (vtkObject *caller, unsigned long eventid, void*)
{
  PCLVisualizerInteractorStyle *style = reinterpret_cast<PCLVisualizerInteractorStyle*>(caller);
  vtkRenderWindowInteractor* iren = reinterpret_cast<pcl::visualization::PCLVisualizerInteractorStyle*>(caller)->GetInteractor ();
  if (style->CurrentMode == 0)
  {
    if ((eventid == vtkCommand::LeftButtonPressEvent) && (iren->GetShiftKey () > 0))
    {
      float x = 0, y = 0, z = 0;
      int idx = performSinglePick (iren, x, y, z);
      // Create a PointPickingEvent if a point was selected   
      [... and so on]

总之,您需要:

  1. PointPickingCallback派生一个新类,该类覆盖了Execute方法中对shift键的检查。
  2. PCLVisualizerInteractorStyle导出并覆盖Initialize方法,以注册新的自定义PointPickingCallback类,该类不会检查shift键,作为鼠标回调。
  3. 将新的交互器样式传递给PCLVisualizer
  4. 值得注意的是。可视化器支持两种选择模式:用于区域选择和单点拾取的橡皮筋,可以通过按键“x”来互换。我认为要选择的默认值是橡皮筋,这就是为什么它可能会检查首先按下的换档键。