2009-05-29 44 views
36

Tôi muốn hiển thị một số đồ họa tùy chỉnh trên ứng dụng Windows toàn màn hình của bên thứ 3.Lớp phủ trên ứng dụng toàn màn hình 3D

Bạn đã chơi bất kỳ trò chơi Steam nào chưa? Nó có một file thực thi, GameOverlayUI.exe cho phép bạn truy cập các cửa sổ Steam từ bên trong một game. (Các phần tử GUI trông được vẽ tùy chỉnh, tôi không biết liệu đó có phải là điều cần thiết hay không, nhưng chúng trông giống hệt nhau bên trong một trò chơi khi chúng thực hiện trên màn hình.) Nó thậm chí còn đi xa đến mức 'mờ' đồ họa trò chơi trong bối cảnh.

Tôi tự hỏi làm thế nào người ta có thể viết về một ứng dụng như vậy.

Tôi cũng tự hỏi phạm vi giải pháp sẽ rộng bao nhiêu. Bạn có thể sử dụng một phương pháp cho tất cả các ứng dụng OpenGL không? Đối với tất cả các ứng dụng Direct3D trừ DirectDraw? Đối với tất cả các ứng dụng Windows toàn màn hình?

Tôi đang tìm các giải pháp 'hiện đại' và chung chung hơn - che dấu nhắc lệnh hoặc ứng dụng màu được lập chỉ mục 320x240 không phải là mối quan tâm.

Chỉnh sửa: Một số làm rõ: Ứng dụng toàn màn hình không phải của tôi. Nó có thể là bất cứ thứ gì. Có lẽ, nó sẽ là một game 3D. Tôi muốn hiển thị, nói một đồng hồ kỹ thuật số ở góc dưới bên phải của màn hình, trên đầu trang của đồ họa trò chơi. Tôi muốn tránh các thủ thuật như tiêm mã hoặc gỡ lỗi quá trình, nếu có thể.

+0

Bạn đã quản lý cách tiếp cận như thế nào. Tôi đang mắc kẹt trong một tình huống tương tự và tôi muốn vẽ chromium nhúng webviews như lớp phủ. Bạn có nghĩ rằng đó là có thể? – alDiablo

Trả lời

18

Vâng, đây là một ví dụ khác.Xfire là một chương trình trò chuyện xếp chồng giao diện của nó vào trò chơi để bạn có thể nhận tin nhắn trong khi chơi. Cách họ làm điều này là bằng cách chỉnh sửa d3d/opengl DLL ở cấp độ bộ nhớ quá trình, giống như tiêm các bước nhảy lắp ráp. Tôi biết điều này bởi vì phương pháp của họ đã gây ra mod của tôi để sụp đổ, và tôi thực sự thấy mã lắp ráp kỳ lạ mà họ đã tiêm vào d3d9.dll.

Vì vậy, dưới đây là cách thực hiện điều này Xfire:

  1. mục tiêu quá trình của trò chơi
  2. tìm kiếm bộ nhớ xử lý cho d3d.dll/opengl.dll
  3. tiêm vào quá trình này một DLL có chứa các tùy chỉnh giao diện logic
  4. kết nối các chức năng của giao diện với luồng chương trình bằng cách viết các bước lắp ráp theo cách thủ công trong các hàm d3d/opengl được tìm thấy trong bộ nhớ quá trình

Không có cách nào khác có thể hiểu được vì bạn cần chiếm đoạt thiết bị đồ họa thuộc về trò chơi đó. Tôi sẵn sàng đặt cược rằng Steam cũng giống như Xfire. Vì vậy, vâng, không có cách dễ dàng để làm điều này, trừ khi ai đó tạo ra một thư viện hữu ích để làm mọi thứ bạn cần làm ở cấp độ thấp.

Bạn cũng được hỏi về làm mờ đồ họa trò chơi trong lớp phủ của bạn. Đây chỉ là một cuộc gọi đơn giản DrawPrimitive để vẽ hình chữ nhật trong suốt trên màn hình.

+0

tuyệt vời. Cùng với câu trả lời khác của bạn, đây là những gì tôi đã tìm kiếm. Cảm ơn. – aib

+9

Hãy cẩn thận khi làm điều này với nhiều trò chơi yêu cầu phần mềm chống gian lận như Punkbuster! Việc tiêm các thư viện tùy chỉnh vào các trò chơi đang chạy được coi là thao tác trò chơi xâm nhập và gian lận. Các chương trình (như Xfire, Lớp phủ Teamspeak, ...) được liệt kê màu trắng và sẽ không gây ra vi phạm gian lận nữa nhưng đó là quy trình học được thực hiện bởi Anti-Cheat-Vendor, có thể tốn thời gian khi chương trình của bạn không thể sử dụng hiệu quả. – Robert

