C# Linksklicks Simulieren?
Hallo,
Wie kann ich linksklicks in c# simulieren?
Also
Sendkeys.Send("{LButton}")
Oder sonstiges geht nicht :)
Vielen Dank im voraus!
3 Antworten
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.
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