2011-12-31 13 views
6

Sto lavorando al mio software per azionare il mouse sul mio computer usando C# e l'SDK kinect. Voglio davvero provare a usarlo per giocare a un gioco come Red Alert, o una sorta di RTS, o anche solo per la navigazione generale.Emulazione del mouse in un altro programma

Il problema che ho riscontrato è che quando si utilizza un programma con un mouse diverso, come un avviso rosso o una macchina virtuale in cui l'integrazione del mouse non è supportata, il programma non rileverà le chiamate che il Il programma C# sta effettuando le chiamate System.Windows.Forms.Cursor, per non parlare delle chiamate mouse_event. Sono nuovo nell'interfacciamento con Windows e cosa sta succedendo qui, qualcuno può spiegare/proporre una soluzione?

--UPDATE-- Come aggiornamento, non sono ancora del tutto sicuro di quello che sta succedendo, ma mi sembra di aver trovato una soluzione alternativa per l'allarme rosso in particolare;

Poiché l'allarme rosso è un programma di grafica piuttosto basso, è banale eseguirlo all'interno di una macchina virtuale appositamente per me, workstation VMware con un client XP. Se si utilizza il codice mouse_event funziona bene, TUTTAVIA, qualcosa con cui ho avuto difficoltà è stato trovare il codice corretto per rappresentare il movimento del mouse. Sembrerebbe che il flag MOVE muova il mouse relativamente, cosa che non volevo, e il tag assoluto non ha spostato il mouse. E ', infatti, il o di loro che produce il movimento assoluta sullo schermo, quindi il mio codice per il movimento del mouse e l'emulazione cliccando finito per assomigliare a questo:

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

per clic e

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

per il movimento del mouse, dove xey sono le nuove coordinate su 65535 (il range assoluto). È perfetto? Nah. Ma funziona per ora. Penso che ci sia qualcosa a che fare con il modo in cui Windows ignora determinati programmi quando viene eseguito ra, forse a causa della modalità di compatibilità? Non ho un altro gioco con cui testarlo adesso, ma pubblicherò i risultati con una modalità di non compatibilità in futuro.

  • Pete

(Sarebbe non farmi postare come una risposta per altre due ore e devo dormire per prendere un volo di mattina!)

+0

Si consiglia di utilizzare la funzione 'SendInput' sulla funzione deprecata' mouse_event'. –

risposta

1

Si dovrà fai alcuni messaggi di basso livello per far funzionare correttamente questo. I giochi che utilizzano DirectX come Red Alert non guardano affatto System.Windows.Forms.Cursor. Sarà necessario interfacciarsi con Windows User32.dll per inviare i messaggi appropriati a Windows in modo che possa indirizzarli in modo appropriato alle altre applicazioni.

Ecco il codice per iniziare alla ricerca per l'invio di messaggi tramite l'User32 DLL in 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); 

Spero che questa è una buona partenza, ma non hanno il tempo di passare attraverso ogni messaggio del mouse, quali sono wParam e lParam e quale dovrebbe essere il messaggio per ciascuno. Sono sicuro che se cerchi nei dintorni puoi trovare i messaggi specifici da inviare per ogni evento, come il movimento del mouse, il clic sinistro e il tasto destro del mouse.

Buona fortuna.

+1

In realtà, un gioco che utilizza DirectX non utilizza neanche GetMessage(), quindi SendMessage() molto probabilmente non avrà alcun effetto. Hai bisogno di cose di livello inferiore. Il materiale di livello più basso che conosco è mouse_event(). –

+0

In questo momento ho qualcosa di un po 'hacky che funziona a metà. Sto usando un mouse_event() per fare comunque clic del mouse e sto anche provando a usare SetCursorPos() per spostare il mouse. Forse mi manca un ridisegno o qualcosa del genere? Ma quando viene chiamato il mouse_event funziona correttamente e ridisegna il mouse dove dovrebbe (e fa clic), ma SetCursorPos() no. Codice attuale: '[DllImport ("user32.dll", EntryPoint = "SetCursorPos")] [ di ritorno: MarshalAs (UnmanagedType.Bool)] SetCursorPos extern static bool privati ​​(int x, int y);' –

+0

Dovrei anche menzionare che mouse_events() non sembra funzionare affatto nella macchina normale, l'unico modo in cui ho ricevuto risposta da mouse_event è provare a eseguirlo su una macchina virtuale (ho pensato che forse se avessi ottenuto tutti gli input che attraversano ciò che il pensiero virtuale era una fonte potrebbe funzionare). –

Problemi correlati