2011-12-31 16 views
6

Pracuję nad własnym oprogramowaniem do obsługi myszy na moim komputerze przy użyciu C# i SDK kinect. Naprawdę chcę spróbować użyć go do grania w grę taką jak Red Alert lub jakiś rodzaj RTS, a nawet tylko do ogólnej nawigacji.Emulacja myszy w innym programie

Problem, który znalazłem, polega na tym, że podczas korzystania z programu za pomocą innej myszy, np. Czerwonego alertu lub wchodzenia na maszynę wirtualną, gdzie integracja myszy nie jest obsługiwana, program nie odbierze połączeń, które Program C# wykonuje wywołania System.Windows.Forms.Cursor, nie mówiąc już o wywołaniach mouse_event. Jestem nowy w kontaktach z oknami i tym, co się tutaj dzieje, czy ktoś może wytłumaczyć/postawić rozwiązanie?

--UPDATE-- Jako aktualizacja wciąż nie jestem do końca pewny, co się dzieje, ale wydaje mi się, że znalazłem obejście dla czerwonego alertu w szczególności;

Ponieważ czerwony alert to dość niski program graficzny, trywialne jest uruchamianie go w maszynie wirtualnej specjalnie dla mnie, vmware workstation z klientem XP. Jeśli użyjesz kodu mouse_event, to działa dobrze, JEDNAK, coś, z czym walczyłem, znajdował poprawny kod reprezentujący ruch myszy. Wydawałoby się, że flaga MOVE porusza myszą względnie, czego nie chciałem, a tag absolutny w ogóle nie poruszał myszą. To jest, w rzeczywistości, OR z nich, która produkuje absolutny ruch na ekranie, więc mój kod do ruchu myszy i emulacja klikając skończyło się patrząc tak:

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

za kliknięcie i

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

dla ruchu myszy, gdzie x i y są nowymi współrzędnymi z 65535 (zakres bezwzględny). Czy to jest idealne? Nah. Ale działa na razie. Myślę, że jest coś do zrobienia w sposobie, w jaki okna ignorują niektóre programy podczas uruchamiania, być może z powodu trybu zgodności? Nie mam innej gry, aby przetestować ją teraz, ale w przyszłości opublikuję wyniki w trybie niezgodności.

  • Pete

(on nie pozwolił mi pisać jako odpowiedź na kolejne dwie godziny i muszę spać złapać lot w godzinach porannych!)

+0

Polecam użycie funkcji 'SendInput' zamiast funkcji przestarzałej' mouse_event'. –

Odpowiedz

1

Trzeba będzie wykonaj niektóre komunikaty systemu Windows o niskim poziomie, aby to działało poprawnie. Gry korzystające z DirectX, takie jak Red Alert, nie będą w ogóle patrzeć na System.Windows.Forms.Cursor. Będziesz musiał połączyć się z Windows User32.dll, aby wysłać odpowiednie komunikaty do Windows, aby mógł je odpowiednio skierować do innych aplikacji.

Oto kod, aby zacząć patrząc w celu wysyłania wiadomości przez user32 DLL w 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); 

Mam nadzieję, że zostanie uruchomiony, ale nie mają czasu, aby przejść przez każdy myszą, czym są wParam i lParam i czym powinien być Msg dla każdego. Jestem pewien, że po wyszukiwaniu można znaleźć konkretne wiadomości do wysłania dla każdego zdarzenia, takie jak ruch myszy, kliknięcie lewym przyciskiem i kliknięcie prawym przyciskiem myszy.

Powodzenia.

+1

W rzeczywistości gra korzystająca z DirectX również nie używa funkcji GetMessage(), więc SendMessage() najprawdopodobniej nie przyniesie efektu. Potrzebujesz jeszcze rzeczy na niższym poziomie. Najniższy poziom rzeczy, które znam to mouse_event(). –

+0

W tej chwili mam coś nieco hacky, że połowa działa. Używam mouse_event(), aby kliknąć myszką, a także próbuję użyć SetCursorPos(), aby przesunąć mysz. Może brakuje mi przerysowania czy czegoś takiego? Ale kiedy wywoływana jest mouse_event, działa poprawnie i przerysowuje mysz tam, gdzie powinna (i klika), ale SetCursorPos() nie. aktualny kod: '[dllimport ("USER32.DLL", punkty początkowe = "SetCursorPos")] [powrotu: MarshalAs (UnmanagedType.Bool)] prywatne statyczne SetCursorPos zewnętrzny bool (Int x int y); ' –

+0

Powinienem też wspomnieć, że mouse_events() nie działają w ogóle w normalnej maszynie, jedyny sposób, w jaki otrzymałem jakąkolwiek odpowiedź od mouse_event, to spróbować uruchomić go na wirtualnej maszynie (myślałem, że może gdybym dostał wszystkie dane wejściowe przebiegające przez to, co wirtualna myśl stanowiło jedno źródło, które może działać). –

Powiązane problemy