Это, кажется, довольно простая концепция, которую я не понимаю.
При написании оболочки .NET для драйвера клавиатуры я транслирую событие для каждой нажатой клавиши, вот так (упрощеннокод ниже):
// The event handler applications can subscribe to on each key press
public event EventHandler<KeyPressedEventArgs> OnKeyPressed;
// I believe this is the only instance that exists, and we just keep passing this around
Stroke stroke = new Stroke();
private void DriverCallback(ref Stroke stroke...)
{
if (OnKeyPressed != null)
{
// Give the subscriber a chance to process/modify the keystroke
OnKeyPressed(this, new KeyPressedEventArgs(ref stroke) );
}
// Forward the keystroke to the OS
InterceptionDriver.Send(context, device, ref stroke, 1);
}
Ход - это struct
, который содержит код сканирования для нажатой клавиши и состояние.
В вышеприведенном коде, поскольку я передаю структуру типа значения по ссылке, любые изменения, внесенные в структуру, будут «запоминаться» при передаче в ОС (так что нажатые клавиши могут быть перехвачены и изменены).Так что все в порядке.
Но как мне разрешить подписчикам моего OnKeyPressed
события изменять struct
Stroke
?
Следующее не работает:
public class KeyPressedEventArgs : EventArgs
{
// I thought making it a nullable type might also make it a reference type..?
public Stroke? stroke;
public KeyPressedEventArgs(ref Stroke stroke)
{
this.stroke = stroke;
}
}
// Other application modifying the keystroke
void interceptor_OnKeyPressed(object sender, KeyPressedEventArgs e)
{
if (e.stroke.Value.Key.Code == 0x3f) // if pressed key is F5
{
// Doesn't really modify the struct I want because it's a value-type copy?
e.stroke.Value.Key.Code = 0x3c; // change the key to F2
}
}
Заранее спасибо.