Méthode PressKey de la _ classe de clavier MSVM
Simule une pression sur une touche. En cas de réussite, la clé est à l’état inactif.
Syntaxe
uint32 PressKey(
[in] uint32 keyCode
);
Paramètres
-
keyCode [ dans]
-
Type : UInt32
Code de la touche virtuelle de la touche sur laquelle appuyer. Pour obtenir la liste des codes de touche virtuelle, consultez la page codes de clé virtuelle.
Valeur retournée
Type : UInt32
Une valeur de retour de zéro indique une réussite. Une valeur différente de zéro indique un échec de modification de l’état de la clé.
-
Terminé sans erreur (0)
-
Paramètres de méthode activés-tâche démarrée (4096)
-
Échec (32768)
-
Accès refusé (32769)
-
Non pris en charge (32770)
-
État inconnu (32771)
-
Délai d’expiration (32772)
-
Paramètre non valide (32773)
-
Le système est en cours d’utilisation (32774)
-
État non valide pour cette opération (32775)
-
Type de données incorrect (32776)
-
Le système n’est pas disponible (32777)
-
Mémoire insuffisante (32778)
Remarques
La méthode PressKey mappe les références au _ menu VK (18), au _ contrôle VK (17) et à VK _ Shift (16) à VK _ LMENU (164), VK _ LCONTROL (162) et VK _ LSHIFT (160), respectivement, car le _ menu VK, le _ contrôle VK et les codes de touches virtuelles VK _ Shift ne représentent pas des clés réelles sur un clavier.
L’accès à la classe de _ clavier MSVM peut être limité par le filtrage UAC. Pour plus d’informations, consultez contrôle de compte d’utilisateur et WMI.
Exemples
L’exemple C# suivant simule une pression sur une touche. Les utilitaires référencés se trouvent dans les utilitaires courants pour les exemples de virtualisation (v2).
using System;
using System.Management;
namespace HyperVSamples
{
class PressKeyClass
{
static ManagementObject GetComputerKeyboard(ManagementObject vm)
{
ManagementObjectCollection keyboardCollection = vm.GetRelated
(
"Msvm_Keyboard",
"Msvm_SystemDevice",
null,
null,
"PartComponent",
"GroupComponent",
false,
null
);
ManagementObject keyboard = null;
foreach (ManagementObject instance in keyboardCollection)
{
keyboard = instance;
break;
}
return keyboard;
}
static void PressKey(string vmName, int keyCode)
{
ManagementScope scope = new ManagementScope(@"root\virtualization\v2", null);
ManagementObject vm = Utility.GetTargetComputer(vmName, scope);
ManagementObject keyboard = GetComputerKeyboard(vm);
ManagementBaseObject inParams = keyboard.GetMethodParameters("PressKey");
inParams["keyCode"] = keyCode;
ManagementBaseObject outParams = keyboard.InvokeMethod("PressKey", inParams, null);
if ((UInt16)outParams["ReturnValue"] == ReturnCode.Completed)
{
string.Format("Key {0} was pressed on {1}", keyCode, vm["ElementName"]);
}
else
{
string.Format("Unable to press key {0}' on {1}", keyCode, vm["ElementName"]);
}
inParams.Dispose();
outParams.Dispose();
keyboard.Dispose();
vm.Dispose();
}
static void Main(string[] args)
{
if (args != null && args.Length != 2)
{
Console.WriteLine("Usage: PressKey vmName keyCode");
return;
}
string vmName = args[0];
int keyCode = int.Parse(args[1]);
PressKey(args[0], keyCode);
}
}
}
l’exemple VBScript (Visual Basic scripting Edition) suivant simule une pression sur une touche.
option explicit
dim objWMIService
dim fileSystem
const wmiSuccessful = 0
Main()
'-----------------------------------------------------------------
' Main routine
'-----------------------------------------------------------------
Sub Main()
dim computer, objArgs, vmName, computerSystem, keycode, keyboard
set fileSystem = Wscript.CreateObject("Scripting.FileSystemObject")
computer = "."
set objWMIService = GetObject("winmgmts:\\" & computer & "\root\virtualization\v2")
set objArgs = WScript.Arguments
if WScript.Arguments.Count = 2 then
vmName= objArgs.Unnamed.Item(0)
keycode = objArgs.Unnamed.Item(1)
else
WScript.Echo "usage: cscript PressKey.vbs vmName keycode"
WScript.Quit
end if
set computerSystem = GetComputerSystem(vmName)
set keyboard = GetComputerKeyboard(computerSystem)
if PressKey(keyboard, keycode) then
WriteLog "Done"
WScript.Quit(0)
else
WriteLog "PressKey failed"
WScript.Quit(1)
end if
End Sub
'-----------------------------------------------------------------
' Retrieve Msvm_VirtualComputerSystem from base on its ElementName
'
'-----------------------------------------------------------------
Function GetComputerSystem(vmElementName)
dim query
On Error Resume Next
query = Format1("select * from Msvm_ComputerSystem where ElementName = '{0}'", vmElementName)
set GetComputerSystem = objWMIService.ExecQuery(query).ItemIndex(0)
if (Err.Number <> 0) then
WriteLog Format1("Err.Number: {0}", Err.Number)
WriteLog Format1("Err.Description:{0}",Err.Description)
WScript.Quit(1)
end if
End Function
'-----------------------------------------------------------------
' Retrieve Msvm_Keyboard from given computer system
'
'-----------------------------------------------------------------
Function GetComputerKeyboard(computerSystem)
dim query
On Error Resume Next
query = Format1("ASSOCIATORS OF {{0}} WHERE resultClass = Msvm_Keyboard", computerSystem.Path_.Path)
set GetComputerKeyboard = objWMIService.ExecQuery(query).ItemIndex(0)
if (Err.Number <> 0) then
WriteLog Format1("Err.Number: {0}", Err.Number)
WriteLog Format1("Err.Description:{0}",Err.Description)
WScript.Quit(1)
end if
End Function
'-----------------------------------------------------------------
' Press the key with the given key code on the given keyboard
'-----------------------------------------------------------------
Function PressKey(keyboard, keyCode)
WriteLog Format2("PressKey({0}, {1})", keyboard.ElementName, keyCode)
dim objInParam, objOutParams
PressKey = false
set objInParam = keyboard.Methods_("PressKey").InParameters.SpawnInstance_()
objInParam.keyCode = keyCode
set objOutParams = keyboard.ExecMethod_("PressKey", objInParam)
if objOutParams.ReturnValue = wmiSuccessful then
WriteLog Format2("The key with code '{0}' is typed on {1}.", keyCode, keyboard.ElementName)
PressKey = true
end if
End Function
'-----------------------------------------------------------------
' Create the console log files.
'-----------------------------------------------------------------
Sub WriteLog(line)
dim fileStream
set fileStream = fileSystem.OpenTextFile(".\PressKey.log", 8, true)
WScript.Echo line
fileStream.WriteLine line
fileStream.Close
End Sub
'------------------------------------------------------------------------------
' The string formatting functions to avoid string concatenation.
'------------------------------------------------------------------------------
Function Format2(myString, arg0, arg1)
Format2 = Format1(myString, arg0)
Format2 = Replace(Format2, "{1}", arg1)
End Function
'------------------------------------------------------------------------------
' The string formatting functions to avoid string concatenation.
'------------------------------------------------------------------------------
Function Format1(myString, arg0)
Format1 = Replace(myString, "{0}", arg0)
End Function
Configuration requise
| Condition requise | Valeur |
|---|---|
| Client minimal pris en charge |
Windows 8 [ applications de bureau uniquement] |
| Serveur minimal pris en charge |
Windows Server 2012 [ applications de bureau uniquement] |
| Espace de noms |
\Virtualisation racine \ v2 |
| MOF |
|
| DLL |
|