8

我正在使用以下代码:

protected override void OnSourceInitialized(EventArgs e)
{
...
....
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
...
...
}

在某些系统中,“源”值是空的,我找不到原因......

4

3 回答 3

10

我认为您可能必须等到 UI 呈现,直到您尝试分配 Hwnd。尝试将其放入 Window.Loaded 的事件处理程序中。

这发生在我之前,在代码隐藏的构造函数中调用 InitializeComponent() 之后,我进行了 Hwnd 分配。它总是返回 null,这可能是当我通过并看到 UI 尚未出现时感觉到的。我将它弹出到 _Loaded 处理程序中,瞧,UI 在到达该行之前呈现,并且突然间“this”不再为空。

于 2013-10-21T19:42:51.867 回答
8

从 .Net 4.0 开始,您HwndSource无需先显示窗口即可访问:

var helper = new WindowInteropHelper(this);
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle());
于 2017-07-06T12:54:00.637 回答
5

WumpasTamer 的回答是正确的。我只想为其他寻找“交钥匙”解决方案的人添加一个快速代码示例。如果您已经在使用 WPF,则window没有必要,但如果您正在使用 Winforms 并想使用,则PresentationSource需要使用它。

void Main()
{
    var window = new Window
    {
        Width = 0,
        Height = 0,
        WindowStyle = WindowStyle.None,
        ShowInTaskbar = false,
        ShowActivated = false
    };
    window.Loaded += a_Loaded;
    window.Show();
}

void a_Loaded(object sender, EventArgs e)
{
    var s = (Window) sender;
    var source = PresentationSource.FromVisual(s);
    //...
    s.Close();
}
于 2015-04-23T20:47:30.413 回答