2010-06-13 41 views
0

我在与Interops玩耍时,我想:“嘿,让我们编写访问剪贴板的东西......”然后我用Google搜索并发现了一些文章(是的,我正在用WPF - .Net 3.5)。无法获得本地或参数'hwndSource'的值,因为它在此指令指针处不可用

但是,下面的方法会产生一个错误(如标题所示)并抛出一个计算器。

private void Window_SourceInitialized(object sender, EventArgs e) 
{ 
    // Hook to Clipboard 
    base.OnSourceInitialized(e); 
    HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; 
    if (hwndSource != null) 
    { 
     installedHandle = hwndSource.Handle; 
     viewerHandle = SetClipboardViewer(installedHandle); 
     hwndSource.AddHook(new HwndSourceHook(this.hwndSourceHook)); 
    } 
    // End Hook to Clipboard 
} 

我有(真的)不知道那里发生了什么。

任何想法?

+0

#1通常意味着一个无限循环。检查你的调用栈并选择查看外部代码。尝试查看哪些操作引发了再次调用您的方法的事件。 – 2010-06-13 19:41:00

回答

3

您的问题是致电base.OnSourceInitialized。在重写方法时,应该调用基本实现,但在这里并非如此:您正在处理事件,而不是覆盖方法。

由于SourceInitialized事件是由OnSourceInitialized方法引发的,所以如果您从事件中调用OnSourceInitialized,它将再次引发该事件。所以你有一个无限递归,最终导致堆栈溢出。

所以,你有2个选项来解决这个问题:

  • 覆盖OnSourceInitialized,而不是处理SourceInitialized事件
  • 删除调用base.OnSourceInitialized
+0

谢谢,我都被Interops包裹了,没有想到这个。 – 2010-06-14 05:36:18