Kann man in Windows nicht mehr als 3 gedrückte Tasten erkennen?



  • Ich habe diesen



  • ich habe diesen source von loggys tutorial:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
       MSG          msg;
       HWND         hWnd;
       WNDCLASS     wc;
    
       char szAppName[] = "Tastaturabfragen";
    
       wc.cbClsExtra         = 0;
       wc.cbWndExtra         = 0;
       wc.hbrBackground      = (HBRUSH) GetStockObject(WHITE_BRUSH);
       wc.hCursor            = LoadCursor(NULL, IDC_ARROW);
       wc.hIcon              = LoadIcon(NULL, IDI_APPLICATION);
       wc.hInstance          = hInstance;
       wc.lpfnWndProc        = WndProc;
       wc.lpszClassName      = szAppName;
       wc.lpszMenuName       = NULL;
       wc.style              = CS_HREDRAW | CS_VREDRAW;
    
       RegisterClass(&wc);
    
       hWnd = CreateWindow( szAppName,
                            szAppName,
                            WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            NULL,
                            NULL,
                            hInstance,
                            NULL);
    
       ShowWindow(hWnd, iCmdShow);
       UpdateWindow(hWnd);
    
       while (GetMessage(&msg, NULL, 0, 0))
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
       return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
       static RECT   rect;
       static bool   ArrowKeys[4];
    
       switch (message)
       {
    
       case WM_SIZE:
          {
             rect.right  = LOWORD(lParam);
             rect.bottom = HIWORD(lParam);
             return 0;
          }
    
       case WM_KEYDOWN:
          {
             switch (wParam)
             {
             case VK_LEFT:
                ArrowKeys[0] = true;
                break;
    
             case VK_UP:
                ArrowKeys[1] = true;
                break;
    
             case VK_RIGHT:
                ArrowKeys[2] = true;
                break;
    
             case VK_DOWN:
                ArrowKeys[3] = true;
                break;
    
             default:
                return 0;
             }
             InvalidateRect(hWnd, NULL, FALSE);
             return 0;
          }
    
          case WM_KEYUP:
          {
             switch (wParam)
             {
             case VK_LEFT:
                ArrowKeys[0] = false;
                break;
    
             case VK_UP:
                ArrowKeys[1] = false;
                break;
    
             case VK_RIGHT:
                ArrowKeys[2] = false;
                break;
    
             case VK_DOWN:
                ArrowKeys[3] = false;
                break;
    
             default:
                return 0;
             }
             InvalidateRect(hWnd, NULL, FALSE);
             return 0;
          }
    
       case WM_PAINT:
          {
             PAINTSTRUCT  ps;
             HDC          hDC;
    			SIZE         size;
             char szKeyStatus[40];
             int  iKeyLength;
    
             hDC = BeginPaint(hWnd, &ps);
             for (int i = 0; i < 4; i++)
             {
                iKeyLength = wsprintf(szKeyStatus, "Status Taste %i: %i",
                                      i, ArrowKeys[i]);
    				GetTextExtentPoint32(hDC, szKeyStatus, iKeyLength, &size);
                TextOut(hDC, rect.right / 2 - size.cx / 2, rect.bottom / 2 -
                        2 * size.cy + i * size.cy, szKeyStatus, iKeyLength);
             }
             EndPaint(hWnd, &ps);
    
             return 0;
          }
       case WM_DESTROY:
          {
             PostQuitMessage(0);
             return 0;
          }
       }
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    


  • Win-Version?

    MfG SideWinder



  • WinXP



  • Tastatur?



  • Das runde Ding? Har Har Har

    Also bei Euch erkennt er mehr als 3 Tasten?



  • Paula schrieb:

    Also bei Euch erkennt er mehr als 3 Tasten?

    nein auf gar keinen fall die restlichen ca. 100tasten sind nur zur zierde und für andere betriebssysteme gedacht 🤡
    loggy hat bestimmt die parameter von wm_keydown bzw. virtual keycodes erwähnt dann schlage sie doch in der msdn nach.



  • Hallo Miller_M,

    könntest Du es mir etwas genauer erklären?
    Hier sind die Parameter von wm_keydown
    Was sollen diese mir weiterhelfen?

    Ich glaube ich habe mein Problem nicht deutlich genug gemacht. In dem Beispiel von Loggy geht es darum anzuzeigen wenn die vier Pfeiltasten gedrückt werden.

    In der Nachrichtenfunktion steht es so:

    switch (message) {
    case WM_KEYDOWN: {
    
    	switch (wParam) {
    	case VK_LEFT:
    		ArrowKeys[0] = true;
    		break;
    	case VK_UP:
    		ArrowKeys[1] = true;
    		break;
    
    	case VK_RIGHT:
    		ArrowKeys[2] = true;
    		break;
    
    	case VK_DOWN:
    		ArrowKeys[3] = true;
    		break;
    ...
    

    Jedes mal wenn eine Taste gedrückt wird, wird eine WM_KEYDOWN Message ausgelößt. Egal wieviele Tasten ich bereits gedrückt halte. Korrekt? Oder gibt es da Windows Einschränkungen?
    Danach überprüft das zweite Switch Statement ob im wParam Parameter VK_LEFT steht. lParam wird gar nicht abgefragt.

    Warum wird die vierte Pfeiltaste nicht registriert?



  • Es liegt an der Tastatur, nicht an Windows.



  • miller_m schrieb:

    Paula schrieb:

    Also bei Euch erkennt er mehr als 3 Tasten?

    nein auf gar keinen fall die restlichen ca. 100tasten sind nur zur zierde und für andere betriebssysteme gedacht 🤡
    loggy hat bestimmt die parameter von wm_keydown bzw. virtual keycodes erwähnt dann schlage sie doch in der msdn nach.

    Gleichzeitig 💡

    MfG SideWinder



  • Ach so. Danke 🙂


Anmelden zum Antworten