2011-12-31 51 views
6

Tôi đang làm việc trên phần mềm của riêng mình để vận hành chuột trên máy tính của tôi bằng cách sử dụng C# và kinect SDK. Tôi thực sự muốn thử sử dụng nó để chơi một trò chơi như Red Alert, hoặc một số loại RTS, hoặc thậm chí chỉ để điều hướng chung.Mô phỏng chuột trong một chương trình khác

Sự cố mà tôi thấy là khi sử dụng chương trình có chuột khác, như cảnh báo màu đỏ hoặc đi vào máy ảo nơi tích hợp chuột không được hỗ trợ, chương trình sẽ không nhận cuộc gọi Chương trình C# đang thực hiện các cuộc gọi System.Windows.Forms.Cursor, hãy để một mình các cuộc gọi mouse_event. Tôi mới để giao tiếp với các cửa sổ và những gì đang xảy ra ở đây, ai đó có thể giải thích/đặt ra một giải pháp?

--UPDATE-- Là bản cập nhật, tôi vẫn chưa hoàn toàn chắc chắn điều gì đang xảy ra, nhưng dường như tôi đã tìm thấy giải pháp cho cảnh báo màu đỏ nói riêng;

Vì cảnh báo màu đỏ là một chương trình đồ họa khá thấp nên việc chạy nó trong máy ảo dành riêng cho tôi, máy trạm vmware với máy khách XP là điều không quan trọng. Nếu bạn sử dụng mã mouse_event nó hoạt động tốt, BAO GIỜ, một cái gì đó mà tôi phải vật lộn với việc tìm kiếm mã chính xác để biểu diễn chuyển động của chuột. Dường như cờ MOVE di chuyển chuột tương đối, mà tôi không muốn, và thẻ tuyệt đối không di chuyển chuột. Đó là, trên thực tế, OR trong số họ sản xuất phong trào tuyệt đối trên màn hình, do đó, mã của tôi cho di chuyển chuột và thi đua nhấn kết thúc tìm kiếm như thế này:

mouse_event((int)0x00000002, cursor.X, cursor.Y, 0, 0); 

cho cách nhấn và

mouse_event((int)(0x00000001 | 0x00008000), x, y, 0 0); 

cho di chuyển chuột, trong đó x và y là tọa độ mới trong số 65535 (phạm vi tuyệt đối). Nó có hoàn hảo không? Nah. Nhưng nó hoạt động ngay bây giờ. Tôi nghĩ rằng có một cái gì đó để làm với các cửa sổ cách bỏ qua các chương trình nhất định khi nó chạy ra, có lẽ vì chế độ tương thích? Tôi không có một trò chơi khác để kiểm tra nó ngay bây giờ, nhưng tôi sẽ đăng kết quả bằng một chế độ không tương thích trong tương lai.

  • Pete

(Nó sẽ không cho phép tôi gửi như một câu trả lời cho hai giờ khác và tôi phải ngủ để bắt một chuyến bay vào buổi sáng!)

+0

Tôi khuyên bạn nên sử dụng chức năng 'SendInput' trên chức năng' mouse_event' không dùng nữa. –

Trả lời

1

Bạn sẽ phải thực hiện một số thông báo cửa sổ ở mức độ thấp để làm việc này hoạt động bình thường. Các trò chơi sử dụng DirectX như Red Alert sẽ không nhìn vào System.Windows.Forms.Cursor. Bạn sẽ cần phải giao diện với Windows User32.dll để gửi các thông điệp thích hợp đến các cửa sổ để nó có thể định tuyến chúng một cách thích hợp cho các ứng dụng khác.

Dưới đây là một số mã để giúp bạn bắt đầu nhìn vào để gửi tin nhắn qua User32 DLL trong C#:

[DllImport("USER32.DLL")] 
    public static extern IntPtr FindWindow(string lpClassName, 
     string lpWindowName); 

    // Activate an application window. 
    [DllImport("USER32.DLL")] 
    public static extern bool SetForegroundWindow(IntPtr hWnd); 

    [DllImport("user32.dll")] 
    private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

Tôi hy vọng điều này giúp bạn bắt đầu, nhưng tôi không có thời gian để đi qua mỗi thông điệp chuột, những gì wParam và lParam là, và những gì Msg nên cho mỗi. Tôi chắc chắn nếu bạn tìm kiếm xung quanh bạn có thể tìm thấy các tin nhắn cụ thể để gửi cho mỗi sự kiện như di chuyển chuột, nhấp chuột trái và nhấp chuột phải.

Chúc may mắn.

+1

Thực tế, trò chơi sử dụng DirectX cũng sẽ không sử dụng GetMessage(), vì vậy SendMessage() rất có thể sẽ không có hiệu lực. Bạn cần công cụ cấp thấp hơn. Các công cụ cấp thấp nhất mà tôi biết là mouse_event(). –

+0

Ngay bây giờ tôi có một chút gì đó hacky một nửa hoạt động. Tôi đang sử dụng một mouse_event() để kích chuột và tôi cũng đang cố gắng sử dụng SetCursorPos() để di chuyển chuột. Có lẽ tôi đang thiếu một vẽ lại hoặc một cái gì đó? Nhưng khi mouse_event được gọi là nó hoạt động đúng và vẽ lại chuột ở nơi cần (và nhấp chuột), nhưng SetCursorPos() thì không. Mã hiện tại: '[DllImport ("user32.dll", EntryPoint = "SetCursorPos")] [trở lại: MarshalAs (UnmanagedType.Bool)] SetCursorPos extern bool tĩnh tư nhân (int x, int y);' –

+0

Tôi cũng nên đề cập đến rằng mouse_events() dường như không hoạt động chút nào trong máy bình thường, cách duy nhất tôi thậm chí nhận được phản hồi từ mouse_event là thử chạy nó trên máy ảo (tôi nghĩ rằng có thể nếu tôi có tất cả các đầu vào chạy qua ý tưởng ảo là một nguồn mà nó có thể hoạt động). –

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