windowpreviewwidget.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef WINDOWPREVIEWWIDGET_H
  2. #define WINDOWPREVIEWWIDGET_H
  3. #include <QListView>
  4. class QStandardItemModel;
  5. class WindowPreviewWidget : public QListView
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit WindowPreviewWidget(QWidget *parent = nullptr);
  10. ~WindowPreviewWidget();
  11. signals:
  12. void windowDoubleClicked(quintptr hwnd, const QString &title); // 添加双击信号
  13. protected:
  14. void mousePressEvent(QMouseEvent *event) override;
  15. void mouseDoubleClickEvent(QMouseEvent *event) override; // 添加双击事件处理
  16. void mouseMoveEvent(QMouseEvent *event) override;
  17. void leaveEvent(QEvent *event) override;
  18. void enterEvent(QEvent *event) override;
  19. void focusInEvent(QFocusEvent *event) override;
  20. void focusOutEvent(QFocusEvent *event) override;
  21. private:
  22. QStandardItemModel *model;
  23. QTimer *updateTimer;
  24. QHash<HWND, QPixmap *> thumbnailCache;
  25. HWND lastActiveWindow = nullptr;
  26. QSize thumbnailSize = QSize(120, 120); // 预览大小
  27. QModelIndex hoveredIndex; // 当前鼠标悬停的索引
  28. QModelIndex focusedIndex; // 当前获得焦点的索引
  29. void updateThumbnails();
  30. void addWindowThumbnail(HWND hwnd, HWND activeWindow);
  31. QPixmap *captureWindow(HWND hwnd);
  32. void addDesktopThumbnail(HWND activeWindow);
  33. QIcon getWindowIcon(HWND hwnd);
  34. bool needFullUpdate() const;
  35. std::wstring getWindowTextStd(HWND hwnd);
  36. };
  37. /// demo
  38. // #include "qapplication.h"
  39. // #include "widgets/windowpreviewwidget.h"
  40. // #include <QBoxLayout>
  41. // #include <QLabel>
  42. // #include <QWidget>
  43. // int main(int argc, char *argv[])
  44. // {
  45. // QApplication app(argc, argv);
  46. // QWidget mainWidget;
  47. // QVBoxLayout *layout = new QVBoxLayout(&mainWidget);
  48. // layout->setContentsMargins(0, 0, 0, 0);
  49. // // 设置半透明背景
  50. // mainWidget.setAttribute(Qt::WA_TranslucentBackground);
  51. // mainWidget.setStyleSheet("background: rgba(0, 0, 0, 150);");
  52. // WindowPreviewWidget *previewWidget = new WindowPreviewWidget;
  53. // layout->addWidget(previewWidget);
  54. // // 添加信息标签
  55. // QLabel *infoLabel = new QLabel("Double-click a window to see its handle");
  56. // infoLabel->setAlignment(Qt::AlignCenter);
  57. // infoLabel->setStyleSheet("color: white; font-weight: bold; background: rgba(0, 0, 0, 100);");
  58. // layout->addWidget(infoLabel);
  59. // // 连接双击信号
  60. // QObject::connect(previewWidget,
  61. // &WindowPreviewWidget::windowDoubleClicked,
  62. // [infoLabel](quintptr hwnd, const QString &title) {
  63. // QString info = QString("Double-clicked window: HWND=0x%1, Title=\"%2\"")
  64. // .arg(hwnd, 0, 16) // 以十六进制显示句柄
  65. // .arg(title);
  66. // infoLabel->setText(info);
  67. // });
  68. // mainWidget.setWindowTitle("Window Preview");
  69. // mainWidget.resize(900, 700);
  70. // mainWidget.show();
  71. // return app.exec();
  72. // }
  73. #endif // WINDOWPREVIEWWIDGET_H