2011-12-31 16 views
6

Bilgisayarımdaki fareyi C# ve kinect SDK kullanarak çalıştırmak için kendi yazılımım üzerinde çalışıyorum. Red Alert veya bir çeşit RTS, hatta sadece genel navigasyon gibi bir oyunu oynamak için kullanmayı denemek istiyorum.Farklı bir programda fare emülasyonu

Bulduğum sorun, farklı bir fare ile bir programı kullanırken, kırmızı uyarı gibi veya fare entegrasyonunun desteklenmediği bir sanal makineye giderken programın çağrıları almamasıdır. C# program, mouse_event çağrıları bırakın System.Windows.Forms.Cursor çağrıları yapıyor. Pencerelerle bağlantı kurmakta yeniyim ve burada neler oluyor, birisi bir çözümü açıklayabilir mi/oluşturabilir mi?

--UPDATE-- Bir güncelleştirme olarak, hala ne olduğundan emin değilim, ancak özellikle kırmızı alarm için bir geçici çözüm bulmuş gibi görünüyor;

Kırmızı alarm oldukça düşük bir grafik programı olduğundan, özellikle bir sanal makinede, bir XP istemcisiyle vmware iş istasyonunda çalıştırmak çok önemsiz. Mouse_event kodunu kullanırsanız iyi çalışır, HOWEVER, uğraştığım bir şey fare hareketini temsil etmek için doğru kodu bulmaktı. MOVE bayrağı, istemediğim nispeten fareyi hareket ettiriyormuş gibi görünüyor ve mutlak etiket, fareyi hiç hareket ettirmiyordu. Bu, aslında, bunlardan VEYA ekranda mutlak hareketini üretir ki, bu yüzden benim fare hareketi için kod ve tıklayarak emülasyon bu gibi bakarak sona erdi: tıklayarak için

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

ve

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

Fare hareketi için, x ve y, 65535'in (mutlak aralık) yeni koordinatlarıdır. Mükemmel mi? Hayır. Ama şimdilik çalışıyor. Sanırım, windows ra uyumluluğunda belirli programların yok sayılmasıyla ilgili bir şey var, belki uyumluluk modu yüzünden? Şu anda test etmek için başka bir oyunum yok, ancak gelecekte uyumsuz bir mod ile sonuç göndereceğim.

  • Pete

(Bu beni iki saat cevap olarak göndermek izin vermedi ve ben sabah uçuş yakalamak için uyumak zorunda!)

+0

Kullanımdan kaldırılan 'mouse_event 'işlevi üzerinden' SendInput' işlevini kullanmanızı öneriyorum. –

cevap

1

Sen zorunda kalacak düzgün çalışması için bazı düşük seviyeli windows mesajları yapın. Red Alert gibi DirectX kullanan oyunlar, System.Windows.Forms.Cursor'a hiç bakmayacaktır. Windows için uygun iletileri göndermek için Windows User32.dll ile aramanız gerekir, böylece diğer uygulamalara uygun şekilde yönlendirebilirsiniz. İşte

C# User32 DLL üzerinden mesaj gönderme için bakarak başlamak için bazı kod şudur: Ben bu başlangıç ​​alır umut

[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); 

ama her geçmesi için zaman yok fare mesajı, wParam ve lParam'ın ne olduğu ve her biri için Msg'nin ne olması gerektiği. Eminim, etrafta arama yaparsanız fare hareketi, sol tıklama ve sağ tıklama gibi her etkinlik için gönderilecek belirli mesajları bulabilirsiniz.

İyi şanslar.

+1

Aslında DirectX kullanan bir oyun, GetMessage() yöntemini kullanmaz, bu nedenle SendMessage() büyük olasılıkla bir etkisi olmaz. Daha düşük seviyedeki şeylere ihtiyacınız var. Bildiğim en düşük düzeydeki şeyler mouse_event(). –

+0

Şu anda bu yarının işe yaradığı bir şey var. Yine de fareyi tıklatmak için mouse_event() kullanıyorum ve ayrıca fareyi taşımak için SetCursorPos() kullanmaya çalışıyorum. Belki bir yeniden çizmeyi mi özledim? Ancak mouse_event çağrıldığında, düzgün çalışır ve fareyi gereken yerde (ve tıklatır) yeniden çizer, ancak SetCursorPos() bunu yapmaz. Mevcut Kodu: '[Dllımport ("user32.dll", GirişNoktası = "SetCursorPos")] [dönüş: MarshalAs (UnmanagedType.Bool)] özel statik Harici BOOL SetCursorPos (int x, int y);' –

+0

Mouse_events'ın() normal makinede hiç işe yaramadığını da belirtmeliyim, mouse_event'ten herhangi bir yanıt almamın tek yolu sanal bir makinede çalıştırmayı denemektir (Sanal düşüncenin çalışabileceği bir kaynak olduğu tüm girdiler işe yarayabilir). –