HyperDesk - Ứng dụng desktop nhúng các phiên Hyper-V/RDP vào một cửa sổ duy nhất
(github.com/qetqet910)Mình đã quá mệt vì phải mở nhiều VM rồi chuyển qua lại giữa các cửa sổ nên đã tự làm ra nó.
Trong lúc đang làm quen với công việc ở công ty, mình chợt nghĩ thế này.
Mỗi khi có một yêu cầu bảo trì, lại phải mở remote desktop tới server của khách hàng (MST),
môi trường phát triển phù hợp với phiên bản client (Hyper-V), khách hàng yêu cầu môi trường đặc thù (VDI/Omnissa), v.v.
Màn hình thì quá rối... có cách nào tốt hơn không?
Vì vậy mình đã tự làm thử, với hy vọng có thể giúp ích cho team dù chỉ một chút.
- Cách hoạt động
HyperDesk nhúng các phiên Hyper-V (VMConnect) và RDP vào trong ứng dụng bằng Win32 Window Swallowing.
Đây không phải preview hay tab giả lập, mà là cách hút trực tiếp cửa sổ phiên thật bằng SetParent.
- Chế độ xem một phiên đang hoạt động + chuyển ngay lập tức: hiển thị một phiên đang hoạt động ở toàn màn hình và chuyển tức thì giữa tối đa 4 phiên bằng Alt+1~4 (hoặc tab trên header). Các phiên còn lại vẫn sống ở nền nên chuyển qua lại không bị ngắt.
- Điều phối bàn phím: khi phiên đang hoạt động có focus, các phím tắt hệ thống như phím Win, Alt+Tab sẽ được truyền vào bên trong VM.
- Ngăn UI bị treo: ngay cả khi modal xác thực của client bên ngoài bật lên, UI chính vẫn không bị treo; để tránh deadlock, mình đã dùng hàng đợi message độc lập thay vì
AttachThreadInput. - Theo dõi cửa sổ: khi bố cục thay đổi như resize cửa sổ ứng dụng, vị trí của cửa sổ ngoài đã nhúng sẽ bám theo bằng
requestAnimationFrame+ lọc delta ở backend.
Ngoài ra còn có các tính năng tiện ích như snapshot, biệt danh/ghi chú theo từng tài sản remote, command palette, RDP, bật/tắt Hyper-V.
- Stack / môi trường
Tauri v2 + Rust + React 19
Chỉ dành cho Windows
Landing page: https://landinghyperdesk.netlify.app/ (Y2K)
- Những gì vẫn chưa làm được
VMware/Omnissa Horizon thì đã có một phần mã chạy client, nhưng chưa được kiểm chứng trong sử dụng thực tế. Đặc biệt, Omnissa không phải bản thân VM mà có dạng dashboard nên rất khó để bắt lấy cửa sổ, vì vậy tính năng nhúng hiện đang bị vô hiệu hóa.
Vì đây là một side project nên vẫn còn nhiều thiếu sót. Mình đặc biệt muốn nghe ý kiến về giới hạn vốn có của cách Window Swallowing, cũng như liệu hướng tiếp cận này có thể được dùng ổn định trong môi trường thực tế hay không. Nếu ai từng có trăn trở tương tự, rất mong nhận được feedback và mình sẽ tích cực tiếp thu!
Chưa có bình luận nào.