Nézzünk néhány további példát a PInvoke lehetőségekre. Az első ezek között a LockWorkstation funkciót megvalósító függvény:
$code = '[DllImport("user32.dll", SetLastError = true)]
public static extern bool LockWorkStation();'
Add-Type -memberDefinition $code -name NativeMethod -namespace
Win32
function Lock-Workstation {
[Win32.NativeMethod]::LockWorkstation()
}
Ebben nem sok nehézség van, megint csak a user32.dll egyik szolgáltatását tudjuk igénybe venni immáron PowerShell segítségével is.
A következő függvény már egy kicsit összetettebb, hiszen itt paramétereket is át kell adni a SystemParametersInfo hívásakor a háttérképet beállító függvényünkben:
$code = @'
[DllImport("user32.dll")]
public static
extern uint SystemParametersInfo(
uint uiAction,
uint uiParam,
string pvParam,
uint fWinIni);
'@
Add-Type -MemberDefinition $code -Name NativeMethod2 -Namespace Win32
function Set-WallPaper {
param($picturepath)
[win32.NativeMethod2]::SystemParametersInfo(20,
0, $picturepath, 3)
}
Ez a SystemParametersInfo egyébként nagyon sok mindent tud, érdemes szétnézni a dokumentációjában, hiszen rengeteg hasznos rendszerbeállítást végezhetünk el segítségével.
A következő függvénnyel megkapjuk, hogy a gépünk érintés-vezérelt-e vagy sem:
function IsTouchCapable {
try{
[void] [user32.method]
}
catch{
$code = '[DllImport("user32.dll")]
public static extern int GetSystemMetrics(uint smIndex);'
Add-Type -MemberDefinition $code -Name Method -Namespace User32
}
!![User32.Method]::GetSystemMetrics(95)
}
Itt A GetSystemMetrics hívást használtam, ami szintén sok mindenre jó. Ebben a függvényben azt a módszert követtem, hogy belül végeztem el az Add-Type-al a típusdefiníciót, mégpedig úgy, hogy előbb ránézek egy try blokkban, hogy van-e már ilyen és ha nincs, akkor a catch-ben végrehajtom a típusdefiníciót.