- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Joystick Programmierung und Windows 2000

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163

    Joystick Programmierung und Windows 2000

    Anzeige

    Powerstation Test
    Hi Leute,

    ich sitze jetzt schon zwei Tage dran und versuche im Internet irgendwelche Nützlichen unterlagen zum Thema Joystick und BCB zu finden aber ich kann nicht finden. Jetzt wollte ich einmal fragen ob sich hier jemand mit dem Thema auskennt.

    Ich möchte zunächst nur einmal ein Beispiel programm programmieren welches mir die Position des Joysticks wiedergibt ähnlich wie die Joystick kalibrierung unter Windows.

    wäre auf Tipps und Hinweise sehr dankbar.

    grüßla

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2004
    Beiträge
    29
    Der joystick wird über die winmm32.dll abgefragt.
    Was für eine Programmiersprache verwendest du denn?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    Hi andi,

    also ich verwende C++.

    Wäre nett wenn du mir weiterhelfen köntest!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2004
    Beiträge
    29
    Also für Visual Basic habe ich schon mal routinen gesehen.
    Ergo muss es mit C++ gehen.
    Bei C++ sollte eigentlich eine Headerdatei für die winmm.dll dabeisein.
    Andernfalls könnte man natürlich auch einen VB Quelltext als Vorlage nehmen und dann entsprechend in C++ umsetzen (primär geht es dabei nur um die Initialisierung/Geräteauswahl).

    Es gibt sogar Fensternachrichten für Joysticks:

    // Multimedia Window Messages
    const int MM_JOY1MOVE = &H3A0;
    const int MM_JOY2MOVE = &H3A1;
    const int MM_JOY1ZMOVE = &H3A2;
    const int MM_JOY2ZMOVE = &H3A3;
    const int MM_JOY1BUTTONDOWN = &H3B5;
    const int MM_JOY2BUTTONDOWN = &H3B6;
    const int MM_JOY1BUTTONUP = &H3B7;
    const int MM_JOY2BUTTONUP = &H3B8;



    Die folgenden Deklarationen sind für VB:
    Public Declare Function joyGetDevCaps Lib "winmm.dll" Alias "joyGetDevCapsA" (ByVal id As Long, lpCaps As JOYCAPS, ByVal uSize As Long) As Long
    Public Declare Function joyGetNumDevs Lib "winmm.dll" Alias "joyGetNumDev" () As Long
    Public Declare Function joyGetPos Lib "winmm.dll" Alias "joyGetPos" (ByVal uJoyID As Long, pji As JOYINFO) As Long
    Public Declare Function joyGetPosEx Lib "winmm.dll" Alias "joyGetPosEx" (ByVal uJoyID As Long, pji As JOYINFOEX) As Long
    Public Declare Function joyGetThreshold Lib "winmm.dll" Alias "joyGetThreshold" (ByVal id As Long, lpuThreshold As Long) As Long
    Public Declare Function joyReleaseCapture Lib "winmm.dll" Alias "joyReleaseCapture" (ByVal id As Long) As Long
    Public Declare Function joySetCapture Lib "winmm.dll" Alias "joySetCapture" (ByVal hwnd As Long, ByVal uID As Long, ByVal uPeriod As Long, ByVal bChanged As Long) As Long
    Public Declare Function joySetThreshold Lib "winmm.dll" Alias "joySetThreshold" (ByVal id As Long, ByVal uThreshold As Long) As Long

    Ich denke, dass man also zuerst mit joyGetNumDevs versuchen sollte, herauszufinden, ob überhaupt ein Joystick vorhanden ist.
    Um dann mittels joyGetPos herauszufinden, wo der Stick gerade steht.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2004
    Beiträge
    29
    Die oben genannten Funktionen in der winmm.dll dürften so in etwa alle sein, die es für joysticks gibt.
    Alternativ dazu könnte man vermutlich auch über DirectX (DirectInput) auf den Joystick zugreifen und dann sogar Force Feedback oder Rumble-Features nutzen.
    Mit der winmm.dll sollte es allerdings doch etwas einfacher gehen.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2004
    Beiträge
    29
    Die beiden wichtigsten Strukturen für das mit den Joysticks sollte ich vielleicht auch noch erwähnen:
    Type JOYCAPS
    wMid As Integer
    wPid As Integer
    szPname As String * 32
    wXmin As Integer
    wXmax As Integer
    wYmin As Integer
    wYmax As Integer
    wZmin As Integer
    wZmax As Integer
    wNumButtons As Integer
    wPeriodMin As Integer
    wPeriodMax As Integer
    End Type

    Type JOYINFO
    wXpos As Long
    wYpos As Long
    wZpos As Long
    wButtons As Long
    End Type

    Leider alles nur Basic, aber man kann es 1:1 in eine typedef struct umsetzen. Der szPname müsste einem char Pname[32] entsprechen

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    hmm danke das hört sich ja alles mal seh interesannt an. Nur ich muss eins noch dazu sagen ich habe mit VB noch nie etwas zu tun gehabt! Daher tue ich mir vielleicht etwas schwer. Aber ich werde mein bestes versuchen! Danke mal, wenn dir noch etwas einfällt kannst es ja posten ;o)

    gruß und gute nacht

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    50
    Beiträge
    1.562
    Um die Funktion in c++ ein zu binden muß du nur die richtigen header ein bin den unter MS C++ ist das ganz einfach lat dir ein fach das DiretX SDK bei ms runter da ist ein sehr einfacheres beispiel dabei.

    Code:
    .....
    #define DIRECTINPUT_VERSION 0x0800
    
    #include <dinput.h>
    #include "resource.h"
    
    CMNJoystick* g_pMNJoy;
    
    .....
    
        // Register with the DirectInput subsystem and get a pointer
        // to a IDirectInput interface we can use.
        // Create a DInput object
        if( SUCCEEDED( hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,IID_IDirectInput8, (VOID**)&g_pDI, NULL ) ) )
        {
    	    // Look for a simple joystick we can use for this sample program.
    		if(SUCCEEDED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,EnumJoysticksCallback,NULL, DIEDFL_ATTACHEDONLY ) ) )
            {
    			// Make sure we got a joystick
    			if( NULL == g_pJoystick )
    			{
    				MessageBox( NULL, TEXT("Keinen JoyStick gefunden. Oder kann nicht Initalisieren"),TEXT("MN Joystickclass"),MB_ICONERROR | MB_OK );
    				return FALSE;
    			}
    			// Set the data format to "simple joystick" - a predefined data format
    			//
    			// A data format specifies which controls on a device we are interested in,
    			// and how they should be reported. This tells DInput that we will be
    			// passing a DIJOYSTATE2 structure to IDirectInputDevice::GetDeviceState().
    			if(SUCCEEDED( hr = g_pJoystick->SetDataFormat( &c_dfDIJoystick2 ) ) )
    			{
    				// Set the cooperative level to let DInput know how this device should
    				// interact with the system and with other DInput applications.
    				//DISCL_EXCLUSIVE |DISCL_FOREGROUND
    				if(SUCCEEDED( hr = g_pJoystick->SetCooperativeLevel( hDlg, DISCL_EXCLUSIVE|DISCL_BACKGROUND ) ) )
    				{
    					// Enumerate the joystick objects. The callback function enabled user
    					// interface elements for objects that are found, and sets the min/max
    					// values property for discovered axes.
    					if(SUCCEEDED( hr = g_pJoystick->EnumObjects( EnumObjectsCallback,(VOID*)hDlg, DIDFT_ALL ) ) )
    					{
    						ATLTRACE("Nun kann es los gehen\n");
    						g_hClientThreadMsg = CreateEvent(NULL,TRUE,FALSE,NULL);
    						g_hClientThreadExit = CreateEvent(NULL,TRUE,FALSE,NULL);
    
    						m_hClientThreadHandle=(HANDLE)_beginthreadex(NULL,0,ClientThread,this,CREATE_SUSPENDED,reinterpret_cast<unsigned int*>(&m_dwClientThreadId));
    						SetThreadPriority(m_hClientThreadHandle, THREAD_PRIORITY_NORMAL);
    						ResumeThread(m_hClientThreadHandle);
    						if(WaitForSingleObject(g_hClientThreadMsg,30000) == WAIT_OBJECT_0)
    						{
    							ATLTRACE("Thread läuft mal sehen ob daten kommen\n");
    						}
    					}
    				}
    				else
    				{
    					m_pRoboclient->TraceIt("SetCooperativeLevel not OK");
    				}
    			}
    
    ...
    so ähnlich halt ist ein aus zug aus meinem code per DirektX
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2004
    Beiträge
    29
    Die Deklarationen findet man meistens im Internet (Google: "winmm.dll joystick c++")
    Die Typdefinitionen sollte man auch schon fix und fertig bekommen können.
    Der Rest sollte recht einfach gehen:
    1. mit joyGetNumDevs prüfen, ob Joysticks vorhanden sind
    2. mit joyGetDevCaps die Eigenschaften des Joysticks abfragen
    3. mit joyGetPos (in regelmäßigen Intervallen) die Position abfragen

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    Hmm...nur das Problem das ich kein C++ von MS benutze sondern von Borland. Aber auch dazu müsste es ja dann nützliche ergebnisse geben!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen