2015-08-16 34 views
9

Tôi đang xây dựng ứng dụng máy tính để bàn Win7/8/10 x64 Direct3D11 cho phép người dùng chuyển đổi giữa chế độ cửa sổ và chế độ toàn màn hình. , không chỉ là cửa sổ tối đa *). Trên một thiết lập màn hình kép tôi đang gặp phải một số vấn đề.Chế độ toàn màn hình trên màn hình A trong quá trình thiết lập màn hình kép Khi di chuyển các cửa sổ từ màn hình B sang

Bản thân công tắc được thực hiện thủ công bằng cách sử dụng IDXGISwapChain::SetFullscreenState và hoạt động như dự định: Màn hình chứa phần của cửa sổ sư tử (gọi là màn hình A) đi vào chế độ toàn màn hình chuyên dụng trong khi rời khỏi màn hình kia (màn hình B) cho phép người dùng tương tác bình thường với các cửa sổ trên B cũng như ứng dụng toàn màn hình trên A.

Tuy nhiên, nếu cửa sổ trên B bị kéo hoặc đổi kích thước để nó chuyển sang A, trạng thái toàn màn hình của ứng dụng sẽ bị quấy rầy : Đôi khi nó chỉ trở lại chế độ cửa sổ (để biến theo dõi nội bộ của ứng dụng không đồng bộ), đôi khi nó vẫn ở chế độ toàn màn hình gần như có vẻ như từ chối các công tắc chế độ tiếp tục, v.v. Điều tương tự cũng xảy ra nếu cửa sổ chồng lên cả A và B trước khi ứng dụng chuyển sang chế độ toàn màn hình được lấy nét.

Có cách nào để ngăn chặn điều này không?

Tôi muốn hệ điều hành sẽ tôn trọng chế độ toàn màn hình chuyên dụng của ứng dụng và giữ ở trạng thái mạnh mẽ ngay cả khi các cửa sổ khác được kéo vào màn hình đó. Tôi muốn hành vi tương tự như có một "cửa sổ không biên giới luôn ở trên cùng, tối đa trên cùng", tức là có các cửa sổ khác "biến mất sau" và không ảnh hưởng đến trạng thái cửa sổ toàn màn hình của tôi.

Tôi đã thử một số cách giải quyết, như ứng phó với WM_KILLFOCUS và tạm thời chuyển đổi ứng dụng của tôi thành một "cửa sổ maximixed không biên giới" cho đến khi nó nhận được WM_SETFOCUS một lần nữa, nhưng thông điệp WM_KILLFOCUS có độ trễ trong thời gian đó còn thời gian cho một người dùng để kéo khác cửa sổ vào khu vực mà sau đó vẫn còn trong chế độ toàn màn hình, do đó đặt tôi trở lại một hình vuông.


* Lý do tôi muốn tính năng này chứ không phải chỉ đơn giản là sử dụng một cửa sổ viền tối đa hóa (mà cũng là một chế độ hỗ trợ, btw) đã làm với nó cho phép thấp hơn nhiều độ trễ chuột phong trào-to-rendering, kiểm soát vsync (ON/OFF) vv .. tất cả đều - trong ngắn hạn - quan trọng đối với bản chất của ứng dụng này (không phải là một trò chơi).

Trả lời

2

Mặc dù không lý tưởng (lý tưởng sẽ là có cách để chính hệ điều hành xử lý đúng cách), tôi đã tìm được cách giải quyết hợp lý mà tôi cho rằng bây giờ tôi có thể sống. Nó là một biến thể của khái niệm được đề cập trong câu hỏi ("..như trả lời WM_KILLFOCUS và tạm thời chuyển ứng dụng của tôi thành cửa sổ không biên giới tối đa .."), nhưng không có sự cố trì hoãn làm tê liệt:

Bất cứ khi nào ứng dụng nhập riêng chế độ toàn màn hình, nó cũng chụp chuột với một cuộc gọi đến SetCapture. Điều này sẽ không ảnh hưởng đến khả năng tương tác của người dùng với các cửa sổ khác trên màn hình B, nhưng sẽ đảm bảo rằng mọi tương tác/kích hoạt tương tự - như nhấp chuột trong ứng dụng khác - sẽ gửi WM_LBUTTONDOWN tới ứng dụng của tôi trước tiêu điểm. Quan trọng hơn, điều này xảy ra ngay lập tức, không giống như thông báo WM_KILLFOCUS có độ trễ đáng kể.

Khi nhận được thông báo WM_LBUTTONDOWN (trong khi ở chế độ toàn màn hình), ứng dụng sẽ kiểm tra xem nhấp chuột có xảy ra bên ngoài vùng màn hình hay không. Nếu vậy, nó có nghĩa là nó sắp mất tập trung và do đó phơi bày chính nó cho tất cả các biến chứng được đưa ra trong câu hỏi ban đầu. Vì vậy, nó tạm thời thoát khỏi chế độ toàn màn hình chuyên dụng và "thay thế" nó bằng cửa sổ tối đa không có đường viền (trực quan). Khi ứng dụng lấy lại tiêu điểm, ứng dụng sẽ quay trở lại chế độ toàn màn hình chuyên dụng.

Điều này hoạt động OK, vì bạn không thực sự quan tâm đến khả năng phản hồi của ứng dụng khi bạn chưa tương tác với ứng dụng. Sự bất tiện lớn nhất ở đây là chuyển đổi chế độ nhấp nháy xảy ra trên các chuyển tập trung này, nhưng với các lựa chọn thay thế, tôi thấy nó là một mức giá chấp nhận được để trả cho những gì tôi muốn hoàn thành (nhưng bằng mọi cách - tôi muốn là rất quan tâm đến một giải pháp tốt hơn).


Sửa 1: Điều đáng chú ý là kể từ khi có những cách khác cho một ứng dụng mất tập trung hơn thông qua cú click chuột, WM_KILLFOCUScũng xử lý.


Chỉnh sửa 2: Gần đây tôi đã nhận ra rằng việc xử lý thông báo WM_BUTTONDOWN là không cần thiết. SetCapture một mình sẽ đảm bảo rằng thông báo WM_KILLFOCUS được nhận đủ nhanh.

Các vấn đề liên quan