C# Linksklicks Simulieren?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Moin,

wo willst du denn hinklicken? :o)

Generell;

   [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
   public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
   //Mouse actions
   private const int MOUSEEVENTF_LEFTDOWN = 0x02;
   private const int MOUSEEVENTF_LEFTUP = 0x04;
   private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
   private const int MOUSEEVENTF_RIGHTUP = 0x10;

   public void DoMouseClick()
   {
      //Call the imported function with the cursor's current position
      uint X = (uint)Cursor.Position.X;
      uint Y = (uint)Cursor.Position.Y;
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
   }

   //...other code needed for the application

Gerufen via DoMouseClick();

Aber je nach Lage ist einiges sinniger. Am besten bitte ausführen, was du vorhast.

Woher ich das weiß:Berufserfahrung – 💻 Zertifizierter Sr. Cloud Engineer im IT-Consulting

KACKBIENCHEN 
Fragesteller
 02.09.2021, 09:39

Vielen Dank:)

1

Mit sendkey geht das nicht.

ich habe in Batch/Powershell/C# vor längerer Zeit etwas geschrieben: https://www.gutefrage.net/frage/kann-ich-mit-einer-batch-datei-meine-maus-bewegen#answer-343025709

Ich werden jetzt nicht das ganze nach purem C# umschreiben. Als Programmierer auch (wenn in Anfängerstadium, sollten Dier die Grundlegenden Routinen ins Auge fallen.

dazu noch passend @Dultus' Codeschnippsel eine passende Hybridbatch aus meinem Fundus.

<# : batch portion
@echo off 
  rem.||(
    Bisher definierte KlickTypen:
        LClick:  Linksklick
        RClick:  Rechtsklick
        MClick:  Mittelclick
        LDClick: Linker Doppelklick
  )
  rem Position  50,30 von der linken oberen Ecke , linker Doppelklick
call :mouseClick 50 30 LDClick
  rem warte 3 sekunden
timeout 3 >nul
  rem Position  50,30 von der linken oberen Ecke , rechtsKlick
call :mouseClick 700 500 RClick
pause
exit /b


:mouseClick
powershell -noprofile "$PX=%~1;$PY=%~2;$CT='%~3'; iex (${%~f0} | out-string)"
exit /b
: end batch / begin powershell #>


Add-Type -AssemblyName System.Windows.Forms 
Add-Type -Memberdefinition '[DllImport("user32.dll")]public static extern void mouse_event(int dwFlags,int dx,int dy,int dwData,int dwExtraInfo);' -Namespace Tools -Name Mouse


$pos = new-object System.Drawing.Point $PX,$PY
[System.Windows.Forms.Cursor]::Position = $pos


switch ( $CT ) {
    'LClick'    {   [Tools.Mouse]::mouse_event(6,0,0,0,0) ; break}
    'RClick'    {   [Tools.Mouse]::mouse_event(24,0,0,0,0); break}
    'MClick'    {   [Tools.Mouse]::mouse_event(24,0,0,0,0); break}
    'LDClick'   {     #generiere linken Doppelklick 2 mal in Folge LEFTDOWN+LEFTUP mit eienem Abstand  von 10 Millisekunden
                    [Tools.Mouse]::mouse_event(6,0,0,0,0)
                    Sleep -m 10
                    [Tools.Mouse]::mouse_event(6,0,0,0,0) ; break}
}


  #https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event
  #Die Positionsparameter dx,dy,dwData,dwExtraInfo sind unerheblich für Klickevents (bleiben einfach alle 0)
  #Klickevents können addiert werden 2+4=6=Linksklick etc.
  <#    LEFTDOWN   =  2
        LEFTUP     =  4
        RIGHTDOWN  =  8
        RIGHTUP    = 16
        MIDDLEDOWN = 32
        MIDDLEUP   = 64
  #>

..sowohl das verlinkte Beispiel, wie auch obige Hybridbatch arbeiten letztlich mit .Net-Aufrufen und PInvoke .

siehe dazu auch: https://www.pinvoke.net/

Am besten gar nicht, weil das ein Blindflug ist. Wenn das Programm eine dokumentierte Schnittstelle hat, sollte man die nutzen.

Die "keys" sind die Tasten der Tastatur, nicht der Maus, also mit SendKeys geht das nicht. Aber hiermit:

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput

Woher ich das weiß:Studium / Ausbildung – Datenverarbeitungs-Kfm, Hobby- und Profi-Programmierer