Mausincrementer



  • Hallo Leute!!

    Ich brauche einen WinApi Befehl der Mausbewegungen abfängt.

    Damit möchte ich einen Punkt in einem Dreidimensionalen Punkt bewegen.

    Ich habe also X, Y und Z

    Bewege ich die Maus nach rechts oder link wird die X Variable entweder incrementiert (++) oder decrementiert(--).

    Bewege ich die Maus nach oben oder unten wird die Y Variable entweder incrementiert (++) oder decrementiert(--).

    Das Scrollrad soll die Z Achse dar stellen. Hier wird die Variable Z incrementiert (++) oder decrementiert(--).

    Hat jemand eine Idee wie das machbar ist?

    Gruß
    WAR][FIRE



  • schonma was von WM_MOUSEMOVE, WM_MOUSEWHEEL etc gehört



  • Ich probiers gerade damit es hapert aber bei der Anwendung 😕


  • Mod

    Was hapert?



  • Er soll mir laufend die Mauskoordinaten ausgeben. Irgendwo habe ich aber noch nen Fehler drin. Auf wParam wird ja gar nicht weiter eingegangen...

    (==> Hatte noch nicht soviel mit WinAPI zu tun)

    short zDelta;
    	WPARAM wParam = WM_MOUSEMOVE;
        LPARAM lParam;
    
    	zDelta  = (short)HIWORD(lParam);
    
    	while(true)
    	{
    	           if( (short)HIWORD(lParam)!= zDelta) {
                       std::cout << zDelta << "\n";
                       	zDelta  = (short)HIWORD(lParam);
                   }
                   //SetCursorPos(320,240); //Funktioniert
                   Sleep(400);
        }
    


  • 😃 👍



  • lol0r schrieb:

    😃 👍

    Diese Antwort ist nicht sehr hilfreich 😉



  • Du erwartest also, dass sich dir Variablen innerhalb deiner Schleife durch Zauberhand verändern?

    Du solltest auf die Nachrichten reagieren, also sobald eine kommt verarbeitest du sie und trittst wieder in die Nachrichtenschleife ein. Wenn du nicht mal weißt, wie man auf Nachrichten reagiert, solltest du doch erstmal ein WinAPI-Tutorial durcharbeiten (oder wenigstens die ersten zwei Kapitel) 😉


  • Mod

    lol0r schrieb:

    😃 👍

    Da kommt man wirklich in Versuchung sich einfach nur anzuschließen.

    @WAR][FIRE: Wie wäre es wenn Du wenigstens mit den Grundlagen der WinAPI Programmierung beginnst . Dieser Code-Schnippsel zeigt nur, dass Du so wenig Ahnung hast, dass es sich nicht mal lohnt über diesen Code zu diskutieren.
    Sorry. Just my 2 cents.



  • WM_MOUSEMOVE abzufangen ist schon mal ok, dann behandeltst du noch die Nachricht WM_MOUSEWHEEL.

    Also ein "Sleep(..)" in den Eventhandler einzubauen ist gar keine gute Idee, wenn du die Maus bewegst wird deine ganze Nachrichtenschleife für 400 Millisekunden angehalten, das ist so ganz ungünstig programmiert. Meiner Meinung nach spricht nichts dagegen die Koorinaten permanent bei jedem WM_MOUSEMOVE + WM_MOUSEWHEEL Event auszugeben.

    Achso deine while(true) Schleife wird nie verlassen, also auch total unnützt.



  • Aber wie kann man dann den laufend die Mausbewegungen abfangen?

    ich möchte fürs erste doch nur mitbekommen ob die Maus nach oben/rechts oder links bewegt wird 🙂



  • Ich denke so ungefähr sollte das für das Scrollrad dann aussehen. Könnte mir jemand sagen wie ich das benutze?

    Ich bin etwas im Zeitstress damit daher frag ich so banal 😕

    void __fastcall TAppEvent::OnMessage(MSG& Msg, bool& Handled)
    {
      if (Msg.message == WM_MOUSEWHEEL)
      {
         Msg.message = WM_KEYDOWN;
         Msg.lParam = 0;
         i = HIWORD(Msg.wParam);
    
         if (i > 0)
         {
            // Bewegung nach oben
         }
         else
         {
            // Bewegung nach unten
         }
    
         Handled = false;
      }
    }
    

    Für die Mausbewegungen X,Y habe ich es jetzt so realisiert:

    while(true)
    	{
               GetCursorPos ( &ptCursor );
               if( (ptCursor.x !=  ptCursor_temp.x) ||  (ptCursor.y !=  ptCursor_temp.y)) 
               {
                   if(ptCursor.x > ptCursor_temp.x) m_Xachse+= (ptCursor.x-ptCursor_temp.x);
                   if(ptCursor.x < ptCursor_temp.x) m_Xachse-= (ptCursor_temp.x-ptCursor.x);
    
                   if(ptCursor.y < ptCursor_temp.y) m_Yachse+= (ptCursor_temp.y-ptCursor.y);
                   if(ptCursor.y > ptCursor_temp.y) m_Yachse-= (ptCursor.y-ptCursor_temp.y);;
                   system("CLS");
                   std::cout << "X Achse: " << m_Xachse << "         Y Achse: " << m_Yachse << "";
    
                   SetCursorPos( 400, 400 ); //Funktioniert
                   GetCursorPos ( &ptCursor_temp );   
               }  
               //Sleep(100);
        }
    

    Auch nicht die feine englische ...

    Gruß
    WAR][FIRE



  • So nun mal was schon eher passendes:

    Ansatz:

    #include <cstdlib>
    #include <iostream>
    
    HWND GetConsoleHwnd(void);
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        MSG messages; 
        HWND hwnd =  GetConsoleHwnd(); 
    
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
    
            case WM_LBUTTONDOWN:
                 std::cout << "Linksklick";
                break;
    
            case WM_MOUSEWHEEL:
                 //MessageBox(hwnd,"Aktuelle Zeichenfarbe ist Weiss","lol",MB_OK);
                 std::cout << "Scrollrad";
                 return 0;
                 break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    
       HWND GetConsoleHwnd(void)
       {
           #define MY_BUFSIZE 1024 // Buffer size for console window titles.
           HWND hwndFound;         // This is what is returned to the caller.
           char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
                                               // WindowTitle.
           char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
                                               // WindowTitle.
    
           // Fetch current window title.
    
           GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
    
           // Format a "unique" NewWindowTitle.
    
           wsprintf(pszNewWindowTitle,"%d/%d",
                       GetTickCount(),
                       GetCurrentProcessId());
    
           // Change current window title.
    
           SetConsoleTitle(pszNewWindowTitle);
    
           // Ensure window title has been updated.
    
           Sleep(40);
    
           // Look for NewWindowTitle.
    
           hwndFound=FindWindow(NULL, pszNewWindowTitle);
    
           // Restore original window title.
    
           SetConsoleTitle(pszOldWindowTitle);
    
           return(hwndFound);
       }
    

    Leider werden die Messages nicht abgefangen 😕

    Es wird nur eine Message empfangen wenn ich die Fenster wechsel und dann wieder die Console in den Vordergrund hole.

    Gruß
    WAR][FIRE



  • Ich hab mal schnell einen Code zusammengezimmert schau dir den mal an:

    #include <windows.h>
    #include <stdlib.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;
    
    	const wchar_t szAppName[] = L"Maus";
    	wc.cbClsExtra         = 0;
    	wc.cbWndExtra         = 0;
    	wc.hbrBackground      = (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wc.hCursor            = LoadCursor(NULL, IDC_ARROW);
    	wc.hIcon              = NULL;
    	wc.hInstance          = hInstance;
    	wc.lpfnWndProc        = WndProc;
    	wc.lpszClassName      = szAppName;
    	wc.lpszMenuName       = 0;
    	wc.style              = CS_HREDRAW | CS_VREDRAW;
    
    	RegisterClass(&wc);//<-- Fensterklasse registrieren
    
    	hWnd = CreateWindow( //<-- Fenster erstellen
    						szAppName,
    						szAppName,
    						WS_VISIBLE|WS_SYSMENU | WS_BORDER | WS_MINIMIZEBOX |WS_CLIPCHILDREN,
    						CW_USEDEFAULT,
    						CW_USEDEFAULT,
    						500,
    						500,
    						NULL,
    						NULL,
    						hInstance,
    						NULL);
    
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int xPos;
    	int yPos;
    	int zDelta;
    	wchar_t test;
    	switch(message)
    	{
    	case WM_MOUSEMOVE://<-- Maus wurde in der Client, Area bewegt
    		{
    			xPos = LOWORD(lParam); //<--xPosition der Maus relativ zur linken oberen Ecke der Client Area
    			yPos = HIWORD(lParam); //<--yPosition der Maus relativ zur linken oberen Ecke der Client Area
    			return 0;
    		}
    	case WM_MOUSEWHEEL:
    		{
    			zDelta = GET_WHEEL_DELTA_WPARAM(wParam);//<-- Wenn positiv wurde das Rad nach vorne gedreht, wenn negativ wurde es nach hinten gedreht.(120-er Schritte)
    			MessageBox(hWnd,_itow(zDelta,&test,10),NULL,MB_YESNO);
    		}
    	}
    	return DefWindowProc(hWnd, message, wParam, lParam);
    
    }
    


  • Ja genau sowas brauch ich!!

    Jetzt brauch ich das noch für eine Console und dann passts.

    Ich wollte diese "Funktion" dann als Klasse in eine bestehende Consolenanwendung implementieren <:

    Gruß
    WAR][FIRE



  • WAR][FIRE schrieb:

    Ja genau sowas brauch ich!!

    Jetzt brauch ich das noch für eine Console und dann passts.

    Dann versuch dich mal:) Konsole ist nicht so meins.. da kann ich dir nicht helfen.



  • Ja deins ist ja schon fast des rätsels lösung. 😃

    Nur noch auf die Konsole überschreiben. Am besten wäre es wenn die Mausaktionen Fensterunabhängig sind, also über den ganzen Bildschirm die Mausaktionen abgefangen werden.

    Gruß
    WAR][FIRE



  • Hmm eine Lösung nur für die Console finde ich leider nicht, bzw. ein globales Abfangen der Maus Events.

    Weiß jemand wie ich in der Konsole ein seperates Windows Fenster erstellen kann?
    (Wie geht das denn bei Win32 Anwendungen? Das müsste sich dann ja analog auf eine Konsolenanwendung übertragen lassen!)

    Dieses Fenster hätte dann einen seperaten Message Handler indem ich die Mausbewegungen abfangen könnte.

    Gruß
    WAR][FIRE





  • FASTCALL PASCAL WINAPI schrieb:

    http://msdn.microsoft.com/en-us/library/ms648390.aspx

    Ja diesen Befehl brauch ich sobald ich ein Fenster erstellt habe.

    Mein Problem ist für die Erstellung eines Fenster in einer Konsolenanwendung ist, das ich keine HINSTANCE übergeben bekommen, wie es bei einer WinMain(..) funktion der fall ist.

    Wie bekomme ich also eine HINSTANCE ohne es übergeben zu bekommen?

    Gruß
    WAR][FIRE


Anmelden zum Antworten