01/10/2018, 00:42

Hỏi phương pháp nhận biết xem game đang fullscreen hay window khi đã có được object kiểu IDirect3DDevice8

Mình đang vọc hook cái DirectX 8 (bởi cái game mình target chạy bằng DirectX 8), vào đến IDirect3DDevice8 rồi thì kẹt quá, mình không tìm được cách nào để mà xem game có fullscreen hay không? Nếu mà như DirectX 9 thì có method GetSwapChain quá tốt.

Mình biết là có thể so sánh rect của hwnd với kích thước màn hình, nhưng đối với mình, cách đó không đáng tin bởi window có thể bị unfocus.

Quả thực đến bước này mình bí toàn tập, nhờ mọi người giúp đỡ ạ .

明玉 viết 02:56 ngày 01/10/2018

Ai giúp mình với

Phương Trọng Lê viết 02:47 ngày 01/10/2018

Mình chưa bao giờ làm việc với Directx 8 nhưng đọc sơ qua các member function của nó thì thấy có cái này có thể giúp được bạn. surface
Hàm này sẽ Get surface của render target cho bạn, và cái surface này sẽ chứa pixel cuối cùng trong quá trình rendering nên chắc chắn size của nó sẽ bằng với size của screen. Bạn có thể get size của nó về và đối chiếu.

明玉 viết 02:59 ngày 01/10/2018

Mình đã thử, và cái method này luôn trả cho mình size của backbuffer, game mà mình hook có thể có frontbuffer to hơn backbuffer, mà frontbuffer mới là cái hiển thị ra màn hình.

Phương Trọng Lê viết 02:58 ngày 01/10/2018

Mình chưa làm việc với Directx 8 nên cũng không dám khẳng định, nhưng thực sự front buffer cũng chính là back buffer, Directx tồn tại duy nhất 1 front buffer và n back buffer, khi rendering thì directx render lên back buffer sau đó hoán đổi back buffer vừa được render cho front buffer để display, và front buffer lúc này trở thành là back buffer. cho nên có thể tạm khẳng định kích thước back buffer = front buffer

Phương Trọng Lê viết 02:44 ngày 01/10/2018

Ở đây nó cũng cung cấp lun cho bạn function để get front buffer lun này https://msdn.microsoft.com/en-us/library/ms889638.aspx

明玉 viết 02:43 ngày 01/10/2018

Ok cảm ơn bạn, vậy là suốt hồi giờ mình nhầm lẫn
Tuy là chưa có cách chính xác để biết fullscreen hay windowed, nhưng giờ mình có cách thay thế rồi (so sánh kích thước client rect của hwnd với kích thước backbuffer là xong )
Mục tiêu của mình là dùng api ScreenToClient để ánh xạ tọa độ chuột vào tọa độ của game, nhưng do cách render đặc biệt của directx ở Fullscreen nên hàm này chạy không được chính xác. Cái hwnd của game ở windowed mode và fullscreen mode đều là loại có border, ở fullscreen mode thì kích thước hwnd (client rect + border) bằng đúng backbuffer, mà api trên khi chạy thì luôn cộng thêm kích thước border nên con trỏ chuột toàn bị lệch sang phải và dưới.

Bài liên quan
0