Explicación sobre el uso de funciones que están en DLL del sistema operativo

A menudo se utilizan funciones en scripts de PowerShell como por ejemplo (Hacer clic en una posición de la pantalla con PowerShell):

$MouseEventSig=@'
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
 
$MouseEvent = Add-Type -memberDefinition $MouseEventSig -name "MouseEventWinApi" -passThru

[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(10,10)
$MouseEvent::mouse_event(0x00000002, 0, 0, 0, 0)
$MouseEvent::mouse_event(0x00000004, 0, 0, 0, 0)

Vemos que se usa una dll en concreto user32.dll y luego se hace referencia a la función mouse_event que sirve para tratar con el mouse.

Pongamos otro ejemplo (Escribir texto en el proceso Notepad):

$codigo='
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll")]public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
'
$notepad=Start-Process notepad -PassThru
$notepad.WaitForInputIdle()

$acciones=Add-Type -MemberDefinition $codigo -Name TextoNotepad -PassThru
#FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow)
#SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam)
$acciones::SendMessage([IntPtr]$acciones::FindWindowEx($notepad.MainWindowHandle, [IntPtr]::Zero, "Edit", $null), 0x000C, 0, "Texto")

En este caso, se usa la dll user32.dll y luego se hace referencia a las funciones FindWindowEx y SendMessage para escribir un texto en el proceso Notepad.

Aplicaciones

La información sobre el uso de las funciones se puede obtener analizando las dll con aplicaciones como por ejemplo:

Información sobre archivos DLL

Más ejemplos que ayudan a comprenderlo mejor: