Mausklick simulieren



  • Hi,

    ich will einen Mausklick in einem anderen Programm simulieren.
    Das Problem dabei ist, dass es auf
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    sowie
    PostMessage(hWindow,WM_LBUTTONDOWN ,0,0);
    nicht reagiert.
    Vielleicht liegt das Problem daran, dass das Programm DirectX benutzt.
    Kann mir jemand helfen, wie ich dennoch einen Mausklick simuliere?



  • hast du es schon mal mit SendInput versucht?



  • Jetzt schon:

    int xPos = 1000; 
        int yPos = 420; 
    int screenSizeX = GetSystemMetrics(SM_CXSCREEN); 
    int screenSizeY = GetSystemMetrics(SM_CYSCREEN); 
    INPUT in; 
    Sleep(3000);
    ZeroMemory(&in, sizeof(in)); 
    in.type = INPUT_MOUSE; 
    in.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP; 
    in.mi.dx = 0x10000*xPos/screenSizeX; 
    in.mi.dy = 0x10000*yPos/screenSizeY; 
    SendInput(1, &in, sizeof(INPUT));
    

    Die Maus wird zwar bewegt (wie bei SetCursorPos() auch), aber der Mausklick bleibt leider aus.
    Gibt es da nicht noch eine Möglichkeit?
    Oder kann man den schon auf Treiberebene einsetzen (das wäre vermutl optimal, oder?)



  • Du kannst per per SendInput nur EINEN Event senden, also MMOUSEEVENTF_MOVE oder MOUSEEVENTF_LEFTDOWN oder MOUSEEVENTF_LEFTUP und nicht alles gleichzeitig 😉



  • Ich hab folgende Funktion erfolgreich in Verwendung, dabei wird auch geprüft ob das System auf "linke" oder "rechte" Hand eingestellt ist :

    void VirtualMouseClick(int iXPos, int iYPos)
    {
        CPoint poPos;
        GetCursorPos(& poPos);
        SetCursorPos(iXPos, iYPos);
        if (GetSystemMetrics(SM_SWAPBUTTON)) {
            mouse_event (MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
            mouse_event (MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
        }
        else {
            mouse_event (MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
            mouse_event (MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        }
    
        SetCursorPos(poPos.x, poPos.y);
    }
    

    Ob dies in Deinem speziellen Fall funktioniert kann ich nicht sagen, aber evtl. ist es einen Versuch wert, ich simuliere damit ein Klick in einem ActiveX Element dass im IE eingebettet ist und da gehts..

    Grüße
    Marcus



  • An Conan:
    Natürlich kann man mehrere Flags senden (belegen hier ja jede ein anderes Bit).
    Und es funktioniert mit dem Klicken ja auch - nur nicht in dem Programm in dem ich es brauche.
    Aber nur um es auszuschliesen hab ich es trotzdem getestet -> Fehlschlag.

    An UserMarkus:
    Das Programm reagiert nicht auf mouse_event.
    Dennoch habe ich deine Funktion ausprobiert, aber wie erwartet zeigte sie keine Wirkung.

    Btw: Es handelt sich hierbei um WC3, falls es einer kennt.
    Ich vermute einfach, dass es aus Performancegründen die Mausevents auf einer höheren Ebene schon hooked.
    Aber wie kann ich dort welche einschreiben?



  • Verfolge mal die ersten Treffer beim Gogel mit den Stichworten "directinput hook" evtl. hilft Dir das weiter ..

    Gruß
    Marcus



  • Ich hab das Problem gelöst:
    Der Button den ich zum testen benutzt habe, hat eine gewisse "aktivierungszeit" benötigt.
    Das heist mit SetCursorPos() -> Sleep() -> mouse_event() gings.
    Danke alle für die Hilfe.

    Mfg.



  • den thread erwecke ich doch glatt mal zum leben bevor ich einen neuen eröffne 🙂

    hab folgendes problem:

    hab mit autoit folgendes "programmiert":

    While 1
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",100,62,1)
    sleep(2000)
    MouseClick("left",420,360,1)
    MouseClick("left",470,560,1)
    MouseClick("left",420,560,1)
    MouseClick("left",420,590,1)
    MouseClick("left",420,635,1)
    MouseClick("left",470,620,1)
    MouseClick("left",520,620,1)
    MouseClick("left",570,620,1)
    WEnd

    Aber die Klicks nach dem letzten sleep müssen viel schneller ausgeführt werden und da hab ich gelesen dass das mit C++ der Fall sein soll !?
    Jetzt meine Frage, kann mir das irgendwer als Endlosschleife schnell ins C++ umschreiben ? Weil falls man es nicht merkt, ich bin in der Hinsicht n totaler Anfänger 😞

    Sollte das dann in etwa so irgendwie aussehn:

    while(1)
    {
    mouse_event(MOUSEEVENTF_LEFTDOWN,100,62,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,100,62,0,0);
    sleep(2000);

    usw. !?

    return 0;
    }

    Danke schonmal für die hilfe !



  • keiner der mir helfen kann !?


Anmelden zum Antworten