これは私が理解していないかなり基本的な概念であるようです。キーボードドライバの.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
あります押されたキー、および状態を含む。
上記のコードでは、値型構造体を参照渡ししているため、構造体に加えられた変更はOSに渡されるときに「記憶」されるため、押されたキーが傍受され変更される可能性があります。だからそれはいいです。
しかし、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
}
}
感謝を。
if (OnKeyPressed != null)
{
// Give the subscriber a chance to process/modify the keystroke
var args = new KeyPressedEventArgs(stroke);
OnKeyPressed(this, args);
stroke = args.Stroke;
}
は、あなたの加入者のコピーを与え、彼らはそれを完了したら、再度お近くの値にそれをコピーします。このような
「ストローク」をヌル可能にすると、値が存在するかどうかを示すブール値を含むラッパーに実際の値が格納されます。ラップされた値は、1つの値として開始されてから値型のままです。 –
さらに、@ EricJ。のコメントでは、null可能な型は、コンパイラから特別な処理を多く受ける値の型にもかかわらず、独自の値型です。 – phoog