2010-04-15 22 views
13

Bất cứ ai có thể cho tôi biết cách móc/che phủ một trò chơi DirectX trong C#?Hook/Overlay một trò chơi DirectX?

Tôi đã cố gắng nhận được một cửa sổ C# toàn màn hình để chồng chéo một trò chơi, tuy nhiên nó sẽ không. Sau khi nghiên cứu một chút, tôi phát hiện ra rằng tôi cần phải móc trò chơi và sau đó hiển thị cửa sổ C#.

Có ai có thể giải thích cách tôi sẽ làm điều này không? Tôi có thể hiển thị biểu mẫu C# qua trò chơi DirectX không?

+0

Bất kỳ ai? Nếu có ai nhìn thấy lớp phủ Steam hoặc xFire, tôi muốn nó như thế. Người dùng có thể lướt net trong khi chơi trò chơi, vv –

Trả lời

5

(tiết lộ: tôi làm việc cho công ty này)

bạn có thể thửcủa chúng tôi, nó có chức năng để móc các đối tượng COM từ C#. Đó là tập hợp các đối tượng COM có thể được sử dụng từ bất kỳ ngôn ngữ lập trình nào (hỗ trợ COM). Bài viết có mã nguồn hiển thị cách quay video và thêm lớp phủ có sẵn: instrumenting Direct3D applications to capture video and calculate FPS

Direct Sound Capture là hai ví dụ thực hiện bàn điều khiển để gắn các đối tượng COM như DirectX.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn. Tôi đã áp dụng cho nó.Bạn có thể giải thích làm thế nào tôi có thể nhận được API Deviare để móc một trò chơi trực tiếp, và hiển thị một cái gì đó? Cảm ơn một lần nữa. –

+1

Bạn có thể đặt câu hỏi trong các diễn đàn liên quan ở đó. Đề xuất của tôi là sử dụng các bài viết như là một điểm khởi đầu. –

+1

Điều đó không giải quyết được vấn đề cho người khác. Vui lòng mô tả giải pháp là gì. –

2

Vì bạn không có DirectX Access trực tiếp từ C#, điều này có thể phức tạp.

Từ sự hiểu biết hạn chế của tôi về khái niệm:

DirectX Móc bao gồm gắn với một bối cảnh DirectX và thao tác nó, điều này có thể/không thể đòi hỏi rối tung với bộ nhớ của một chương trình khác, một cái gì đó là phù hợp nhất với C/C++

tôi có thể sai tuy nhiên, tuy nhiên đây là một chủ đề nâng cao và ruột của tôi nói với tôi bạn có thể có vấn đề thuộc NET

+0

Làm thế nào về làm hooking với C + +, và sau đó chạy chương trình C# từ bên trong móc? Điều đó sẽ không làm cho chương trình C# hiển thị, hay nó không hoạt động như thế? –

+0

Không, bạn không thể hiển thị chương trình C# trong C++ không được quản lý như thế. Một gợi ý chung là sử dụng C++/CLI cho một trình bao bọc C++ được quản lý/không được quản lý nửa giao tiếp với DirectX nhưng cũng một nửa của một thư viện "được quản lý" mà C# có thể gọi trực tiếp. Nhưng có vẻ xấu xí. Spazzarrama (Justin S. ^) là ví dụ về hooking và overlaying hoạt động hoàn hảo và là một nguồn tài nguyên vô giá. – Jason

16

Bạn có thể thử my example on hooking the Direct3D 9 API using C#. Điều này sử dụng EasyHook một assembly .NET mã nguồn mở cho phép bạn cài đặt hook từ mã được quản lý vào các hàm không được quản lý.

SlimDX cũng được sử dụng - đây là một trình bao bọc được quản lý nguồn mở xung quanh thư viện Direct3D.

Phần khó khăn của hooking là xác định địa chỉ của các hàm ảo của đối tượng COM. Điều này được thực hiện trong ví dụ trên bằng cách sử dụng một DLL trợ giúp C++ nhỏ để tìm các địa chỉ từ VTable. [Cập nhật: có một bình luận được đăng tải rằng cách hiển thị cách nhận các con trỏ hàm từ VTable trong C# cũng được cung cấp một IntPtr cho đối tượng com]

Ví dụ này móc phương thức EndScene của IDirect3DDevice9, cũng là nơi bạn muốn vẽ bất kỳ lớp phủ nào. Như để hiển thị một hình thức trong lớp phủ Tôi không chắc chắn rằng sẽ dễ dàng như vậy - Tôi có nghĩa là bạn có thể làm cho hình ảnh dễ dàng đủ, nhưng bạn sẽ phải nắm bắt đầu vào và trả lời bằng tay/chuyển qua các sự kiện vào biểu mẫu câu hỏi một cách thích hợp. Chúc may mắn!

+1

Đây là phiên bản cập nhật có ví dụ Lớp phủ rất đơn giản - cũng 100% C#: [Direct3D 9 , 10 lớp phủ] (http://spazzarama.wordpress.com/2011/03/14/c-screen-capture-and-overlays-for-direct3d-9-10-and-11-using-api-hooks/) –

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