Mal wieder DirectInput(diesmal Maus)
-
GetDeviceState, wie kann man damit veranlassen das er dann bei einem Klick nur ein Signal schickt.
Also, wenn man klickt dan bewegt sich der punkt 2 pixel nach links, wiel er zwei signale schickt. is klar das man den pixel mit +0.5 richtig bewegt aber darum gehts ja net
-
hier das selbe Prob mit der Tastatur, wenn das euch helfen kann
http://www.c-plusplus.net/forum/viewtopic.php?t=61812
-
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