Maus emulieren für jedes beliebige Fenster



  • Hi

    Wie kann ich es anstellen dass ich einen Mausklick auf die STelle sagen wir 50,39(Bildschirmkoordinaten emuliere?
    Mein Programm von dem auch ich es mache läuft im Hintergrund.
    Die Nachricht soll so vervarbeitet werden wie ein normaler Mausklick allso sich auf das Fenster beziehen, dass angeklcikt wurde.

    by



  • Hol den Handle zum Fenster (welches den Klick empfangen soll). Tip: EnumWindows()

    Dann

    SendMessage(HandleZumFenster, WM_LMOUSEBUTTONUP, NULL, LPARAM Position);
    

    LPARAM Position enthält X und Y Position des Mauszeigers (ich glaube das liegt in LOWORD und HIWORD)...



  • Hi

    Das problem ist, dass ich nicht weiss welches Fenster es empfangen soll.
    Wie kann cih herausfinden, welches Fenster unter dem Mauszeiger liegt?

    by



  • HWND WindowFromPoint(POINT Point);
    

    Mehr Info siehe MSDN...



  • Hi

    Leider funkt das immer noch nicht ganz ich kann zwar jetzt das Handle auf das Fenster bekommen allerdings tuet er nie das was ich will. Der Cursor klickt immer auf die gleiche Stelle und wenn er auf ein Fenster klickt das nicht im Vordergrund ist wird das zwar Aktiv das Vordergrund Fenster verschwindet aber nicht.

    Ich habs wie in der MSDN beschrieben gemacht:
    POINT p;
    p.x = 500;
    p.y = 500;
    PostMessage(WindowFromPoint(p),WM_LBUTTONDOWN,0,MAKELPARAM(500,500));

    Was mach cih falsch?
    by



  • Hi,
    ich würde sagen, dass du in p die Mauskoordinaten reinschreiben musst!

    MFG

    Alexander Sulfrian



  • Wie wärs mit mouse_event() ? Hab da grad mal was gemacht, was auch ganz gut funktioniert:

    VOID MakeIntRel(POINT* pt)
    {
       pt->x = MulDiv(pt->x, 65535, GetSystemMetrics(SM_CXSCREEN));
       pt->y = MulDiv(pt->y, 65535, GetSystemMetrics(SM_CYSCREEN));
    }
    //---------------------------------------------------------------------------
    
    VOID ClickAtPos(POINT pt)
    {
       POINT ptSavePos;
    
       GetCursorPos(&ptSavePos);
       MakeIntRel(&ptSavePos);
       MakeIntRel(&pt);
    
       mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, pt.x, pt.y, 0, 0);
       mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
       mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    
       mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, ptSavePos.x, ptSavePos.y, 0, 0);
    }
    


  • HI

    Mit dem mouse_event() funkts super!

    by



  • 65535

    woher kommt die Zahl? Wie hast du die ermittelt?



  • kann man auch irgendwie ein klick auf den CppWebBrowser (Ein WebBrowser für BCB, ähnlich wie der IE) simulieren, ohne die maus zu bewegen? als eine art zweitmaus erstellen die auf den Browserklickt?

    J0



  • @<Neuling>: Ein Blick in die MSDN sollte genügen.

    @J0: Das kannste doch dann mit WM_LBUTTONDOWN machen. Aber vergiss nicht, auch WM_LBUTTONUP zu senden.



  • Ich habe ein problem mit dem event es kommt kein error aber de maus bewegt sich nur wenn überhaupt 1 px und es kommt das fenster welches kommt wenn man links oben in einem fenster rechtklickt



  • Um die Maus zielgenau auf dem Bildschirm hin- und herfahren zu können muß man zunächst einmal wissen das der Mauszeiger nicht pixelweise bewegt wird, sondern „mickeyweise“,eine von der Bildschirmauflösung
    unabhängige Maßeinheit. Ein Bildschirm ist für die Maus immer
    65.535 x 65.535 Mickeys groß.

    (Deswegen beweigt es sich bei dir nur so wenig oder ist ganz oben links)



  • J0,

    browser->Document->elementFromPoint(x,y)->click();
    


  • Ich hab mir mal mit der Scriptsprache "Autoit"(welche in c++ gemacht wurde) eine art zweitmaus gebastelt, die ca. so und einwandfrei funktioniert hat... dass, was jedoch nicht klappte, waren klicks auf Systemellemente, wie z.b. die Taskleiste oder den exitbutton eines fensters zu simulieren...
    funktioniert Mousevent auf den Systemellementen?


Log in to reply