2010-12-11 6 views
2

Je veux capturer l'entrée du joystick en utilisant winmm dll .. Je n'ai pas beaucoup de connaissances de l'importation et de travailler avec des DLL.Joystick Key Capture

J'ai essayé de le faire, mais je ne sais pas comment le faire ..

[DllImport("winmm.dll")] 
public static extern string joyGetPosEx(uint dev, JoyinfoEx) //Something Similar 

Comment puis-je obtenir de DLL struct joyinfoEx et le mettre en JoygetPosEx ..? : S

Répondre

3

Comme votre question le suggère, vous devez importer la fonction joyGetPosEx de wimmm.dll. Ceci est souvent appelé P/Invoking parce que vous appelez une fonction à partir d'une API Win32 native (ou DLL "plate-forme"). Vous savez déjà que vous devez utiliser cette fonction, alors regardons-y plus attentivement.

Le documentation pour cette fonction indique qu'il faut deux paramètres:

  • Le premier (uJoyID) est un simple int (ou entier) valeur qui identifie la manette pour être interrogé.

  • Le second (pji) est un peu plus compliqué que le premier, et je pense que c'est la partie avec laquelle vous étiez aux prises. Au lieu d'un type de valeur standard, il s'agit d'une structure appelée JOYINFOEX et vous devez définir cette structure dans votre code. Ce que fait la fonction joyGetPosEx est de remplir cette structure spéciale avec des informations sur la position du joystick, ce qui lui permet de renvoyer tout un tas de valeurs différentes en une fois. C'est pourquoi vous devez le passer comme référence (ref), parce que la fonction va réellement à remplir l'instance de la structure que vous lui passez avec un ensemble de valeurs. Votre code peut alors lire ces valeurs en retour sur de la variable contenant l'instance de la structure.

    La documentation de cette structure est disponible here et elle vous indique les noms et types de données
    de chacun de ses membres. Vous pouvez traiter un DWORD comme int, de sorte que sa déclaration ressemble à ceci:

    [StructLayout(LayoutKind.Sequential)] 
    public struct JOYINFOEX 
    { 
        public int dwSize; 
        public int dwFlags; 
        public int dwXpos; 
        public int dwYpos; 
        public int dwZpos; 
        public int dwRpos; 
        public int dwUpos; 
        public int dwVpos; 
        public int dwButtons; 
        public int dwButtonNumber; 
        public int dwPOV; 
        public int dwReserved1; 
        public int dwReserved2; 
    } 
    

Enfin, la fonction retourne joyGetPosEx une valeur de type int. Cette valeur vous indique si la fonction a réussi ou non, et ce qui n'a pas fonctionné. C'est un code d'erreur. La documentation liée ci-dessus vous donne un tableau de toutes les valeurs possibles qui peuvent être retournées. Si vous voulez vérifier par rapport à ces valeurs, vous aurez besoin de les définir comme des constantes dans votre code:

public const int JOYERR_BASE = 160 
public const int JOYERR_PARMS = (JOYERR_BASE + 5); 
public const int JOYERR_UNPLUGGED = (JOYERR_BASE + 7); 
public const int MMSYSERR_BASE = 0; 
public const int MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2); 
public const int MMSYSERR_INVALPARAM = (MMSYSERR_BASE + 11); 

Ainsi, compte tenu de ce qui précède, la définition de la fonction finale ressemble à ceci:

[DllImport("winmm.dll")] 
public static extern int joyGetPosEx(int uJoyID, ref JOYINFOEX pji); 

À l'avenir, gardez à l'esprit pinvoke.net comme référence pour définir et déclarer ces fonctions de l'API Win32 dans votre code. Il n'a pas la fonction joyGetPosEx (ou du moins ce que j'ai trouvé), mais il a généralement presque tout ce dont vous avez besoin. Et puis, si cela échoue, vous pouvez faire ce que j'ai essayé d'expliquer ci-dessus: regardez la documentation originale pour la fonction et essayez de la définir en conséquence pour travailler dans .NET.

+0

Merci Soo Much! Vous êtes un sauveur de vie .. =] Il m'a vraiment aidé beaucoup. Je vous ferai savoir si j'ai d'autres préoccupations à ce sujet =] –

+1

Veuillez noter que les API du joystick dans winmm sont des wrappers minces autour des API DirectInput. Vous êtes susceptible d'avoir une meilleure fiabilité et une plus grande fonctionnalité si vous utilisez DirectInput. Un avantage majeur de l'utilisation de DirectInput est que vous pouvez l'utiliser directement à partir du code managé à l'aide du code SDK DirectX pour Managed: http://msdn.microsoft.com/en-us/library/ms920643.aspx –

3

La fonction renvoie des données via le second argument.La valeur de retour est un entier, indiquant toute erreur possible. La déclaration correcte est:

[DllImport("winmm.dll")] 
    private static extern int joyGetPosEx(int joystickNumber, ref JOYINFOEX info); 

Vous devez déclarer la structure comme ceci:

[StructLayout(LayoutKind.Sequential)] 
    private struct JOYINFOEX { 
     public int dwSize; 
     public int dwFlags; 
     public int dwXpos; 
     public int dwYpos; 
     public int dwZpos; 
     public int dwRpos; 
     public int dwUpos; 
     public int dwVpos; 
     public int dwButtons; 
     public int dwButtonNumber; 
     public int dwPOV; 
     public int dwReserved1; 
     public int dwReserved2; 
    } 

Un échantillon appel:

 JOYINFOEX info = new JOYINFOEX(); 
     info.dwSize = Marshal.SizeOf(info); 
     int err = joyGetPosEx(1, ref info); 
     if (err != 0) reportError(err); 
     else { 
      int xpos = info.dwXpos; 
      // Do something with xpos 
      //... 
     } 
+0

Merci beaucoup Cela m'a aidé lot. donc par exemple si je veux obtenir seulement dwxPos je l'appellerai comme ceci: joygetpos (1, ref info.dwXpos); ? –

+0

Non, vous devez passer la structure. Après l'appel, il suffit d'utiliser info.dwXpos –

+0

pouvez-vous donner un exemple? –