Senden eines Mausklick-Ereignisses in PowerShell

Senden eines Mausklick-Ereignisses in PowerShell

Bei der Verwendung von Windows PowerShell treten ungewöhnliche Anforderungen auf, denen wir bei der Entwicklung eines Skripts für eine Organisation oder einen Kunden begegnen können oder auch nicht, und ein Beispiel dafür ist das Aufzeichnen und Senden von Tastenanschlägen. Es ist für PowerShell ungeeignet, Tastenanschläge zu verarbeiten, da die Funktion so weit geht wie die Skriptbibliothek, aber es ist möglich, sie trotz ihrer Einschränkungen in PowerShell auszuführen.

Da es sich um ein komplexes Thema handelt, konzentrieren wir uns in diesem Artikel mehr auf das Erstellen und Erstellen der Send-Eingabestruktur und den Aufruf der Send-Mausklick-Klasse in unserem Skript.

Verwenden der Mausereignisfunktion in PowerShell

Die Mausereignisfunktion mouse_event() ist von der Win32-API winuser.h abgeleitet, die eine API des Microsoft Developer Network (MSDN) speziell von der winuser.h-API aufruft. Die API wurde entwickelt, um eine externe API aufzurufen, die Mausereignisse verarbeitet, einschließlich Mausklicks.

Lassen Sie uns unsere $cSource-Variable vorbereiten, um unsere INPUT-Struktur einzurichten und alle Bibliotheken importieren, die wir zum Senden eines Mausereignisses benötigen.

$cSource = @'

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class Clicker{
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
    public int 0;
    public MOUSEINPUT mi;
}

//continued on the following script block

Wir haben unsere INPUT-Struktur deklariert, die wir verwenden und eine Unterstruktur namens MOUSEINPUT-Struktur nennen können. Denken Sie daran, dass sich das folgende Snippet noch in der Klasse Clicker befindet.

[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
    public int    dx ;
    public int    dy ;
    public int    mouseData ;
    public int    dwFlags;
    public int    time;
    public IntPtr dwExtraInfo;
}

In einigen Fällen wird es fortgeschrittene Mäuse geben, die zusätzliche Tasten haben, aber da wir uns vorerst nur auf den linken Mausklick konzentrieren, können wir die häufig verwendeten Konstanten unten deklarieren. Beachten Sie, dass wir auch eine Konstante für die Bildschirmlänge Ihres Monitors deklariert haben.

const int MOUSEEVENTF_MOVED      = 0x0001 ;
const int MOUSEEVENTF_LEFTDOWN   = 0x0002 ;
const int MOUSEEVENTF_LEFTUP     = 0x0004 ;
const int MOUSEEVENTF_RIGHTDOWN  = 0x0008 ;
const int MOUSEEVENTF_RIGHTUP    = 0x0010 ;
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ;
const int MOUSEEVENTF_MIDDLEUP   = 0x0040 ;
const int MOUSEEVENTF_WHEEL      = 0x0080 ;
const int MOUSEEVENTF_XDOWN      = 0x0100 ;
const int MOUSEEVENTF_XUP        = 0x0200 ;
const int MOUSEEVENTF_ABSOLUTE   = 0x8000 ;

const int screen_length = 0x10000 ;

Jetzt können wir eine Funktion erstellen, die speziell ein Linksklick-Ereignis auf dem Bildschirm sendet. Die Funktion akzeptiert zwei Argumente, die den Ort auf dem Monitor bestimmen, an dem das Linksklick-Ereignis stattfindet.

[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

public static void LeftClickAtPoint(int x, int y)
{
    //Move the mouse
    INPUT[] input = new INPUT[3];
    input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);
    input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);
    input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;
    //Left mouse button down
    input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    //Left mouse button up
    input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(3, input, Marshal.SizeOf(input[0]));
}
} # Close the Clicker Class
'@ #Close the $cSource variable

Um unsere Linksklick-Funktion aufzurufen, müssen wir die Bibliothek unter dem Cmdlet Add-Type assemblieren. Nach der Deklaration können wir nun unsere benutzerdefinierte Klasse [Clicker]::LeftClickAtPoint(x,y) aufrufen, um ein Linksklick-Mausereignis auf dem Bildschirm zu senden.

Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Windows.Forms,System.Drawing
[Clicker]::LeftClickAtPoint(300,300)

Vollständiges Skript:

$scSource = @'
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class Clicker
{
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
    public int        type; // 0 = INPUT_MOUSE,
                            // 1 = INPUT_KEYBOARD
                            // 2 = INPUT_HARDWARE
    public MOUSEINPUT mi;
}

[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
    public int    dx ;
    public int    dy ;
    public int    mouseData ;
    public int    dwFlags;
    public int    time;
    public IntPtr dwExtraInfo;
}

const int MOUSEEVENTF_MOVED      = 0x0001 ;
const int MOUSEEVENTF_LEFTDOWN   = 0x0002 ;
const int MOUSEEVENTF_LEFTUP     = 0x0004 ;
const int MOUSEEVENTF_RIGHTDOWN  = 0x0008 ;
const int MOUSEEVENTF_RIGHTUP    = 0x0010 ;
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ;
const int MOUSEEVENTF_MIDDLEUP   = 0x0040 ;
const int MOUSEEVENTF_WHEEL      = 0x0080 ;
const int MOUSEEVENTF_XDOWN      = 0x0100 ;
const int MOUSEEVENTF_XUP        = 0x0200 ;
const int MOUSEEVENTF_ABSOLUTE   = 0x8000 ;

const int screen_length = 0x10000 ;

[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

public static void LeftClickAtPoint(int x, int y)
{

    INPUT[] input = new INPUT[3];
    input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);
    input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);
    input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;
    input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(3, input, Marshal.SizeOf(input[0]));
}
}
'@
Add-Type -TypeDefinition $scSource -ReferencedAssemblies System.Windows.Forms,System.Drawing
[Clicker]::LeftClickAtPoint(300,300)
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn