Mal wieder DirectInput(diesmal Maus)



  • Vielleicht schaust du mal, was genau da für "Signale" da kommen? Und wenn du am Keyboard auf Taste 'A' wartest, solltest du genauso nur das beachten. Sprich die Taste 'U' wird ignoriert.

    Bye, TGGC (Der Held ist zurück)



  • Das soll so sein wie in einem Textentventure sein, das bei einem Klick was passiert.



  • Gott der 2. schrieb:

    Textentventure

    Gott der 2. schrieb:

    Klick

    😕



  • Ich bin noch ein relativer noob, und will doch nur wissen, wie man das macht, bei diesem eingabegerät, könnt ihr net bitte einen kleinen Code schreiben, wo das funzt, damit ich mir das angucken kann, und mein verständnis etwas gefördert wird 😞



  • Jeder, der einigermaßen Programmieren kann, ist schon stunden- und tagelang an so einfachen Problemen gesessen, bis es dann doch irgendwann funktioniert hat. Und beim nächsten mal, wenn so ein Problem auftaucht, sitzt man nur noch ein paar Minuten davor, weil man weiß an was es liegt.
    Und da wirst Du auch durch müssen, Du kannst doch nicht immer Deine ganzen Programme hier reinkopieren und sie korrigieren bzw. schreiben lassen.



  • Ja du hast recht, sagar ganz sicher., aber ich bin grad dabei mir erstma so alles algemein zu verstehnen(c++ etc.) ich weis noch net so genau . Ich brauch noch ne kleine starthilfe... learning by doing
    bitte nur dieses eine mal 😞
    mfg
    cu



  • so, wie ich verstehe, willst du also, dass dein Programm etwas tut, wenn eine Masutaste gedrückt wird, oder irgendeine andere Taste, doer?

    Ich würde dann mit GetDeviceState() den aktuellen Zusatnad speichern (zB Array). Dann gehst du alle Tasten durch die dich interessieren, und wenn die gedrückt sind, dann passiert eben irgendwas. Ich verstehe dein Problem also noch nciht so ganz.



  • Mein problem ist das,das noch einmalmal ein signal ausgegeben wird,wen man die taste losläst. Ich will aber nur ein signal wen die taste gedrückt wird.
    Ich weis wie du das meinst, aber in der umsetzung fehl mir noch die erfahrung.
    Hast du jetzt mein prob verstanden?
    mfg
    cu



  • Und das Tutorial der SDK hilft Dir nicht?!?! *hint* *hint* 🙄

    // DIMOFS_BUTTON0: Right button pressed or released 
                case DIMOFS_BUTTON0:
    
                // DIMOFS_BUTTON1: Left button pressed or released 
                case DIMOFS_BUTTON1:
                    // Is the right button or a swapped left button down?
                    if((g_bSwapMouseButtons && 
                                   DIMOFS_BUTTON1 == od.dwOfs) ||
                       (!g_bSwapMouseButtons && 
                                   DIMOFS_BUTTON0 == od.dwOfs))
                    {
                        if (od.dwData & 0x80)  // Left button pressed, so
                                               // go into button-down mode
                        {
                            bDone = TRUE;
                            OnLeftButtonDown(hWnd);
                        }
                    // Is the left button or a swapped right button down?
                    if((g_bSwapMouseButtons && 
                                   DIMOFS_BUTTON0 == od.dwOfs) ||
                       (!g_bSwapMouseButtons && 
                                   DIMOFS_BUTTON1 == od.dwOfs))
                    {
                        if(!(od.dwData & 0x80))  // button release, so
                                                 // check shortcut menu
                        {  
                            bDone = TRUE;
                            OnRightButtonUp(hWnd); 
                        }
                    }
                    break;
    

    🤡 👍



  • Vielen dank, aber das hilft mir net weiter 😕 ziemlich verwirend.
    Aber ich hab mich jetzt zeit genommen mir das ma genauer reinzuziehen.
    Und nach 3 Stunden 🙄 (sicherlich viel zu viel) hab ich es entlich( 💡 ) geschaft und möchte meine Lösung auch net vorenthalten
    Bedanke mich für eure Tipps, und hilfe.
    mfg
    cu

    #include <windows.h>
    #include <dinput.h>
    
    HWND CreateMainWindow(HINSTANCE hInstance);
    
    //Callback Funktion zur Nachrichtenbehandlung
    LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
    
    // DirectInput-Objekte initialisieren
    BOOL InitDirectInput(HINSTANCE hInst);
    
    // Objekte/Speicher freigeben
    void CleanUpDirectInput(void);
    
    // Fehlermeldung erzeugen
    BOOL Error(char* msg);
    
    // Eingaben behandeln
    void ProcessInput(void);
    int xxx=1;
    // Zeile im Fenster löschen
    void ClearText(HDC hDC);
    
    // Das Fensterhandle
    HWND hWnd = 0;
    
    // Zeiger auf das DirectInput Interface
    LPDIRECTINPUT8 lpDI = NULL; 
    
    // Zeiger auf ein DInput8 Geräte (für die Mouse)
    LPDIRECTINPUTDEVICE8 lpDIMouse = NULL;
        DIDEVICEOBJECTDATA data;
        DIDEVICEOBJECTDATA dataa;
    // Windows main-Funktion
    int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                       HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                       LPSTR lpCmdLine,          // Kommandozeile
                       int nCmdShow)             // Art wie das Fenster angezeigt werden soll
    {   
        MessageBox(NULL,"Dieses Beispiel zeigt wie man ein DirectInput8-Objekt\n"
                        "anlegt und die Kontrolle über die Mouse erhält.\n",
                        "Beschreibung",MB_OK);
    
        // Fenster erzeugen und Handle speichern
        hWnd = CreateMainWindow(hInstance);
    
        // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
        if(0 == hWnd)
        {
            return Error("Fehler beim Erzeugen des Fenster");
        }
    
        if(!InitDirectInput(hInstance))
        {
            return FALSE;
        }        
    
    	// Struktur, in der Informationen zur Nachricht gespeichert werden
        MSG msg;
    
        // Endlosschleife
    
        while(TRUE)
    	{    
            if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
                if(msg.message == WM_QUIT)
                {
                    break;
                }
    
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
             // wenn keine Nachricht vorliegt, 
            else
            {
                // kann gezeichnet werden
                ProcessInput();
            }
        }
    
        // Rückgabewert an Windows
        return 0;
    }
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass;                                   // WNDCLASSEX Struktur
    
        // Struktur initialisieren
        wndClass.cbSize        = sizeof(WNDCLASSEX);           // Größe angeben (nie vergessen!)
        wndClass.style         = CS_DBLCLKS | CS_OWNDC |
                                 CS_HREDRAW | CS_VREDRAW;      // Standard Stile
        wndClass.lpfnWndProc   = WindowFunc;                   // Die Callback Funktion angeben
    
        wndClass.cbClsExtra    = 0;                            // Zusätzliche Angaben, wird nicht benötigt
        wndClass.cbWndExtra    = 0;                            // Zusätzliche Angaben, wird nicht benötigt
        wndClass.hInstance     = hInstance;                    // Anwendungsinstanz
    
        wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // Schwarzer Pinsel
        wndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);  // Normaler Cursor
        wndClass.lpszMenuName  = NULL;                         // Das Fenster hat kein Menü
        wndClass.lpszClassName = "WindowClass";                // Der Name der Klasse
        wndClass.hIcon         = LoadIcon(NULL, IDI_WINLOGO);  // Windows Logo
        wndClass.hIconSm       = LoadIcon(NULL, IDI_WINLOGO);  // Windows Logo
    
        RegisterClassEx(&wndClass);
    
        return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                              "WindowClass",          // Klassenname
                              "DirectInput8-Mouse",// Fenstertitel
                              WS_OVERLAPPEDWINDOW |   // Fenster
                              WS_VISIBLE,             // Eigenschaften
                              100, 100,               // Anfangsposition und
                              400, 300,               // Größe des Fensters
                              NULL,                   // Handle des Elternfensters
                              NULL,                   // Handle des Menüs
                              hInstance,              // Anwendungsinstanz
                              NULL);                  // wird nicht benötigt
    }
    
    // Diese Funktion wird von Windows aufgrufen, wenn eine Nachricht
    // für Ihr Programm vorliegt
    LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        // testen, um welche Nachticht es sich handelt
        switch(msg)
        {
            case WM_KEYDOWN:
    			switch(wParam)
    			{
    				case VK_ESCAPE:                     
                        DestroyWindow(hWnd);
                    break;
                }
                break;
    
    		break;
    
            case WM_DESTROY:
                CleanUpDirectInput();
    			PostQuitMessage(0);
    		break;
    
        }
    
        // Wenn wir uns nicht um die Nachricht gekümmert haben wird sie 
        // an die Standardnachrichtenverarbeitung von Windows geschickt
        return (DefWindowProc(hwnd, msg, wParam, lParam));
    }
    
    BOOL InitDirectInput(HINSTANCE hInst)
    {
        // DirectInput8-Objekt anlegen
        if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION, 
                                     IID_IDirectInput8,(void**)&lpDI,NULL)))
        { 
            return Error("Fehler beim Anlegen des DirectInput8-Objekts");
        } 
    
        // Gerät für die Mouse festlegen
        if(FAILED(lpDI->CreateDevice(GUID_SysMouse, &lpDIMouse, NULL)))
        {
            return Error("Fehler beim Anlegen des Mouse-Geräts");    
        }
    
        // c_dfDIMouse ist eine vordefinierte Variable
        if(FAILED(lpDIMouse->SetDataFormat(&c_dfDIMouse)))
        {
            return Error("Fehler beim Setzen des Datenformats");        
        }
    
        // Kooperationsebene festlegen
        if(FAILED(lpDIMouse->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | 
                                                      DISCL_NONEXCLUSIVE)))
        {    
            return Error("Fehler beim Setzen des Kooperationsebene (DirectInput)");        
        }
    
        // Struktur, die auch die Mousepuffergröße enthält
        DIPROPDWORD DIProperties;
        ZeroMemory(&DIProperties,sizeof(DIProperties));
        DIProperties.diph.dwSize       = sizeof(DIPROPDWORD);
        DIProperties.diph.dwHeaderSize = sizeof(DIPROPHEADER);
        DIProperties.diph.dwObj        = 0;
        DIProperties.diph.dwHow        = DIPH_DEVICE;
        // Puffergröße festlegen
        DIProperties.dwData            = 16;
    
        // Puffergröße für Mouseeingaben setzen
        lpDIMouse->SetProperty(DIPROP_BUFFERSIZE, &DIProperties.diph);
    
        // Zugang zur Mouse verschaffen
        lpDIMouse->Acquire();
    
        return TRUE;
    }
    
    void ProcessInput(void)
    {
        DWORD NumElements = 1;
    
        if(FAILED(lpDIMouse->GetDeviceData(sizeof(data),&data,&NumElements,0))) 
        { 
            // die Mouse wurde zwischenzeitlich von einer andere Anwendung 
            // genutzt -> Kontrolle wiederholen
            lpDIMouse->Acquire();
            return;
        }
    
        HDC hDC = GetDC(hWnd);
    
    if(dataa.dwOfs==data.dwOfs)
    {
    				    ZeroMemory(&dataa,sizeof(dataa));
    				    ZeroMemory(&data,sizeof(data));
    }
        // Mausbewegung bestimmen
        switch(data.dwOfs)
        {
    
            case DIMOFS_BUTTON0:
                    ClearText(hDC);            
                    TextOut(hDC,10,10,"Mouseknopf 1",12);     
    
    				xxx=xxx+1;
                    TextOut(hDC,xxx,28,".",1); 
    				dataa=data;
    				    ZeroMemory(&data,sizeof(data));
                break;
    
            case DIMOFS_BUTTON1:
                    ClearText(hDC);
                    TextOut(hDC,10,10,"Mouseknopf 2",12);
    				dataa=data;
    				    ZeroMemory(&data,sizeof(data));
                break;
        }
    
    }
    
    // Text im Fenster löschen
    void ClearText(HDC hDC)
    {
        for(int i=10;i<250;i++)
        {
            TextOut(hDC,i,10," ",1);
        }
    }
    
    void CleanUpDirectInput(void)
    {
        if(NULL != lpDIMouse)
        {
            lpDIMouse->Unacquire();
            lpDIMouse->Release();
            lpDIMouse = NULL;
        }
    
        if(NULL != lpDI)
        {
            lpDI->Release();
            lpDI = NULL;
        }
    }
    
    // Fehlermeldung ausgeben
    BOOL Error(char* msg)
    {
        // in das Ausgabefenster
        OutputDebugString(msg);
        OutputDebugString("\n");
    
        // und als MessageBox
        MessageBox(0,msg,"Error",MB_OK);
    
        return FALSE;
    }
    


  • Ein Bug hat das ganze noch, und zwar wen man den coolswitch macht, manchmal anstat beim klick ein signal gesendet wird beim loslasen ein signal gesendet 😡
    Warum 😕
    mfg 😃
    cu


Anmelden zum Antworten