2012-03-12 18 views
0

これは私が理解していないかなり基本的な概念であるようです。キーボードドライバの.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イベントの登録者にstructStrokeを変更させるにはどうすればよいですか?

次は動作しません:事前に

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; 
} 

は、あなたの加入者のコピーを与え、彼らはそれを完了したら、再度お近くの値にそれをコピーします。このような

+0

「ストローク」をヌル可能にすると、値が存在するかどうかを示すブール値を含むラッパーに実際の値が格納されます。ラップされた値は、1つの値として開始されてから値型のままです。 –

+1

さらに、@ EricJ。のコメントでは、null可能な型は、コンパイラから特別な処理を多く受ける値の型にもかかわらず、独自の値型です。 – phoog

答えて

1

何かがトリックを行うことがあります。

また、キーストロークを表す独自のクラスを作成し、それをサブスクライバに渡すことはできますか?

+0

完全に動作します、簡単な質問を申し訳ありません。 – Jason

1

KeyPressedEventArgのコンストラクタで構造体を渡すと、参照渡しされますが、ストローク変数が変更されるたびに値によって渡されます。この構造体をrefで渡し続けている場合は、そのクラスのラッパークラスを作成することをお勧めします。長期的な設計意思決定の改善。