Der joystick wird über die winmm32.dll abgefragt.
Was für eine Programmiersprache verwendest du denn?
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
Der joystick wird über die winmm32.dll abgefragt.
Was für eine Programmiersprache verwendest du denn?
Hi andi,
also ich verwende C++.
Wäre nett wenn du mir weiterhelfen köntest!
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.
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.
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
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
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.
so ähnlich halt ist ein aus zug aus meinem code per DirektXCode:..... #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"); } } ...
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
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
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!
Lesezeichen