QT中键盘模拟鼠标的新方法

 

这段时间使用QT开发项目,遇到了一些问题,经过几天奋战,终于搞定,故写下解决思路。
1、首先是关于透明窗口在视频前的闪烁问题
 刚开始,我是使用布局管理,在一Dialog中添加四个Widget,但是将Dialog设为透明后,会随着视频帧的不断刷新而重绘。于是,尝试使Widget构造时没有父对象,单独视为一个窗口,在设为透明,成功解决闪烁问题。
2、关于键盘模拟鼠标问题
 在网上找了些方法,但主要是使用eventFilter,在其中添加如下代码:
   case Qt::Key_W:
    pos.setY(pos.y()-10);
    QCursor::setPos(pos);
    break;
   case Qt::Key_L:

    QMouseEvent *mEvnPress;
    QMouseEvent *mEvnRelease;
    mEvnPress = new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    mEvnRelease = new QMouseEvent(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    QCoreApplication::postEvent(obj,mEvnPress);
    QCoreApplication::postEvent(obj,mEvnRelease);
    break;
不过,对于我这不是很好的解决办法,对每个Dialog都得添加以上代码,还得根据每个Dialog修改代码,总之,不具通用性。
从x11EventFilter得到启发,找到了winEventFilter,因为底层消息都会经过此函数,所以我们可以截取键盘事件,然后再PostMessage相应的鼠标事件,ok,搞定!
具体代码如下:
 bool winEventFilter ( MSG * msg, long * result )
 {
  qDebug("ok");
  if (msg->message==WM_KEYDOWN)
  {
   if (msg->wParam==VK_F2)//截取F2键盘消息
   {
    
    QPoint pos;
    pos=QCursor::pos();
    POINT point;
    point.x=pos.x();
    point.y=pos.y();
    HWND h=WindowFromPoint(point);//获取鼠标处窗口句柄
    ScreenToClient(h,& point); //将鼠标的全局坐标转为相对窗口的局部坐标
    //发送右键消息
    PostMessage(h,WM_RBUTTONDOWN,MK_LBUTTON,MAKELONG(point.x,point.y)); //右键按下
    PostMessage(h,WM_RBUTTONUP,MK_LBUTTON,MAKELONG(point.x,point.y));//右击释放
    
   }
  }

  return false;
 }
有时候往底层深入些,往往起到事半功倍的效果。

阅读更多
文章标签: qt dialog
个人分类: QT技术
下一篇快,体现了真正的掌握
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