Maus im fenster??? Struturname kurzfassen???



  • Hallo...ich hab ein Problem und zwar hab ich im FAQ ne mausroutine gefunden.... Ich hab sie schnell in c umgeschrieben und jetzt versuch ich es zum laufen zu bringen, auch wenn man nicht im Vollbildmodus ist...weis einer wie das geht?? ob es geht?

    Dann hab ich bei der maus zb die x koordinate

    ir.Event.MouseEvent.dwMousePosition.X

    das ist mir aber zu lang...kann ich diese strukturen irgentwie zb unter mouse.X zusammenfassen??

    danke im voraus!!
    lg capgeti



  • Hai !

    Kannst dir ne Funktion schreibseln in der Form:

    DWORD MouseX( INPUT_RECORD* ir )
    {
        return ir->Event.MouseEvent.dwMousePosition.X;
    }
    

    Für die Y-Koordinate entsprechend.
    Und dann im Programm aufrufen:

    printf( "X: %d\n", MouseX(&ir) );
    

    Das geht vielleicht auch irgendwie mit nem Makro,
    so ähnlich wie:
    #define mouse(n) "ir.Event.MouseEvent.dwMousePosition." #n

    aber das krieg ich nicht gebacken. 😃
    Die Funktion funzt aber.
    Gruuhuuußß, p.



  • #define ir.Event.dwMousePosition mouse
    


  • Krempf schrieb:

    #define ir.Event.dwMousePosition mouse
    

    Das wär ja einfach. Das funzt aber nicht.



  • aha...stimmt...ich hab mir glei mal ne lib gebaut.... jetzt geht alles ganz einfach, aber wenn ich klicken will muss ich immer erst 3 oder 4 mal klicken...hier ein beispiel wie ich sie benutze.

    #include <stdio.h>
    #include <windows.h>
    #include "mouse.h"
    
    int main()
    {
        int x, y;
    
        do
        {
            //Anweisungen...
        } while(mouse(1)!=1);
        return 0;
    }
    

    Das heißt....wenn ich klicke wird die Funktion mouse() mit den wert 1(für klick) aufgerufen... wenn ich halt klicke gibt die Funktion 1 zurück. und das wärs eigentlich....aber wieso muss ich manchmal mehrmals drücken???
    Soll ich auch die lib posten??



  • CaPGeti schrieb:

    ...
    while(mouse(1)!=1);
    

    da wundert es mich, das überhaupt etwas funktioniert.



  • wieso??



  • so geht das mit der schleife:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-86415.html

    und dann raushüpfen, wenn links geklickt 😉



  • Was denksten wohl ich die Maus her hab....genau von dieser seite....Ich habs Blos in ner maus.h gelhaun....

    Hier die lib...

    int ymaus=0;
    int xmaus=0;
    
    DWORD mouseInit ()
    {
        DWORD mode;
        GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),&mode);
        SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),mode|ENABLE_MOUSE_INPUT);
    
        DWORD buttons;
        GetNumberOfConsoleMouseButtons(&buttons);
    
        return buttons;
    }
    
    int showCursor (int show)
    {
    
        ShowCursor(show);
    }
    
    int mouse(int i)
    {
        mouseInit();
        showCursor(1); 
    
        DWORD count;
        INPUT_RECORD ir;
        ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),&ir,1,&count);
    
        if(i==1)
        {
    
           	  if((ir.EventType==MOUSE_EVENT)&&ir.Event.MouseEvent.dwButtonState && FROM_LEFT_1ST_BUTTON_PRESSED)
              {
    
                  return 1;              
              }
    
        }
        else if(i==2)
        {
            xmaus = ir.Event.MouseEvent.dwMousePosition.X;
            return xmaus;
        }
        else if(i==3)
        {
            ymaus = ir.Event.MouseEvent.dwMousePosition.Y;
            return ymaus;
        }
    
        return 0;
    }
    

    Hab ich irgentwas falsch gesetzt?



  • Hi!
    Ich dachte erst, der Fehler wäre in deiner Logik.
    Beim Überfliegen hatte ich aber selbst einen Denkfehler gemacht.

    Das Problem in deinem Code liegt an dieser Zeile:
    if((ir.EventType==MOUSE_EVENT)&&ir.Event.MouseEvent.dwButtonState && FROM_LEFT_1ST_BUTTON_PRESSED);

    Richtig müsste es heissen:
    if( (ir.EventType==MOUSE_EVENT) && (ir.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED));

    Was mir sonst noch aufgefallen ist:
    Du verlässt dich bei den API Funktionen darauf, das sie erfogreich ausgeführt werden. Das ist aber nicht immer so. Wenn du erstmal ein paar Megabyte Quellcode hast und dann irgendwo mal ein Fehler passiert: Dann viel Spass beim Suchen.

    Der Aufruf von ReadConsoleInput füllt jedes mal die Struktkur INPUT_RECORD ir.
    D.h. wenn die Funktion mouse verlassen wird, könntest du mit einem geeigneten Parameter
    sämtliche zu INPUT_RECORD ir gehörenden Parameter in deiner Hauptschleife verfügbar machen.

    Ich habe in deinem Quelltext ein paar Dinge kommentiert, die mir aufgefallen sind:

    // Globale Variable -> Nix guuuuuuuuuut
    int ymaus=0;
    int xmaus=0;
    
    int mouse(int i)
    {
        mouseInit();		// Einmal  initialisieren genügt.
        showCursor(1);		// Einmal  aufrufen genügt.
    
        // Solche Konstrukte machen aus jedem Highspeed-PC früher oder später eine lahme Schnecke.
        DWORD count;		// Unnötiger Auf- /Abbau des Stackframes.
        INPUT_RECORD ir;		// Unnötiger Auf- /Abbau des Stackframes.
    
        // Einmal HANDLE mit GetStdHandle(STD_INPUT_HANDLE) beim Initialisieren holen genügt.
        ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),&ir,1,&count);
    
        // Der Aufruf von ReadConsoleInput füllt jedes mal die Struktkur INPUT_RECORD ir.
    
        if(i==1) 
        {
    	// HIER STECKT DER BUG !!!
              if((ir.EventType==MOUSE_EVENT)&&ir.Event.MouseEvent.dwButtonState && FROM_LEFT_1ST_BUTTON_PRESSED)
              {
                  return 1;              
              }
        }
        else if(i==2)
        {
            xmaus = ir.Event.MouseEvent.dwMousePosition.X;
            return xmaus; // Global nix guut. Könntest gleich return ir.Event.MouseEvent.dwMousePosition.X schreiben.
        }
        else if(i==3)
        {
            ymaus = ir.Event.MouseEvent.dwMousePosition.Y;
            return ymaus;  // Global nix guut. Könntest gleich return ir.Event.MouseEvent.dwMousePosition.Y schreiben.
        }
    
        return 0;
    }
    

    Und hier nun der Verbesserungsvorschlag:

    struct Mouse
    {
    	HANDLE h;
    	INPUT_RECORD ir;
    	DWORD count; 
    	int buttons;
    	int x, y;
    };
    
    void show_cursor (int show)
    {
       ShowCursor(show);
    } 
    
    int mouse_init( struct Mouse* M )
    {
        DWORD mode = 0;
    	M->h = GetStdHandle(STD_INPUT_HANDLE);
    
    	if ( M->h == INVALID_HANDLE_VALUE )
    	{
    		puts("Failed on GetStdHandle"); return 1;
    	}
    
        if ( 0 ==  GetConsoleMode( M->h, &mode ) )
    	{
    		puts("Failed on GetConsoleMode"); return 1;
    	}
    
    	if ( 0 ==  SetConsoleMode(M->h, mode|ENABLE_MOUSE_INPUT ) )
    	{
    		puts("Failed on SetConsoleMode"); return 1;
    	}
    
    	if ( 0 == GetNumberOfConsoleMouseButtons( &M->buttons ) )
    	{
    		puts("Failed on GetNumberOfConsoleMouseButtons"); return 1;
    	}
    
        return 0;
    }
    
    int mouse( struct Mouse* M )
    {
    	if ( 0 == ReadConsoleInput( M->h, &M->ir, 1, &M->count ) )
    	{
    		puts("Failed on ReadConsoleInput.");
    		return -1;
    	}
    
    	switch( M->ir.EventType )
        { 
    	  case MOUSE_EVENT:
    	  {
    		  M->x = M->ir.Event.MouseEvent.dwMousePosition.X;
    		  M->y = M->ir.Event.MouseEvent.dwMousePosition.Y;
    
    		  if( M->ir.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED )
    		    return 1;
    
    		  if( M->ir.Event.MouseEvent.dwButtonState & RIGHTMOST_BUTTON_PRESSED )
    		  return 2;
    	  }
    	}
    	return 0;
    }
    
    int main()
    {
    	int ret = 0;
    	struct Mouse M = {0};
    
    	if ( mouse_init( &M ) )
    		return 1;
    
    	while( (ret = mouse(&M)) != 1 && ret >= 0 )
    	{
    		// Jetzt stehen dir alle Felder von INPUT_RECORD zur Verfügung.
    		// Auch die redundanten( doppelten ) Daten in Kurzfassung:
    		printf("%d %d\r", M.x, M.y );
    	    //...
    	} 
    	return 0;
    }
    

Anmelden zum Antworten