-1

Tôi đã thực hiện lớp phủ với cả hai chế độ xem DirectX & WPF (cùng một điều, thực sự), sử dụng lớp phủ để vẽ một số nội dung 2D GDI + đẹp mắt trên hình ảnh 3D.

Tôi đã quản lý bằng cách sử dụng bảng điều khiển phía trên hình ảnh "thực tế", đặt màu thành trong suốt trừ các bit tôi muốn phủ lên. Làm việc khá tốt, nhưng nó hơi khó chịu khi nhấp chuột, kéo và các sự kiện khác thông qua lớp "vẽ" để điều khiển 3D.

+0

Tôi xin lỗi nếu câu hỏi của tôi không rõ ràng: Hình ảnh "thực tế" được vẽ bởi ứng dụng của bên thứ 3, trong trường hợp của tôi. Tôi đã làm những gì bạn nói, một lần, trong bối cảnh của một ứng dụng duy nhất. Tôi không biết câu trả lời của bạn có liên quan trong bối cảnh của hai ứng dụng khác nhau hay không; nếu có, làm thế nào tôi sẽ đi về việc tạo ra một bảng con trong bối cảnh của cha mẹ toàn màn hình? – aib

18

Tạo một Gist với mã đầy đủ here

Đây là một nghệ thuật khá bí truyền, và có một số cách để làm điều này. Tôi thích cái gọi là Wrapper Direct3D. Đã nhiều năm kể từ khi tôi làm điều này, nhưng tôi đã làm điều đó với một trò chơi một lần. Tôi có thể đã để lại một số chi tiết, nhưng tôi chỉ hy vọng để minh họa cho ý tưởng.

Tất cả các trò chơi Direct3D9 cần gọi IDirect3DDevice9::EndScene sau khi màn hình kết thúc và sẵn sàng để vẽ. Vì vậy, về mặt lý thuyết, chúng ta có thể đặt mã tùy chỉnh bên trong EndScene để rút ra những gì chúng ta muốn trong trò chơi. Chúng tôi làm điều này bằng cách tạo một lớp giống như IDirect3DDevice9 cho trò chơi, nhưng nó thực sự chỉ là một trình bao bọc để chuyển tiếp tất cả các cuộc gọi hàm tới lớp thực. Vì vậy, bây giờ, trong lớp tùy chỉnh của chúng tôi, chức năng bao bọc của chúng tôi cho EndScene trông như thế này:

HRESULT IDirect3DDevice9::EndScene() 
{ 
    // draw overlays here 

    realDevice.EndScene(); 
} 

Sau đó, chúng tôi biên dịch nó thành một DLL gọi d3d9.dll, và thả nó trong thư mục trò chơi thực thi của. Các d3d9.dll thực sự nên nằm trong thư mục/system32, nhưng trò chơi đầu tiên sẽ tìm trong thư mục hiện tại, và thay vào đó tải chúng ta. Khi trò chơi tải, nó sử dụng DLL của chúng tôi để tạo một thể hiện của lớp trình bao bọc của chúng tôi. Và giờ mỗi lần gọi EndScene, mã của chúng tôi được thực thi để vẽ những gì chúng tôi muốn trên màn hình.

Tôi nghĩ bạn có thể thử nguyên tắc tương tự với OpenGL. Nhưng để ngăn chặn giả mạo, tôi nghĩ rằng một số trò chơi hiện đại cố gắng ngăn chặn điều này.

+0

Gói DLL là một kỹ thuật tốt mà tôi đã thực hiện trong quá khứ; cảm ơn các con trỏ D3D. Tuy nhiên, tôi nghĩ Steam có cách làm tốt hơn. Tôi đoán tôi nên làm một số nghiên cứu thêm. – aib

+1

Bạn có thể vui lòng chỉ cho tôi hướng tới tài nguyên cho người mới bắt đầu không? Ý tưởng của tôi cho một mod trò chơi là áp dụng hiệu ứng đổ bóng nhất định trong các tình huống nhất định, và điều này dường như là cách để làm điều đó. Tuy nhiên, tôi chưa từng thực hiện bất kỳ chương trình nào với DirectX, vì vậy tôi đang ở trong bóng tối như nơi bắt đầu. –

0

Tôi đã suy nghĩ về điều này. Đối với OpenGL, tôi muốn nối SwapBuffers của WGL với Detours, vẽ nội dung của tôi sau trận đấu và sau đó trao đổi bộ đệm cho chính tôi.

2

có dự án phần mềm miễn phí tên của nó là taksi link text. Tôi không chắc chắn làm thế nào ứng dụng này ghi đè lên quá trình gây ra tôi đang kiểm tra mã nhưng nhưng checkit tôi nghĩ rằng đây là một dự án tốt

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