Tastendruck speichern



  • bin auf WM_KEYDOWN gestossen und experimentiere jetzt mal herum, bin aber immer noch offen für hilfe...

    KEYDOWN ? Steht das nicht für die Pfeiltaste die nach unten gedrückt wird ?....



  • pivke schrieb:

    bin auf WM_KEYDOWN gestossen und experimentiere jetzt mal herum, bin aber immer noch offen für hilfe...

    KEYDOWN ? Steht das nicht für die Pfeiltaste die nach unten gedrückt wird ?....

    Nein, da liegst du falsch. WM_KEYDOWN ist die Window Message die versendet wird, wenn eine Taste (engl. key) runter (engl. down) gedrückt wird. Wenn es sich bei dieser Taste um die Pfeiltaste nach unten handelt, dann behinhalt die Struktur als Virtual Keycode VK_DOWN.



  • Ok, dann schau dir mal diese Tutorials zur WinAPI an..

    Obwohl, wenn du in der Konsole arbeitest (was ich jetzt mal annehme), dann würde ich das jetzt selber mal über GetAsyncKeyState () zu lösen versuche, sonst musst du dich nämlich noch in anderes einarbeiten. 😉

    @pivke
    Ne WM_KEYDOWN ist irgend eine Taste. VK_DOWN ist der Pfeil nach unten.



  • nei, ich arbeite mit der WinAPI, console ist mir zu langweilig und zu "unschön" geworden..

    aber wie kann ich den virtual keycode in eine Variable speichern?

    habs mit

    case WM_KEYDOWN:
        taste=wParam;
        return 0;
    

    versucht, hat aber nicht geklappt...

    :: edit ::

    klappt anscheinend doch 🙂



  • die Struktur als Virtual Keycode VK_DOWN

    *HandvorKopfHau*
    Natürlich 😉 War grad noch im Assemblerrausch ^^



  • neues Problem, die WM_KEYDOWN soll bei drücken eines bestimmtes knopfes den VK in eine dafür forgesehene Variable speichern:

    case WM_KEYDOWN:
    if(bool_zoom==true)
    {
    	int_zoom=wParam;
    	bool_zoom=false;
    }
    if(bool_unzoom==true)
    {
    	int_unzoom=wParam;
    	bool_unzoom=false;
    }
    if(bool_delete==true)
    {
    	int_delete=wParam;
    	bool_delete=false;
    }
    return 0;
    

    die bool werden bei Knopfdruck auf TRUE gesetzt, aber wie es scheint, werden nachdem ein Kindfenster (ob button oder edit-feld) angeklickt wurde, keine KEYDOWN Messages mer übermittelt (auf jeden fall nicht ans Hauptfenster..)

    p.s. merke gerade das ich für sowas nicht mehr im richtigen Forum bin, will aber dafür nicht extra ein neues Thema eröffnen...



  • Warten bis ne Taste gedrückt wird?
    So:

    ...
    //Bsp: Leertaste
    while(!(GetAsyncKeyState(VK_SPACE)&0x80000));
    ...
    


  • ich will nicht warten bis eine bestimmte taste gedrückt wird (in deinem beispiel Space).

    Ich habe ein Crosshair Tool für Urban Terror geschrieben. Standart Tastenbelegung ist Shift um zu zoomen (fadenkreuz vergrössern), Alt um rauszuzoomen und Backspace um das Programm zu beenden. Jetzt will ich das der Benutzer diese Tasten selber bestimmen kann, in dem, nach dem z.B. der Knopf für zoomen gedrückt wurde, die nächste Taste als zoom-Knopf festgelegt wird. Funktioniert eigentlich alles, mit ausnahme, das wenn mal ein Kindfenster aktiviert wurde (Button) die Oben zitierten Zeilen (WM_KEYDOWN:...) nicht mehr beachtet werden...

    edit: Und kann mir jemand sagen warum das Wort "Stan_dart" zensiert wird



  • weiss wirklich niemand eine Lösung für mein Problem, bin jetzt seit Stunden auf der suche...



  • Also falls du auf der Suche nach dem STANDARD Problem bist..

    Bei dem anderen. Da liest du einfach die Taste ein, die er drückt und dann speicherst du die in irgendeiner Liste oder so ab,wo du hald die Aktionen, die dadurch resultieren auch noch mitabgelegt sind. Da kannst du z.B was mit Funktionspointern basteln..



  • Das Problem liegt ganz einfach darin, dass nach dem das erste Mal ein Button gedrückt wurde, keine WM_KEYDOWN Messages mehr gesendet werden...

    Zum besseren Verständis hier der Gesamte Quellcode:

    #include <windows.h> 
    #include <stdio.h> 
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    HINSTANCE hInst;
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) 
    { 
    	char szName[] = "Fensterklasse"; 
    	WNDCLASS wc; 
    	hInst = hI;
    	HWND fenster;
    
    	wc.style         = CS_HREDRAW | CS_VREDRAW;   // CS = "class style" 
    	wc.lpfnWndProc   = WndProc; 
    	wc.cbClsExtra    = 0; 
    	wc.cbWndExtra    = 0; 
    	wc.hInstance     = hI; 
    	wc.hIcon         = LoadIcon (NULL, IDI_WINLOGO); 
    	wc.hCursor       = LoadCursor (NULL, IDC_ARROW); 
    	wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); //Hintergrundfarbe
    	wc.lpszMenuName  = NULL; 
    	wc.lpszClassName = szName; 
    
    	RegisterClass (&wc); 
    
    	fenster = CreateWindow (
    								szName,
    								"UrbanTerror - Crosshair", // Fenstertitel
    								WS_SYSMENU | WS_MINIMIZEBOX, // Attribute (Systemmenu, Minimieren, Maximieren, etc.)
    								805, //x-Koord. linke obere Ecke
    								0, //y-Koord. linke obere Ecke
    								300, //Fensterbreite
    								255, //Fensterhöhe
    								NULL,
    								NULL,
    								hI,
    								NULL
    							); 
    
    	ShowWindow   (fenster, iCmdShow); 
    	UpdateWindow (fenster); 
    
    	// Nachrichten-Schleife 
    	MSG msg; 
    		while (GetMessage (&msg, NULL, 0, 0)) 
    		{ 
    			TranslateMessage (&msg); 
    			DispatchMessage (&msg); 
    		} 
    	return msg.wParam; 
    }
    
    HWND button_start;
    HWND button_end;
    HWND button_zoom;
    HWND button_unzoom;
    HWND button_delete;
    HWND textfield_zoom;
    HWND textfield_unzoom;
    HWND textfield_delete;
    int int_zoom = VK_SHIFT;
    int int_unzoom = VK_MENU;
    int int_delete = VK_BACK;
    bool bool_zoom = false;
    bool bool_unzoom = false;
    bool bool_delete = false;
    
    LRESULT CALLBACK WndProc (HWND fenster, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
    HDC hdc; 
    PAINTSTRUCT ps;
    
    switch (message) 
    { 
    
    	case WM_CREATE:
    		button_start		= CreateWindow (
    											  "button", "START", 
    											  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
    											  20, 20, 50, 30, 
    											  fenster, (HMENU)1,
    											  hInst, NULL
    										   ); 
    		button_end			= CreateWindow (
    											  "button", "END", 
    											  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
    											  90, 20, 50, 30,
    											  fenster, (HMENU)2,
    											  hInst, NULL
    										   ); 
    		button_zoom			= CreateWindow (
    											  "button", "ZOOM", 
    											  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
    											  20, 70, 70, 30, 
    											  fenster, (HMENU)3,
    											  hInst, NULL
    										   ); 
    		textfield_zoom		= CreateWindow (
    											  "edit", "SHIFT", 
    											  WS_CHILD | WS_VISIBLE | ES_READONLY, 
    											  110, 70, 150, 30, 
    											  fenster, NULL,
    											  hInst, NULL
    										   ); 
    		button_unzoom		= CreateWindow (
    											  "button", "UNZOOM", 
    											  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
    											  20, 120, 70, 30,
    											  fenster, (HMENU)4,
    											  hInst, NULL
    										   ); 
    		textfield_unzoom	= CreateWindow (
    											  "edit", "ALT", 
    											  WS_CHILD | WS_VISIBLE | ES_READONLY, 
    											  110, 120, 150, 30, 
    											  fenster, NULL,
    											  hInst, NULL
    										   ); 
    		button_delete		= CreateWindow (
    											  "button", "DELETE", 
    											  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
    											  20, 170, 70, 30,
    											  fenster, (HMENU)5,
    											  hInst, NULL
    										   ); 
    		textfield_delete	= CreateWindow (
    											  "edit", "BACKSPACE", 
    											  WS_CHILD | WS_VISIBLE | ES_READONLY, 
    											  110, 170, 150, 30, 
    											  fenster, NULL,
    											  hInst, NULL
    										   ); 
    		return 0 ;
    
    	case WM_COMMAND: 
    		if(LOWORD(wParam) == 1) 
    		{ 
    			int c_x,c_y,hs;
    			bool i=true;
    			long x,y;
    			HWND h;
    			HDC dc;
    
    			h = FindWindow(NULL,"ioUrbanTerror"); 
    			dc = GetDC(h); 
    			c_x =800/2;
    			c_y=600/2;
    			hs=26/2; 
    			while(i==true) { 
    				if(GetAsyncKeyState(int_delete)) { 
    					i=false;
    				} 
    				if(GetAsyncKeyState(int_zoom)) { 
    					hs=600/2;
    				} 
    				if(GetAsyncKeyState(0x01)) { // linke Maustaste
    					hs=26/2;
    				} 
    				if(GetAsyncKeyState(int_unzoom)) {
    					hs=26/2;
    				}
    				for(x=c_x-hs;x<c_x+hs;x++) { 
    					SetPixel(dc,x,c_y,RGB(255,0,0)); 
    				} 
    				for(y=c_y-hs;y<c_y+hs;y++) { 
    					SetPixel(dc,c_x,y,RGB(255,0,0)); 
    				} 
    				Sleep(5); 
    			} 
    			ReleaseDC(h, dc); 
    		} 
    		if(LOWORD(wParam) == 2) 
    		{ 
    			PostQuitMessage(0);
    		} 
    		if(LOWORD(wParam) == 3) 
    		{ 
    			SetWindowText(textfield_zoom,"Taste drücken...");
    			bool_zoom=true;
    		} 
    		if(LOWORD(wParam) == 4) 
    		{ 
    			SetWindowText(textfield_unzoom,"Taste drücken...");
    			bool_unzoom=true;
    		} 
    		if(LOWORD(wParam) == 5) 
    		{ 
    			SetWindowText(textfield_delete,"Taste drücken...");
    			bool_delete=true;
    		} 
    		return 0;
    
    	case WM_KEYDOWN:
    		if(bool_zoom==true)
    		{
    			int_zoom=wParam;
    			bool_zoom=false;
    			SetWindowText(textfield_zoom,"hallo");
    		}
    		if(bool_unzoom==true)
    		{
    			int_unzoom=wParam;
    			bool_unzoom=false;
    			SetWindowText(textfield_unzoom,"hallo");
    		}
    		if(bool_delete==true)
    		{
    			int_delete=wParam;
    			bool_delete=false;
    			SetWindowText(textfield_delete,"hallo");
    		}
    		return 0;
    
    	case WM_DESTROY: 
    		PostQuitMessage(0);  
    		return 0; 
    } 
    
    return DefWindowProc (fenster, message, wParam, lParam); 
    }
    


  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das sollte IMHO daran liegen, dass der Eingabefokus nicht mehr auf Deinem Hauptfenster, sondern auf dem geklickten Button liegt.


  • Mod

    Deshalb gibt es genau für diese Fälle Accelerator!
    TranslateAccelerator
    http://msdn2.microsoft.com/en-us/library/ms646373(VS.85).aspx


Anmelden zum Antworten