ScreenToClient?



  • Hi,

    in einer Anwendung, die nicht auf dem ganzen Bildschirm angezeigt wird,
    möchte ich gerne die Mauskoordinaten ermitteln.

    Leider erhalte ich immer die Koordinaten relativ zum Desktop.
    Ich würde es aber halt nur für den Fensterbereich ermitteln wollen.

    Jetzt habe ich schon etwas gelesen und ScreenToClient gefunden.
    Leider ist mir die Verwendung nicht ganz klar.

    Hier erstmal, wie ich bislang die Pixel ermittel(nicht wundern ist ein MFC-Projekt):

    HWND hWnd=::FindWindow(NULL,"Plotter");//externes Programm "Plotter"
    HDC hdc=::GetDC(hWnd);
    POINT pt; 
    GetCursorPos(&pt); //relativ zum ganzen Desktop... :-1:
    


  • Ja, nu hast du ja schon mal das HWND des externen Fensters.

    Die MSDN http://msdn2.microsoft.com/en-us/library/aa923200.aspx sagt:

    BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);
    

    Der Aufruf wäre demnach also:

    ScreenToClient(hWnd, &pt);
    


  • Hi Sepp,

    ich habe es inzwischen auch schon gelesen, erhalte aber negative (wieder Desktop) - Koordinaten.

    Der Code ist nicht schön. Und ich bin noch in der Lernphase 🙄

    HWND hWnd=::FindWindow(NULL,"Plotter");
    HDC hdc=::GetDC(hWnd);
    
    int xpos=0;
    int ypos=0;
    
    POINT pt = { xpos, ypos }; 
    ::ScreenToClient(hWnd, &pt); 
    
    int xwert=0;
    int ywert=0;
    
    xwert=pt.x;
    ywert=pt.y;
    

    Sry für das viele MFC 😮



  • wenn du negative koordinaten erhälst, ist der mauszeiger oberhalb bzw. links von deinem client window würd ich jetzt mal spontan raten.



  • Das hat absolut nichts mit MFC zu tun und der Code den du da hast könnte genauso gut, jedes MFC freie C++ Projekt sein...



  • yogle|work schrieb:

    Das hat absolut nichts mit MFC zu tun und der Code den du da hast könnte genauso gut, jedes MFC freie C++ Projekt sein...

    unnütz++



  • Die Maus befindet sich definitiv im Fenster. Ist der Code ansich denn so richtig
    geschrieben, oder habe ich da grobe Fehler gemacht?



  • Warum setzt du xpos und ypos auf 0 statt GetCursorPos() wie ganz oben?



  • das hat doch nix mit seinem problem zu tun.



  • Der Screen-Punkt ist in seinem Code (0,0).
    Nehmen wir mal an der Client-Bereich des Fensters befindet sich an Position (13,37)

    Dann wird ScreenToClient() zurückliefern das der Screen-Punkt (0,0) den Client-Koordinaten (-13,-37) entspricht.



  • Danke euch. Geeky du hast natürlich recht. Jetzt funktioniert es 👍



  • Oh, sry für die Nachwelt die die Suchfunktion nutzt:

    HWND hWnd=::FindWindow(NULL,"Plotter");
    HDC hdc=::GetDC(hWnd);
    
    POINT pt; 
    GetCursorPos(&pt);
    
    ::ScreenToClient(hWnd, &pt); 
    
    int xwert=0; 
    int ywert=0; 
    
    xwert=pt.x; 
    ywert=pt.y;
    
    unsigned long RGB=GetPixel(hdc,xwert,ywert);
    unsigned char xxxR = GetRValue(RGB);
    unsigned char xxxG = GetGValue(RGB); 
    unsigned char xxxB = GetBValue(RGB); 
    
    CString cs_rot,cs_gruen,cs_blau;
    cs_rot.Format("%i",xxxR);
    cs_gruen.Format("%i",xxxG);
    cs_blau.Format("%i",xxxB);
    
    CString farbe;
    farbe=cs_rot;
    farbe+=",";
    farbe+=cs_gruen;
    farbe+=",";
    farbe+=cs_blau;
    
    CString xm,ym;
    
    xm.Format("%i",xwert);
    ym.Format("%i",ywert);
    
    CString koor;
    koor="x: ";
    koor+=xm;
    koor+="\n\n";
    koor+="y: ";
    koor+=ym;
    
    MessageBox(farbe,"RGB-Wert des Pixel auf dem die Maus steht!");
    MessageBox(koor,"Mauskoordinaten x,y");
    


  • Hmm sagt mal...wenn ich nun in dem Fenster mit SetCursorPos arbeiten will,
    muss ich da zwingend mit SendMessage arbeiten?

    hWnd->SendMessage(WM_???, 0, MAKELPARAM(400,563)); //welche WM nehmen?
    

  • Mod

    Plow schrieb:

    Hmm sagt mal...wenn ich nun in dem Fenster mit SetCursorPos arbeiten will,
    muss ich da zwingend mit SendMessage arbeiten?

    hWnd->SendMessage(WM_???, 0, MAKELPARAM(400,563)); //welche WM nehmen?
    

    Ich verstehe diese Frage nicht!



  • Ich meinte:

    Wie kann ich in einer fremden Anwendung die Maus auf eine bestimmte
    Koordinate des fremden Fensters setzen. Dazu habe ich ein Beispiel
    gepostet, wie ich glaube, dass es gehen würde.

    Mit SendMessage halt. Wobei mir nicht klar ist welche Message man schickt.
    WM_LBUTTONDOWN führt ja auch gleich zu einem "Klickereignis"...ich will ja
    nur bewegen. Nimmt man da sowas wie MOVE?

    *grml* Kaum hat man Auftrieb gibts vom MVP voll eins in die Fresse... 😉 😃



  • Plow schrieb:

    Wie kann ich in einer fremden Anwendung die Maus auf eine bestimmte Koordinate des fremden Fensters setzen.

    Probier es mal mit SetCursorPos ().



  • merker schrieb:

    Plow schrieb:

    Wie kann ich in einer fremden Anwendung die Maus auf eine bestimmte Koordinate des fremden Fensters setzen.

    Probier es mal mit SetCursorPos ().

    und ermittle die koordinaten mit ClientToScreen!


Anmelden zum Antworten