La réponse acceptée utilise keybd_event
qui est obsolète. L'API officielle est maintenant SendInput
. Il y a aussi un bon emballage pour cela au http://inputsimulator.codeplex.com.
Toutefois, rien de ce qui précède ne répond entièrement au scénario de "gestion des clés". Cela est dû au fait que le fait de maintenir une touche génère plusieurs messages WM_KEYDOWN
, suivis d'un seul message WM_KEYUP
lors de la libération (vous pouvez vérifier ceci avec Spy ++).
La fréquence des messages WM_KEYDOWN
dépend du matériel, des paramètres du BIOS et de quelques paramètres Windows: KeyboardDelay
et KeyboardSpeed
. Ces derniers sont accessibles à partir de Windows Forms (SystemInformation.KeyboardDelay
, SystemInformation.KeyboardSpeed
). En utilisant la bibliothèque Input Simulator mentionnée ci-dessus, j'ai implémenté une méthode de maintien de clé qui imite le comportement réel. C'est await/async
prêt, et prend en charge l'annulation.
static Task SimulateKeyHold(VirtualKeyCode key, int holdDurationMs,
int repeatDelayMs, int repeatRateMs, CancellationToken token)
{
var tcs = new TaskCompletionSource<object>();
var ctr = new CancellationTokenRegistration();
var startCount = Environment.TickCount;
Timer timer = null;
timer = new Timer(s =>
{
lock (timer)
{
if (Environment.TickCount - startCount <= holdDurationMs)
InputSimulator.SimulateKeyDown(key);
else if (startCount != -1)
{
startCount = -1;
timer.Dispose();
ctr.Dispose();
InputSimulator.SimulateKeyUp(key);
tcs.TrySetResult(null);
}
}
});
timer.Change(repeatDelayMs, repeatRateMs);
if (token.CanBeCanceled)
ctr = token.Register(() =>
{
timer.Dispose();
tcs.TrySetCanceled();
});
return tcs.Task;
}
Nice! Travaillé bien pour moi. Merci beaucoup ! – Larry