Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Kasenoru

Frischling

  • »Kasenoru« ist der Autor dieses Themas

Beiträge: 79

Beruf: Softwareentwickler

  • Private Nachricht senden

1

30.12.2005, 23:46

DirectInput will nicht richtig

Hallo.
Also, ich möchte DirectInput testen, dazu habe ich ein Testprogramm(C++) gemacht.
Mit einem druck auf die Linke bzw. Rechte Pfeiltaste soll eine Messagebox erscheinen.
Schön und gut, wenn ich das Programm starte passiert das auch, sobald ich die Linke bzw. Rechte Pfeiltaste drücke erscheint die entsprechende Messagebox.
Nur sobald ich sie wegklicke, erscheint sie sofort wieder, dann klicke ich sie wieder weg und sie kommt sofort wieder, und das ganze wiederholt sich endlos.

Ich weiß einfach nicht wo das Problem liegt, naja hier mein Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <windows.h>
#include <stdIO.h>
#include <dinput.h>



LRESULT CALLBACK WindowProc(HWND hWnd,UINT Message,WPARAM WParam,LPARAM LParam);



int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpcmdline,int nshowcmd)
{
    WNDCLASSEX WindowClass;
    MSG Message;
    HWND hWnd;

    

    const char acClassName[] = "Fenster";

    WindowClass.cbSize = sizeof(WNDCLASSEX);
    WindowClass.style = CS_HREDRAW|CS_VREDRAW;
    WindowClass.lpfnWndProc = WindowProc;
    WindowClass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+2;
    WindowClass.hCursor = LoadCursor(NULL,IDC_ARROW);
    WindowClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    WindowClass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    WindowClass.hInstance = hInst;
    WindowClass.lpszClassName = acClassName;

    WindowClass.cbClsExtra = NULL;
    WindowClass.cbWndExtra = NULL;
    WindowClass.lpszMenuName = NULL;
    
    RegisterClassEx(&WindowClass);

    hWnd = CreateWindowEx(NULL,acClassName,"Ein Fenster",WS_OVERLAPPEDWINDOW|WS_VISIBLE,50,50,640,480,NULL,NULL,hInst,NULL);
    
   //DirectInput initialisieren


    LPDIRECTINPUT8 lpDI; 

    DirectInput8Create(hInst,0x0800,IID_IDirectInput8,(void**)&lpDI,NULL);

    LPDIRECTINPUTDEVICE8 lpDIdevice = NULL;

    lpDI->CreateDevice(GUID_SysKeyboard,&lpDIdevice,NULL);

    lpDIdevice->SetDataFormat(&c_dfDIKeyboard);

    lpDIdevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE);

    lpDIdevice->Acquire();


while(Message.message != WM_QUIT)
{

    while(PeekMessage(&Message,NULL,0,0,PM_REMOVE))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);  
    }

    bool bBuffer[256];


    lpDIdevice->GetDeviceState(sizeof(bBuffer),(void**)&bBuffer);
    
    //Tasten prüfen

    if(bBuffer[DIK_LEFT])
    {
        MessageBox(NULL,"Links","Test",MB_OK);
        
    }

    if(bBuffer[DIK_RIGHT])
    {
        MessageBox(NULL,"Rechts","Test",MB_OK);
        
    }

}
    //DirectInput herunterfahren    


    lpDI->Release();
    lpDIdevice->Release();
    lpDI = NULL;
    lpDIdevice = NULL;



    UnregisterClass(acClassName,hInst);

    return (int)(Message.wParam);

}

LRESULT CALLBACK WindowProc(HWND hWnd,UINT Message,WPARAM WParam,LPARAM LParam)
{
    switch(Message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return(0);
        break;
    }

    return (DefWindowProc(hWnd,Message,WParam,LParam));
}


Ich weiß einfach nicht wo der Fehler steckt , ich hoffe jemand kann mir helfen.

2

31.12.2005, 08:31

IKCh glaube du hast bei

Zitat von »"Kasenoru"«

lpDIdevice->GetDeviceState(sizeof(bBuffer),(void**)&bBuffer);


mit dem 2ten Parameter einen Fehler (falsche Übergabe).

oder vllt. öffnet das Prgramm 100 Fenster du klickst ja wahrscheinlich eine Sekunde lang auf links oder rechts und so öffnet er halt mehrerere...

mfg Markus

Kasenoru

Frischling

  • »Kasenoru« ist der Autor dieses Themas

Beiträge: 79

Beruf: Softwareentwickler

  • Private Nachricht senden

3

31.12.2005, 17:35

Die Parameterübergabe ist laut der DirectX Dokumentation völlig korrekt.

Zitat von »"lannms11"«

oder vllt. öffnet das Prgramm 100 Fenster du klickst ja wahrscheinlich eine Sekunde lang auf links oder rechts und so öffnet er halt mehrerere...


Nein, denn selbst wenn ich 5 Sekunden warte, wiederholt sich alles, es wird also 5 Sekunden gewartet, Fenster öffnet sich, ich klicke weg, es wird wieder 5 Sekunden gewartet, Fenster kommt, ich klicke weg, und das ganze wiederholt sich endlos.

Es hat sich aber folgendes herrausgestellt:
Wenn ich lpDIdevice->Acquire() einmal pro Frame aufrufen lasse, also genau hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
while(Message.message != WM_QUIT)
{

    while(PeekMessage(&Message,NULL,0,0,PM_REMOVE))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);   
    }

    bool bBuffer[256];

    lpDIdevice->Acquire();    

    lpDIdevice->GetDeviceState(sizeof(bBuffer),(void**)&bBuffer);
   
    //Tasten prüfen

    if(bBuffer[DIK_LEFT])
    {
        MessageBox(NULL,"Links","Test",MB_OK);
       
    }

    if(bBuffer[DIK_RIGHT])
    {
        MessageBox(NULL,"Rechts","Test",MB_OK);
       
    }

}

Dann funtzt komischerweise alles perfekt und ohne fehler.
Nur ich weiß nicht, ob das was ich mache, die richtige lösung ist ???

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

31.12.2005, 18:31

Das mit Aquire ist eigentlich nicht so ganz richtig... man sollte Aquire nur aufrufen, wenn man den Zugriff über das Eingabegerät nicht hat bzw verloren hat...

Außerdem überprüfst du eine bool Variable... das läuft meiner Meinung nach nicht... Nimm als Typ Byte und frag das signed-Bit ab...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
BYTE aBuffer[256];

lpDIdevice->GetDeviceState(256, aBuffer); 
    
//Tasten prüfen 

if(aBuffer[DIK_LEFT] & 0x80) 
{ 
    MessageBox(NULL,"Links","Test",MB_OK);       
}
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Kasenoru

Frischling

  • »Kasenoru« ist der Autor dieses Themas

Beiträge: 79

Beruf: Softwareentwickler

  • Private Nachricht senden

5

01.01.2006, 19:31

Zitat von »"Black-Panther"«

Außerdem überprüfst du eine bool Variable... das läuft meiner Meinung nach nicht... Nimm als Typ Byte und frag das signed-Bit ab...


Habe ich gemacht, und es geht immernoch nicht, nicht die geringste änderung, alles wiederholt sich endlos.
Kannst dir ja gerne den Code kopieren, da wirste merken das es nicht geht^^

ohje......wie mich das aufregt....warum klappt das ausgerechnet bei mir wieder nicht :(

Ich frag mich, was ich nur Falsch mache.

Werbeanzeige