Tôi có một ứng dụng giống như watermark được viết bằng XLib trong C. Hiện tại nếu bạn nhấp vào bất kỳ đâu trên ứng dụng thì không có gì xảy ra nhưng tôi muốn nó chuyển đầu vào chuột tới bất kỳ thứ gì bên dưới nó. ví dụ. Nếu bạn nhấp vào X để đóng cửa sổ bên dưới ứng dụng, nó sẽ đóng ứng dụng, không làm gì cả.Nhấp qua các cửa sổ xlib trong suốt
Trả lời
Tôi nghĩ rằng XQueryTree
có thể trợ giúp. Thực hiện nó vào cửa sổ gốc và lấy danh sách các cửa sổ con, tìm vị trí của chúng và chuyển số XEvent
của chuột/bàn phím đến cửa sổ thích hợp.
Lưu ý: Bạn phải chăm sóc cửa sổ hoạt động/không hoạt động, khu vực hoạt động/không hoạt động cửa sổ, con của cửa sổ khác, kích thước và vị trí x/y của các cửa sổ khác. Mã sẽ là lộn xộn cho việc này.
Nếu bạn không muốn cửa sổ "watermark" nhận bất kỳ đầu vào nào và thay vào đó nhập vào cửa sổ bên dưới, thì tôi sẽ xem xét implementation behind gtk_widget_input_shape_combine_region
. Trước đây tôi đã sử dụng phiên bản trước đó gtk_widget_input_shape_combine_mask
để khiến tất cả các phần của cửa sổ bật lên không nhận được bất kỳ sự kiện nào.
Tôi đang ở ngoài vùng thoải mái của mình ở đây, nhưng có vẻ như XShapeCombineRectangles là cuộc gọi liên quan (số do_shape_combine_region
được liên kết được gọi với số shape = ShapeInput
cho trường hợp này).
Tôi đã thử nó với Cửa sổ GDK, nhưng điều này không hiệu quả. –
Khi tôi thử nó cho một cửa sổ xlib, nó hoạt động (ngay cả yêu cầu mà bạn có thể nhấp vào "X" để đóng một cửa sổ bên dưới là hoàn thành). –
Bạn cần triển khai trình quản lý cửa sổ nhỏ sẽ lắng nghe tất cả các sự kiện trên nguyên mẫu gốc mặc định bằng XSelectInput.
Sau đó, thực hiện bỏ phiếu trên fd = connectionNội dung (hiển thị).
Bất cứ khi nào bạn nhận được sự kiện. Kiểm tra xem đây có phải là sự kiện chuột hay không, nó sẽ cung cấp cho bạn x, y. Bạn có thể tìm thấy cửa sổ chính xác bằng cách đi qua ngăn xếp cửa sổ.
Sau đó, sử dụng XGrabPinter để báo cáo sự kiện cho cửa sổ bên dưới.
Vì vậy, tôi sẽ sử dụng XQueryTree để lấy id của cửa sổ rồi XGetWindowAttributes và kiểm tra chồng chéo, nếu có một vòng tôi gửi sự kiện chuột đến cửa sổ đó? Ngoài ra làm cách nào để gửi hoặc chuyển sự kiện chuột đến cửa sổ? – Corey
Tôi không chắc chắn 100% nhưng 'XSendEvent' sẽ hoạt động cho điều đó. – bikram990
Hãy xem xét điều này 'http://stackoverflow.com/questions/14656615/xlib-xsendevent-click-event-do-not-work-inside-of-some-windows-on-ubuntu-12-04 ? rq = 1 'và điều này cũng' http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html ' – bikram990